取不到中文注释字段的时候,可以试试下面的方法
下面的配置均指的是Mybatis Generator 的配置文件(一般是叫generatorConfig.xml)的配置:
mysql
方法1:
<jdbcConnection driverClass="${driver}" connectionURL="{url}" userId="${username}" password="${password}"> <!-- 针对mysql数据库 --> <property name="useInformationSchema" value="true"></property> </jdbcConnection>
方法2
connectionURL="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&useInformationSchema=true"
Oracle
<jdbcConnection driverClass="${driver}" connectionURL="{url}" userId="${username}" password="${password}"> <!-- 针对oracle数据库 --> <property name="remarksReporting" value="true"></property> </jdbcConnection>
详解
MBG访问数据库也是通过JDBC进行,而通过JDBC连接Oracle、Mysql(其它数据库暂不清楚)时,想获取到表及字段注释是需要额外设置一些连接属性的.一般大体上都是如下的代码(以Oracle为例):
我们先来看下MBG连接数据库的代码,可以在org.mybatis.generator.internal.JDBCConnectionFactory中找到:
public JDBCConnectionFactory(JDBCConnectionConfiguration config) { super(); userId = config.getUserId(); password = config.getPassword(); connectionURL = config.getConnectionURL(); driverClass = config.getDriverClass(); otherProperties = config.getProperties(); //注意此行 } public Connection getConnection() throws SQLException { Driver driver = getDriver(); Properties props = new Properties(); if (stringHasValue(userId)) { props.setProperty("user", userId); //$NON-NLS-1$ } if (stringHasValue(password)) { props.setProperty("password", password); //$NON-NLS-1$ } props.putAll(otherProperties); //注意此行 Connection conn = driver.connect(connectionURL, props); if (conn == null) { throw new SQLException(getString("RuntimeError.7")); //$NON-NLS-1$ } return conn; }
通过上面代码(尤其是我加了注意此行注释的两行代码)我们可以看到,MBG在建立连接时,是把JDBCConnectionConfiguration中的所有properties给设置进去了.那么显然我们只需要找到在哪配置这些properties就行了.
JDBCConnectionConfiguration对应到XML配置里就是jdbcConnection节点.
再来看看官方的使用文档,官方文档关于jdbcConnection (点击查看) 一节中 <property>子元素的说明:
- <property> (0..N) Note: any properties specified here will be added to the properties of the JDBC driver.
那么在配置文件中我们如下改动即可:
<jdbcConnection driverClass="${driver}" connectionURL="{url}" userId="${username}" password="${password}"> <!-- 针对oracle数据库 --> <property name="remarksReporting" value="true"></property> </jdbcConnection>
由于MyBatis Generator自带了生成注释的功能,但是,是英文的而且生成的根本无法理解,所以可以通过,修改他的源码来实现生成中文的注释,具体方式有以下几种:
1) 自定义CommentGenerator
2) 修改源码
3) PluginAdapter插件的形式
这个例子通过自定义CommentGenerator来实现。
1.创建maven工程,修改pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <groupId>com.wm.platform</groupId> <version>0.0.1</version> <modelVersion>4.0.0</modelVersion> <artifactId>wm-generator</artifactId> <properties> <!-- 依赖版本 --> <mapper.version>3.3.9</mapper.version> </properties> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper</artifactId> <version>${mapper.version}</version> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.4.0</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.4.0</version> <configuration> <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile> <overwrite>true</overwrite> <verbose>true</verbose> </configuration> <executions> <execution> <id>Generate MyBatis Artifacts</id> <!--打包阶段不执行,如果不配置绑定的是在package生命周期执行--> <phase>deploy</phase> <goals> <goal>generate</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper</artifactId> <version>${mapper.version}</version> </dependency> <dependency> <groupId>com.wm.platform</groupId> <artifactId>wm-generator</artifactId> <version>0.0.1</version> </dependency> </dependencies> </plugin> </plugins> </build> </project>
在java目录里面增加自定义注解类Annotations.java
public enum Annotations { DATA("data", "@Data", "lombok.Data"), BUILDER("builder", "@Builder", "lombok.Builder"), ALL_ARGS_CONSTRUCTOR("allArgsConstructor", "@AllArgsConstructor", "lombok.AllArgsConstructor"), NO_ARGS_CONSTRUCTOR("noArgsConstructor", "@NoArgsConstructor", "lombok.NoArgsConstructor"), ACCESSORS("accessors", "@Accessors", "lombok.experimental.Accessors"), TO_STRING("toString", "@ToString", "lombok.ToString"); private final String paramName; private final String name; public final FullyQualifiedJavaType javaType; private final List<String> options; Annotations(String paramName, String name, String className) { this.paramName = paramName; this.name = name; this.javaType = new FullyQualifiedJavaType(className); this.options = new ArrayList<String>(); } public static Annotations getValueOf(String paramName) { for (Annotations annotation : Annotations.values()) { if (String.CASE_INSENSITIVE_ORDER.compare(paramName, annotation.paramName) == 0) { return annotation; } } return null; } public static Collection<Annotations> getDependencies(Annotations annotation) { if (annotation == ALL_ARGS_CONSTRUCTOR) { return Collections.singleton(NO_ARGS_CONSTRUCTOR); } else { return Collections.emptyList(); } } private static String quote(String value) { if (Boolean.TRUE.toString().equals(value) || Boolean.FALSE.toString().equals(value)) { // case of boolean, not passed as an array. return value; } return value.replaceAll("[\\w]+", "\"$0\""); } public void appendOptions(String key, String value) { String keyPart = key.substring(key.indexOf(".") + 1); String valuePart = value.contains(",") ? String.format("{%s}", value) : value; this.options.add(String.format("%s=%s", keyPart, quote(valuePart))); } public String asAnnotation() { if (options.isEmpty()) { return name; } StringBuilder sb = new StringBuilder(); sb.append(name); sb.append("("); boolean first = true; for (String option : options) { if (first) { first = false; } else { sb.append(", "); } sb.append(option); } sb.append(")"); return sb.toString(); } }
实现类EmptyCommentGenerator.java
public class EmptyCommentGenerator implements CommentGenerator { @Override public void addConfigurationProperties(Properties properties) { } @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { } @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable) { } @Override public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { } @Override public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) { } @Override public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean b) { } @Override public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) { } @Override public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { } @Override public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { } @Override public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) { } @Override public void addJavaFileComment(CompilationUnit compilationUnit) { } @Override public void addComment(XmlElement xmlElement) { } @Override public void addRootComment(XmlElement xmlElement) { } @Override public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) { } @Override public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) { } @Override public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) { } @Override public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) { } @Override public void addClassAnnotation(InnerClass innerClass, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) { } }
类MyCommentGenerator.java
public class MyCommentGenerator extends EmptyCommentGenerator { private final Collection<Annotations> annotations; private String author; /** * 当前时间 */ private String currentDateStr; public MyCommentGenerator() { currentDateStr = (new SimpleDateFormat("yyyy-MM-dd")).format(new Date()); annotations = new LinkedHashSet<>(Annotations.values().length); } @Override public void addConfigurationProperties(Properties properties) { // annotations.add(Annotations.DATA); for (String stringPropertyName : properties.stringPropertyNames()) { if (stringPropertyName.contains(".")) { continue; } if (!Boolean.parseBoolean(properties.getProperty(stringPropertyName))) { continue; } Annotations annotation = Annotations.getValueOf(stringPropertyName); if (annotation == null) { continue; } String optionsPrefix = stringPropertyName + "."; for (String propertyName : properties.stringPropertyNames()) { if (!propertyName.startsWith(optionsPrefix)) { continue; } String propertyValue = properties.getProperty(propertyName); annotation.appendOptions(propertyName, propertyValue); annotations.add(annotation); annotations.addAll(Annotations.getDependencies(annotation)); } annotations.add(annotation); } author = properties.getProperty("author"); } @Override public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { String remarks = introspectedTable.getRemarks(); topLevelClass.addJavaDocLine("/**"); topLevelClass.addJavaDocLine(" * " + remarks); topLevelClass.addJavaDocLine(" * "); topLevelClass.addJavaDocLine(" * @author " + author); topLevelClass.addJavaDocLine(" * @date " + currentDateStr); topLevelClass.addJavaDocLine(" */"); addClassAnnotation(topLevelClass); } private void addClassAnnotation(TopLevelClass topLevelClass) { for (Annotations annotation : annotations) { topLevelClass.addImportedType(annotation.javaType); topLevelClass.addAnnotation(annotation.asAnnotation()); } } @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { String remarks = introspectedColumn.getRemarks(); field.addJavaDocLine("/**"); field.addJavaDocLine(" * " + remarks); field.addJavaDocLine(" */"); } }
在resources目录下面增加文件config.properties,generatorConfig.xml。
config.properties的内容:
jdbc.driverClass=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://192.168.110.110:3306/wmsoft?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai jdbc.user=root jdbc.password=123456 mapper.plugin=tk.mybatis.mapper.generator.MapperPlugin mapper.Mapper=tk.mybatis.mapper.common.Mapper mapper.forceAnnotation=true targetModelPackage=com.wm.platform.system.core.domain targetXMLPackage=com.wm.platform.system.core.mapper.xml targetMapperPackage=com.wm.platform.system.core.mapper targetJavaProject=E:/code/wm-generator/src/main/java targetResourcesProject=E:/code/wm-generator/src/main/java
generatorConfig.xml内容:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <properties resource="config.properties"/> <context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat"> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <!--支持序列化--> <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin> <!--防止xml重复生成--> <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" /> <!-- <commentGenerator>--> <!-- <!– 是否去除自动生成的注释 true:是 : false:否 –>--> <!-- <property name="suppressAllComments" value="false"/>--> <!-- <property name="addRemarkComments" value="true"/>--> <!-- </commentGenerator>--> <commentGenerator type="com.MyCommentGenerator"> <property name="author" value="mx"/> <property name="allArgsConstructor" value="false"/> <property name="noArgsConstructor" value="false"/> <property name="toString" value="false"/> <property name="builder.toBuilder" value="false"/> <property name="data" value="false"/> <property name="builder" value="false"/> </commentGenerator> <jdbcConnection driverClass="${jdbc.driverClass}" connectionURL="${jdbc.url}" userId="${jdbc.user}" password="${jdbc.password}"> <!-- 设置 useInformationSchema 属性为 true,才能获取到表注释 --> <property name="useInformationSchema" value="true"/> <!-- 判断其它表有同样名称表格的情况 --> <property name="nullCatalogMeansCurrent" value="true"/> </jdbcConnection> <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl"> <property name="useJSR310Types" value="true"/> </javaTypeResolver> <javaModelGenerator targetPackage="${targetModelPackage}" targetProject="${targetJavaProject}"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true"/> </javaModelGenerator> <sqlMapGenerator targetPackage="${targetXMLPackage}" targetProject="${targetResourcesProject}"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <javaClientGenerator targetPackage="${targetMapperPackage}" targetProject="${targetResourcesProject}" type="XMLMAPPER"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> </javaClientGenerator> <!--全部表参与逆向工程--> <!--以下example为false,表示不会生成example类,否则将自动生成example类--> <!-- <table schema="" tableName="%"></table>--> <table catalog="" tableName="sys_employee"> </table> <!--指定某些表参与逆向工程--> <!--<table tableName="user"--> <!--enableCountByExample="false"--> <!--enableUpdateByExample="false"--> <!--enableDeleteByExample="false"--> <!--enableSelectByExample="false"--> <!--selectByExampleQueryId="false">--> <!--</table>--> </context> </generatorConfiguration>
创建完相关文件后的目录为:
生成方式一
新建生成文件的类StartUp.java
public class StartUp { /** * 官方文档地址:http://mybatis.org/generator/index.html */ public static void main(String[] args) { try { List<String> warnings = new ArrayList<>(); ClassLoader classloader = Thread.currentThread().getContextClassLoader(); InputStream is = classloader.getResourceAsStream("generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(is); DefaultShellCallback callback = new DefaultShellCallback(true); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (InvalidConfigurationException e) { e.printStackTrace(); } catch (XMLParserException e) { e.printStackTrace(); } } }
执行main方法就可以生成文件了。
如果需要让生成的实体和mapper继承其它对象和接口可以设置
<javaModelGenerator targetPackage="${targetModelPackage}" targetProject="${targetJavaProject}"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true"/> <property name="rootClass" value="com.XXX.BaseEntity"/> </javaModelGenerator> <javaClientGenerator targetPackage="${targetMapperPackage}" targetProject="${targetJavaProject}" type="XMLMAPPER"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="true"/> <property name="rootInterface" value="com.XXX.BaseMapper"/> </javaClientGenerator>
如果还想自定义生成实体和mapper里面的内容,可以参考 让MyBatis Generator产生的Mapper更简洁
生成方式二
先安装maven项目,然后在配置文成通过执行maven插件执行程序生成文件
执行后生成的目录路径为:
在生成的实体文件中就有中文注释了:
生成方式三
使用IDEA的插件MyBatisCodeHelper等,也可以生成