MyBatis Generator 自定义生成注释的方法
最近做项目,orm 使用的是 mybatis,为了偷懒,我自然而然的想到了使用 mybatis generator(mbg)来生成数据库表对应的实体代码和 mapper 代码。于是做了如下的配置(对 mbg 配置不熟悉的同学可以参考 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> <!-- 指定数据库驱动的jdbc驱动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"/> <!-- 配置数据库连接 --> <jdbcconnection driverclass="com.mysql.jdbc.driver" connectionurl="jdbc:mysql://localhost:3306/test?characterencoding=utf-8" userid="root" password="123456"> </jdbcconnection> <!-- 生成实体的位置 --> <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> <!-- 设置数据库的表名和实体类名 --> <table tablename="t_user" domainobjectname="user"> <!-- generatedkey用于生成生成主键的方法 --> <generatedkey column="id" sqlstatement="select last_insert_id()"/> </table> </context> </generatorconfiguration>
数据库建库建表的代码:
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 = '用户';
开开心心,执行命令,开始生成代码:
java -jar mybatis-generator-core-1.3.7.jar -configfile generatorconfig.xml -overwrite
然后查看生成的 java 实体类:
看着这个注释,让我有点纠结啊 —— 为什么不是数据库中每个字段对应的注释呢?查找相关资料,得知 mbg 生成的是由 org.mybatis.generator.api.commentgenerator
来控制的。这是一个接口,mbg 的默认实现类是做 org.mybatis.generator.internal.defaultcommentgenerator
。当你在 generatorconfig.xml
中配置了 commentgenerator
标签,那么默认状态下,生成注释的工作,将由 defaultcommentgenerator
来完成。 所以我们来查看下这个 defaultcommentgenerator
的源码:
public class defaultcommentgenerator implements commentgenerator { // 属性,即配置在 commentgenerator 标签之内的 property 标签 private properties properties; // 是否不生成日期 private boolean suppressdate; // 是否不生成注释 private boolean suppressallcomments; // 是否添加数据库内的注释 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
这个属性,看来就是用来生成数据库注释用的 —— 好开心,那把它设置为 true
试试:
<generatorconfiguration> <!-- 指定数据库驱动的jdbc驱动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>
运行命令:
java -jar mybatis-generator-core-1.3.7.jar -configfile generatorconfig.xml -overwrite
数据库注释倒是拿到了,但是生成的一堆其他信息,看着实在是太扎眼了。查看源码,发现这些内容已经写死在 defaultcommentgenerator
中了,没有办法自定义。
自己动手丰衣足食,我们为啥不自己写个类实现 commentgenerator
接口,然后自定义自己想要的注释呢。查看 commentgenerator
的 dtd,发现正好 commentgenerator
有个 type
属性,可以用来指定自己的注释实现类:
查看 commentgenerator
接口,发现里面的方法非常多,不仅包含了生成 java 实体注释对应的方法,还包括了生成 xml 中注释的方法。所以我们先写一个默认的实现类,实现commentgenerator
接口,但不做任何操作 —— 因为 defaultcommentgenerator
本文已经存在了,为了避免混淆,就叫它simplecommentgenerator
吧。然后定义我们自己的注释类,mysqlcommentgenerator
,继承 simplecommentgenerator
,重写我们需要的方法:
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(" */"); } }
因为我们现在要使用到我们自己自定义的 commentgenerator
,所以我们 通过代码的方式来操作 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
设置我们自己的注释生成器:
<?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> <!-- 指定数据库驱动的jdbc驱动jar包的位置 --> <!-- 不再需要,因为 jar 包已经在 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 项目在 我的 github。现在,我们运行主类 generator
,成功生成了数据库中的注释:
等等,好像有点不对劲!
类的注释怎么没有了!
想来应该是 jdbc 连接 mysql 的时候需要添加什么属性才能获取表的注释,上网查询,发现是 useinformationschema
,需要将其设置为 true
(看来是 mbg 给自己的 defaultcommentgenerator
开了小灶):
<?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> <!-- 配置数据库连接 --> <jdbcconnection driverclass="com.mysql.jdbc.driver" connectionurl="jdbc:mysql://localhost:3306/test?characterencoding=utf-8" userid="root" password="123456"> <!-- 设置 useinformationschema 属性为 true --> <property name="useinformationschema" value="true" /> </jdbcconnection> ... </context> </generatorconfiguration>
然后再次运行主类 generator
:
成功的生成了类主食和字段注释~
我这里并没有处理注释是多行文本的情况 —— 留给有兴趣的读者吧~
小项目地址:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
MyBatis Generator 自定义生成注释的方法
-
MyBatis使用自定义TypeHandler转换类型的实现方法
-
使用mybatis-generator生成的Example,快速分页查询魔板代码
-
Mybatis Generator自动生成对应文件的实现方法
-
Mybatis MapperScannerConfigurer自动扫描Mapper接口生成代理注入到Spring的方法
-
MyBatis使用自定义TypeHandler转换类型的实现方法
-
在控制台打印 MyBatis 生成的 sql 语句的配置方法
-
MyBatis Generator 自定义生成注释的方法
-
Mybatis Generator自动生成对应文件的实现方法
-
Intellij IDEA如何自定义注释模板的实现方法