作者:王建樂
1 前言
在日常開發作業中,我們經常用Mybatis Generator根據表結構生成對應的物體類和Mapper檔案,但是Mybatis Generator默認生成的代碼中,注釋并不是我們想要的,所以一般在Generator組態檔中,會設定不自動生成注釋,帶來的問題就是自動生成代碼之后,我們還要自己去類檔案中把注釋加上,如果生成的類較少還好,如果有生成很多類檔案,自己加注釋是一件繁瑣的作業,
通過重寫Mybatis Generator的CommentGenerator介面,可以方便地生成自己想要的注釋,減少重復作業,
2 使用Java方式執行Mybatis Generator
2.1 IDEA中新建Maven專案
pom.xml中引入jar包
<?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"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>MyGenerator</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency> </dependencies> </project>
2.2 創建generatorConfig.xml
隨便找個目錄放,我放在src/main/resources目錄下
<?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> <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" > <!-- 生成的 Java 檔案的編碼 --> <property name="javaFileEncoding" value=https://www.cnblogs.com/Jcloud/p/"UTF-8"/> <!-- 格式化 Java 代碼 --> <property name="javaFormatter" value=https://www.cnblogs.com/Jcloud/p/"org.mybatis.generator.api.dom.DefaultJavaFormatter"/> <!-- 格式化 XML 代碼 --> <property name="xmlFormatter" value=https://www.cnblogs.com/Jcloud/p/"org.mybatis.generator.api.dom.DefaultXmlFormatter"/> <commentGenerator> <property name="suppressAllComments" value=https://www.cnblogs.com/Jcloud/p/"false" /> </commentGenerator> <!-- 配置資料庫連接 --> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="URL" userId="user" password="password"> <!-- 設定 useInformationSchema 屬性為 true --> <property name="useInformationSchema" value=https://www.cnblogs.com/Jcloud/p/"true" /> </jdbcConnection> <!-- 生成物體的位置 --> <javaModelGenerator targetPackage="com.jd.bulk" targetProject="src/main/java"> <property name="enableSubPackages" value=https://www.cnblogs.com/Jcloud/p/"true"/> </javaModelGenerator> <!-- 生成 Mapper XML 的位置 --> <sqlMapGenerator targetPackage="com.jd.bulk" targetProject="src/main/resources"> <property name="enableSubPackages" value=https://www.cnblogs.com/Jcloud/p/"true"/> </sqlMapGenerator> <!-- 生成 Mapper 介面的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.jd.bulk" targetProject="src/main/java"> <property name="enableSubPackages" value=https://www.cnblogs.com/Jcloud/p/"true"/> </javaClientGenerator> <!-- 設定資料庫的表名和物體類名 --> <table tableName="worker" domainObjectName="Worker"/> </context> </generatorConfiguration>
2.3 創建main方法,運行Generator
public class Generator { public static void main(String[] args) throws Exception { List<String> warnings = new ArrayList<>(2); ConfigurationParser cp = new ConfigurationParser(warnings); File configFile = new File("src/main/resources/generatorConfig.xml"); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(true); MyBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } }
運行main方法,生成默認注釋如下,并不是我們想要的注釋,所以一般會配置為注釋不生成:

2.4 實作CommentGenerator介面
重寫以下方法,自定義注釋
public class MySQLCommentGenerator implements CommentGenerator { private final Properties properties; public MySQLCommentGenerator() { properties = new Properties(); } @Override public void addConfigurationProperties(Properties properties) { // 獲取自定義的 properties this.properties.putAll(properties); } /** * 重寫給物體類加的注釋 */ @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(" */"); } /** * 重寫給物體類欄位加的注釋 */ @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { // 獲取列注釋 String remarks = introspectedColumn.getRemarks(); field.addJavaDocLine("/**"); field.addJavaDocLine(" * " + remarks); field.addJavaDocLine(" */"); } /** * 重寫給物體類get方法加的注釋 */ @Override public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { // 獲取表注釋 String remarks = introspectedColumn.getRemarks(); method.addJavaDocLine("/**"); method.addJavaDocLine(" * " + method.getName()); method.addJavaDocLine(" */"); }
2.5 修改generatorConfig.xml配置
將generatorConfig.xml檔案中的commentGenerator做如下修改,type屬性選擇自己的實作類
<commentGenerator type="com.generator.MySQLCommentGenerator"> <property name="author" value=https://www.cnblogs.com/Jcloud/p/"Your Name"/> <property name="dateFormat" value=https://www.cnblogs.com/Jcloud/p/"yyyy/MM/dd"/> </commentGenerator>
運行main方法,生成注釋如下:

3 使用Maven方式執行Mybatis Generator
Pom.xml檔案中增加以下配置,需要引入generator插件時,依賴實作CommentGenerator介面的jar包,要先把自己的jar包install到本地倉庫,
否則會報com.generator.MySQLCommentGenerator找不到,其他配置同上,
<build> <defaultGoal>compile</defaultGoal> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.4.0</version> <configuration> <configurationFile>src/main/resources/generatorConfig.xml</configurationFile> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> <dependencies> <!-- 其他的資料庫,需要修改依賴 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <!-- 參考實作CommentGenerator介面的jar包 --> <dependency> <groupId>org.example</groupId> <artifactId>MyGenerator</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </plugin> </plugins>
4 原始碼分析
查看執行Mybatis Generator的main方法,主要分為兩部分,決議指定的組態檔與呼叫生成java檔案和Mapper檔案的方法

4.1 決議指定的xml組態檔
跟蹤決議xml檔案的方法cp.parseConfiguration(configFile)發現,底層以Document形式讀取xml檔案,根據標簽名決議各標簽屬性,保存到Configuration實體中,

其中決議commentGenerator標簽的方法parseCommentGenerator(context, childNode)中,會獲取commentGenerator標簽的type屬性值,也就是自定義的”com.generator.MySQLCommentGenerator”類,放到Context實體中,

4.2 呼叫生成java檔案和Mapper檔案的方法
xml組態檔決議完成,得到Configuration實體,后面生成檔案的作業都會從Configuration實體中獲取所需資料,生成檔案的方法主要步驟為:1.連接資料庫,查詢表資訊與列資訊,2.生成檔案內容,3.寫入生成檔案,
其中生成檔案內容時,會根據Context的type屬性反射創建MySQLCommentGenerator實體,然后呼叫自定義的生成注釋方法,
如:生成物體類檔案的注釋,呼叫addModelClassComment方法

生成欄位注釋,呼叫addFieldComment方法

生成Get方法注釋,呼叫addGetterComment方法

在呼叫addModelClassComment,addFieldComment,addGetterComment等生成注釋的方法時,執行的都是MySQLCommentGenerator類的方法,這樣就實作了生成自定義注釋的功能,
5 總結
通過使用自定義實作CommentGenerator介面,讓自動生成的代碼加上我們想要的注釋,可以省去自己加注釋的麻煩,
與一般使用Mybatis Generator生成代碼的方式一樣,多實作個介面即可,
使用Maven方式運行時,需要在pom.xml引入插件時,依賴自己jar包,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/538119.html
標籤:Java
上一篇:計算機網路面試大總結
下一篇:EntityUtils MapStruct BeanCopier 資料物體類轉換工具 DO BO VO DTO 附視頻
