最近做項目,orm 使用的是 mybatis,為了偷懶,我自然而然的想到了使用 mybatis generator(mbg)來生成數據庫表對應的實體代碼和 mapper 代碼。于是做了如下的配置(對 mbg 配置不熟悉的同學可以參考 mybatis generator最完整配置詳解):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
<?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> |
數據庫建庫建表的代碼:
1
2
3
4
5
6
7
8
9
10
|
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
的源碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
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
試試:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<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
,重寫我們需要的方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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
設置我們自己的注釋生成器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?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
開了小灶):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?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
:
成功的生成了類主食和字段注釋~
我這里并沒有處理注釋是多行文本的情況 —— 留給有興趣的讀者吧~
小項目地址:https://github.com/mizhoux/mbg-comment
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://segmentfault.com/a/1190000016525887