背景:
日常開發中,如果新建表,手動敲寫model、dao和對應的mapper.xml文件,費時費力且容易出錯,
所以采用mybatis自動生成model、dao及對應的mapper.xml文件。代碼注釋風格采用自定義注釋。
環境:
jdk1.8,maven,mysql
項目結構:
mbg-comment:自定義注釋
pom文件:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.lw</groupId> <artifactId>mbg-comment</artifactId> <version>0.0.1-SNAPSHOT</version> <name>mbg-comment</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <mybatis.generator.version>1.4.0</mybatis.generator.version> </properties> <dependencies> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>${mybatis.generator.version}</version> </dependency> </dependencies> </project>
如果要實現自定義注釋功能,需要實現CommentGenerator接口;
我采用的是,創建EmptyCommentGenerator抽象類實現CommentGenerator接口,創建MyCommentGenerator繼承EmptyCommentGenerator抽象類;
EmptyCommentGenerator抽象類重寫CommentGenerator接口中所有的方法即可;
MyCommentGenerator類代碼,將需要具體實現的方法重寫邏輯即可;

package com.lw.mbgcomment.comment; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.dom.java.Field; import org.mybatis.generator.api.dom.java.TopLevelClass; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; /** * @Classname MySQLCommentGenerator * @Description 自定義注釋 * @Date 2019/12/6 13:32 * @Author lw */ public class MyCommentGenerator extends EmptyCommentGenerator { private Properties properties; public MyCommentGenerator() { properties = new Properties(); } /** * 添加配置屬性 * * @param properties */ @Override public void addConfigurationProperties(Properties properties) { this.properties.putAll(properties); } /** * 模型類注釋 * * @param topLevelClass * @param introspectedTable */ @Override public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { String author = properties.getProperty("author"); String dateFormat = properties.getProperty("dateFormat", "yyyy-MM-dd"); SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormat); // 獲取表注釋 String remarks = introspectedTable.getRemarks(); // 組裝注釋模板 topLevelClass.addJavaDocLine("/**"); topLevelClass.addJavaDocLine(" * " + remarks + "實體類"); topLevelClass.addJavaDocLine(" *"); topLevelClass.addJavaDocLine(" * @author " + author); topLevelClass.addJavaDocLine(" * @date " + dateFormatter.format(new Date())); topLevelClass.addJavaDocLine(" */"); } /** * 字段注釋 * * @param field * @param introspectedTable * @param introspectedColumn */ @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { // 獲取列注釋 String remarks = introspectedColumn.getRemarks(); // 組裝注釋模板 field.addJavaDocLine("/** " + remarks + " */"); } }
mbg-service:代碼生成
pom文件:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.lw</groupId> <artifactId>mbg-service</artifactId> <version>0.0.1-SNAPSHOT</version> <name>mbg-service</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <mybatis.generator.version>1.4.0</mybatis.generator.version> <mysql.connector.version>5.1.40</mysql.connector.version> </properties> <dependencies> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>${mybatis.generator.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.connector.version}</version> </dependency> <!-- 通過java代碼GeneratorClient運行main方法時,將此依賴放開; 不然會找不到自定義注釋類,要求classpath保持一致;--> <dependency> <groupId>com.lw</groupId> <artifactId>mbg-comment</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>${mybatis.generator.version}</version> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.connector.version}</version> </dependency> <dependency> <groupId>com.lw</groupId> <artifactId>mbg-comment</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> <executions> <execution> <id>Generate MyBatis Artifacts</id> <phase>package</phase> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <!--允許移動生成的文件 --> <verbose>true</verbose> <!-- 是否覆蓋 --> <overwrite>true</overwrite> <!-- 自動生成的配置文件 --> <configurationFile>src/main/resources/generatorConfig.xml</configurationFile> </configuration> </plugin> </plugins> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>*.properties</include> <include>*.xml</include> </includes> <excludes> <exclude>generatorConfig-template.xml</exclude> </excludes> <filtering>false</filtering> </resource> </resources> </build> </project>
生成代碼配置文件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="jdbc.properties"/> <!-- 環境信息 --> <context id="myMbg" targetRuntime="MyBatis3Simple" defaultModelType="flat"> <!-- 生成的Java文件的編碼 --> <property name="javaFileEncoding" value="UTF-8"/> <!-- 格式化java代碼 --> <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/> <!-- 格式化XML代碼 --> <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/> <!-- 標記數據庫對象名的符號,MYSQL默認是`反引號 --> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <!-- 自定義注釋生成器 --> <commentGenerator type="com.lw.mbgcomment.comment.MyCommentGenerator"> <property name="author" value="lw"/> <property name="dateFormat" value="yyyy/MM/dd HH:mm:ss"/> </commentGenerator> <!-- jdbc配置 --> <jdbcConnection driverClass="${jdbc_driver}" connectionURL="${jdbc_url}" userId="${jdbc_username}" password="${jdbc_password}"> <property name="useInformationSchema" value="true" /> </jdbcConnection> <!-- java類型處理 --> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 生成Entity類存放位置 --> <!-- 注意:通過java代碼GeneratorClient運行main方法時,targetProject="mbg-service/src/main/java" --> <javaModelGenerator targetPackage="com.lw.mbgservice.entity" targetProject="src/main/java"> <!-- 是否允許建立子包(對應MySql的scheme),默認為false --> <property name="enableSubPackages" value="true"/> <!-- 設置是否在getter方法中,對String類型字段調用trim()方法 --> <property name="trimStrings" value="false"/> </javaModelGenerator> <!-- 生成映射文件存放位置 --> <!-- 注意:通過java代碼GeneratorClient運行main方法時,targetProject="mbg-service/src/main/java" --> <sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 生成Dao類存放位置 --> <!-- 注意:通過java代碼GeneratorClient運行main方法時,targetProject="mbg-service/src/main/java" --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.lw.mbgservice.dao" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- 設置數據庫的表名和實體類名 --> <table tableName="c_bankcard_agreement" domainObjectName="BankcardAgreementEntity"/> <table tableName="b_phone_white_pro" domainObjectName="PhoneWhitePro"/> </context> </generatorConfiguration>
注意:type是自定義注釋類
代碼生成方式,講述兩種(java代碼運行和mvn插件):
1.mvn插件
打開maven窗口,mbg-service服務Plugins目錄,雙擊mybatis-generator:generate即可
2.java代碼運行

package com.lw.mbgservice.client; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; import java.io.InputStream; import java.util.ArrayList; import java.util.List; /** * @Classname GeneratorClient * @Description 代碼生成客戶端 * @Date 2019/12/12 9:03 * @Author lw */ public class GeneratorClient { /** * 代碼生成: * 1.將pom.xml中,自定義注釋mbg-comment依賴放開 * 2.generatorConfig.xml文中,targetProject屬性加上項目名稱,使用targetProject="mbg-service/src/main/java" * * @param args */ public static void main(String[] args) { List<String> warnings = new ArrayList<>(); boolean overwrite = true; try{ 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(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); }catch (Exception e){ e.printStackTrace(); } warnings.forEach(warning -> { System.out.println("=== " + warning); }); } }
生成代碼效果
遇到的問題
1.中文亂碼
在generatorConfig.xml中,添加 <property name="javaFileEncoding" value="UTF-8"/>
2.數據庫字段注釋中文亂碼,在數據庫連接url中添加 characterEncoding=utf-8
數據庫字符集設置:
3.找不到自定義注釋類 com.lw.mbgcomment.comment.MyCommentGenerator
需要保證classpath一致,在pom文件<build/>中引入mbg-comment依賴