MyBatis Generator 自定義生成注釋的方法
最近做項(xiàng)目,ORM 使用的是 MyBatis,為了偷懶,我自然而然的想到了使用 MyBatis Generator(MBG)來(lái)生成數(shù)據(jù)庫(kù)表對(duì)應(yīng)的實(shí)體代碼和 Mapper 代碼。于是做了如下的配置(對(duì) MBG 配置不熟悉的同學(xué)可以參考 Mybatis Generator最完整配置詳解):
<?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> <!-- 指定數(shù)據(jù)庫(kù)驅(qū)動(dòng)的jdbc驅(qū)動(dòng)jar包的位置 --> <classPathEntry location="./mysql-connector-java-5.1.40.jar" /> <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" > <!-- 生成的 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"/> <!-- 配置數(shù)據(jù)庫(kù)連接 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8" userId="root" password="123456"> </jdbcConnection> <!-- 生成實(shí)體的位置 --> <javaModelGenerator targetPackage="me.mizhoux.model" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaModelGenerator> <!-- 生成 Mapper 接口的位置 --> <sqlMapGenerator targetPackage="me.mizhoux.mapper" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 生成 Mapper XML 的位置 --> <javaClientGenerator targetPackage="me.mizhoux.mapper" type="XMLMAPPER" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- 設(shè)置數(shù)據(jù)庫(kù)的表名和實(shí)體類名 --> <table tableName="t_user" domainObjectName="User"> <!-- generatedKey用于生成生成主鍵的方法 --> <generatedKey column="id" sqlStatement="SELECT LAST_INSERT_ID()"/> </table> </context> </generatorConfiguration>
數(shù)據(jù)庫(kù)建庫(kù)建表的代碼:
CREATE SCHEMA `db_test` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ; CREATE TABLE `db_test`.`t_user` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '用戶 ID', `username` VARCHAR(30) NULL COMMENT '用戶名稱', `password` VARCHAR(20) NULL COMMENT '用戶密碼', `birthday` DATE NULL COMMENT '用戶生日', PRIMARY KEY (`id`), UNIQUE INDEX `username_UNIQUE` (`username` ASC) ) COMMENT = '用戶';
開(kāi)開(kāi)心心,執(zhí)行命令,開(kāi)始生成代碼:
java -jar mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml -overwrite
然后查看生成的 Java 實(shí)體類:
看著這個(gè)注釋,讓我有點(diǎn)糾結(jié)啊 —— 為什么不是數(shù)據(jù)庫(kù)中每個(gè)字段對(duì)應(yīng)的注釋呢?查找相關(guān)資料,得知 MBG 生成的是由 org.mybatis.generator.api.CommentGenerator
來(lái)控制的。這是一個(gè)接口,MBG 的默認(rèn)實(shí)現(xiàn)類是做 org.mybatis.generator.internal.DefaultCommentGenerator
。當(dāng)你在 generatorConfig.xml
中配置了 commentGenerator
標(biāo)簽,那么默認(rèn)狀態(tài)下,生成注釋的工作,將由 DefaultCommentGenerator
來(lái)完成。 所以我們來(lái)查看下這個(gè) DefaultCommentGenerator
的源碼:
public class DefaultCommentGenerator implements CommentGenerator { // 屬性,即配置在 commentGenerator 標(biāo)簽之內(nèi)的 Property 標(biāo)簽 private Properties properties; // 是否不生成日期 private boolean suppressDate; // 是否不生成注釋 private boolean suppressAllComments; // 是否添加數(shù)據(jù)庫(kù)內(nèi)的注釋 private boolean addRemarkComments; // 日期格式化 private SimpleDateFormat dateFormat; public DefaultCommentGenerator() { super(); properties = new Properties(); suppressDate = false; suppressAllComments = false; addRemarkComments = false; } @Override public void addConfigurationProperties(Properties properties) { this.properties.putAll(properties); suppressDate = isTrue(properties .getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_DATE)); suppressAllComments = isTrue(properties .getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS)); addRemarkComments = isTrue(properties .getProperty(PropertyRegistry.COMMENT_GENERATOR_ADD_REMARK_COMMENTS)); String dateFormatString = properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_DATE_FORMAT); if (StringUtility.stringHasValue(dateFormatString)) { dateFormat = new SimpleDateFormat(dateFormatString); } } // 其他代碼 ... }
addRemarkComments
這個(gè)屬性,看來(lái)就是用來(lái)生成數(shù)據(jù)庫(kù)注釋用的 —— 好開(kāi)心,那把它設(shè)置為 true
試試:
<generatorConfiguration> <!-- 指定數(shù)據(jù)庫(kù)驅(qū)動(dòng)的jdbc驅(qū)動(dòng)jar包的位置 --> <classPathEntry location="./mysql-connector-java-5.1.40.jar" /> <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" > <property name="javaFileEncoding" value="UTF-8"/> <!-- 其他 Property --> <commentGenerator> <property name="suppressDate" value="true"/> <property name="addRemarkComments" value="true"/> </commentGenerator> ... </context> </generatorConfiguration>
運(yùn)行命令:
java -jar mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml -overwrite
數(shù)據(jù)庫(kù)注釋倒是拿到了,但是生成的一堆其他信息,看著實(shí)在是太扎眼了。查看源碼,發(fā)現(xiàn)這些內(nèi)容已經(jīng)寫(xiě)死在 DefaultCommentGenerator
中了,沒(méi)有辦法自定義。
自己動(dòng)手豐衣足食,我們?yōu)樯恫蛔约簩?xiě)個(gè)類實(shí)現(xiàn) CommentGenerator
接口,然后自定義自己想要的注釋呢。查看 commentGenerator
的 DTD,發(fā)現(xiàn)正好 commentGenerator
有個(gè) type
屬性,可以用來(lái)指定自己的注釋實(shí)現(xiàn)類:
查看 CommentGenerator
接口,發(fā)現(xiàn)里面的方法非常多,不僅包含了生成 Java 實(shí)體注釋對(duì)應(yīng)的方法,還包括了生成 XML 中注釋的方法。所以我們先寫(xiě)一個(gè)默認(rèn)的實(shí)現(xiàn)類,實(shí)現(xiàn)CommentGenerator
接口,但不做任何操作 —— 因?yàn)?DefaultCommentGenerator
本文已經(jīng)存在了,為了避免混淆,就叫它SimpleCommentGenerator
吧。然后定義我們自己的注釋類,MySQLCommentGenerator
,繼承 SimpleCommentGenerator
,重寫(xiě)我們需要的方法:
public class MySQLCommentGenerator extends SimpleCommentGenerator { private 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(" */"); } }
因?yàn)槲覀儸F(xiàn)在要使用到我們自己自定義的 CommentGenerator
,所以我們 通過(guò)代碼的方式來(lái)操作 MBG:
public class Generator { public static void main( String[] args ) throws Exception { List<String> warnings = new ArrayList<>(); File configFile = new File("generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(true); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } }
然后配置 generatorConfig.xml
設(shè)置我們自己的注釋生成器:
<?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> <!-- 指定數(shù)據(jù)庫(kù)驅(qū)動(dòng)的jdbc驅(qū)動(dòng)jar包的位置 --> <!-- 不再需要,因?yàn)?jar 包已經(jīng)在 classpath 中 <classPathEntry location="./mysql-connector-java-5.1.40.jar" /> --> <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" > ... <!-- 自定義注釋生成器 --> <commentGenerator type="me.mizhoux.mbgcomment.MySQLCommentGenerator"> <property name="author" value="Michael Chow"/> <property name="dateFormat" value="yyyy/MM/dd"/> </commentGenerator> ... </context> </generatorConfiguration>
完整的 Maven 項(xiàng)目在 我的 GitHub。現(xiàn)在,我們運(yùn)行主類 Generator
,成功生成了數(shù)據(jù)庫(kù)中的注釋:
等等,好像有點(diǎn)不對(duì)勁!
類的注釋怎么沒(méi)有了!
想來(lái)應(yīng)該是 JDBC 連接 MySQL 的時(shí)候需要添加什么屬性才能獲取表的注釋,上網(wǎng)查詢,發(fā)現(xiàn)是 useInformationSchema
,需要將其設(shè)置為 true
(看來(lái)是 MBG 給自己的 DefaultCommentGenerator
開(kāi)了小灶):
<?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" > ... <!-- 自定義注釋生成器 --> <commentGenerator type="me.mizhoux.mbgcomment.MySQLCommentGenerator"> <property name="author" value="Michael Chow"/> <property name="dateFormat" value="yyyy/MM/dd"/> </commentGenerator> <!-- 配置數(shù)據(jù)庫(kù)連接 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8" userId="root" password="123456"> <!-- 設(shè)置 useInformationSchema 屬性為 true --> <property name="useInformationSchema" value="true" /> </jdbcConnection> ... </context> </generatorConfiguration>
然后再次運(yùn)行主類 Generator
:
成功的生成了類主食和字段注釋~
我這里并沒(méi)有處理注釋是多行文本的情況 —— 留給有興趣的讀者吧~
小項(xiàng)目地址:https://github.com/mizhoux/mbg-comment
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot集成redis存對(duì)象亂碼的問(wèn)題及解決
這篇文章主要介紹了springboot集成redis存對(duì)象亂碼的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06SpringBoot中Tomcat和SpringMVC整合源碼分析
Tomcat和SpringMVC都是通過(guò)這樣的方式進(jìn)行集成的,SpringBoot出現(xiàn)之前SpringMVC項(xiàng)目是直接部署在Tomcat服務(wù)器中的,這篇文章主要介紹了SpringBoot中Tomcat和SpringMVC整合源碼分析,需要的朋友可以參考下2022-07-07Java之URLEncoder、URLDecoder、Base64編碼與解碼方式
這篇文章主要介紹了Java之URLEncoder、URLDecoder、Base64編碼與解碼方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05圖文詳解mybatis+postgresql平臺(tái)搭建步驟
從頭開(kāi)始搭建一個(gè)mybatis+postgresql平臺(tái),這篇文章主要介紹了圖文詳解mybatis+postgresql平臺(tái)搭建步驟,感興趣的小伙伴們可以參考一下2016-07-07Java超過(guò)long類型的數(shù)據(jù)表示方法
這篇文章主要給大家介紹Java超過(guò)long類型的數(shù)據(jù)如何表示,在 Java 中,如果需要表示超過(guò) long 類型范圍的數(shù)據(jù),可以使用 BigInteger 類,BigInteger 是 Java 提供的一個(gè)用于處理任意精度整數(shù)的類,它可以表示非常大或非常小的整數(shù),需要的朋友可以參考下2023-09-09spring boot實(shí)現(xiàn)軟刪除的示例代碼
這篇文章主要介紹了spring boot實(shí)現(xiàn)軟刪除的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07SpringBoot登錄驗(yàn)證碼實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了SpringBoot登錄驗(yàn)證碼實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04druid監(jiān)控?zé)o法關(guān)閉的坑以及處理方式
這篇文章主要介紹了druid監(jiān)控?zé)o法關(guān)閉的坑以及處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05