菠蘿大象
用心思考,用心寫(xiě)作
首頁(yè)
新隨筆
聯(lián)系
管理
隨筆-67 評(píng)論-522 文章-0 trackbacks-0
修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(二)
上一篇對(duì)
mybatis-generator-core
源碼的基礎(chǔ)修改作了說(shuō)明,也可以說(shuō)是最想改的地方,這一篇將在此基礎(chǔ)上再做進(jìn)一步的修改。
首先說(shuō)說(shuō)上一篇最后提到的關(guān)于自定義注釋的問(wèn)題,想實(shí)現(xiàn)這個(gè)功能就需要修改
org.mybatis.generator.internal.DefaultCommentGenerator
這個(gè)類。我將里面一些主要的方法講下。
addJavaFileComment(CompilationUnit compilationUnit)
給
Java
文件加注釋,這個(gè)注釋是在文件的頂部,也就是
package
上面。
addComment(XmlElement xmlElement)
給生成的
XML
文件加注釋。大象將這個(gè)方法清空了,不生成注釋。
addClassComment(InnerClass innerClass,IntrospectedTable introspectedTable)
Java
類的類注釋。
請(qǐng)注意紅線的
getRemarks()
方法,這個(gè)
remarks
屬性在原來(lái)的
FullyQualifiedTable
里面是沒(méi)有的,這是大象自己加上去的,就是為了保存表的注釋信息。那是在哪里加進(jìn)去的呢?請(qǐng)看
org.mybatis.generator.internal.db.DatabaseIntrospector
這個(gè)類,大概瀏覽下就會(huì)發(fā)現(xiàn),數(shù)據(jù)庫(kù)表以及列的信息讀取,類型設(shè)置都是由它來(lái)完成的,定位到
608
行,正好這里是個(gè)空行,插入幾行代碼。如下:
這樣我們就取到了表的注釋信息,看到這里應(yīng)該就會(huì)明白了吧?
另外我需要說(shuō)明的是,想通過(guò)
databaseMetaData
.
getTables()
來(lái)獲得表注釋的童鞋,這個(gè)做法是沒(méi)用的,大象已經(jīng)試過(guò)了,這個(gè)結(jié)果集里面的
rs.getString(
"REMARKS"
)
得到的是一個(gè)空字符串,什么都木有。而且大象還想吐槽下,網(wǎng)上一大堆說(shuō)返回的這個(gè)結(jié)果集是
10
列,呵呵,是的么?我
debug
了好久發(fā)現(xiàn)它還是只有
5
列,不知道這
10
列是從哪來(lái)的,請(qǐng)打印出
10
列的童鞋告之是怎么做的,我用的
mysql
驅(qū)動(dòng)是
5.1.29
addFieldComment(Field field, IntrospectedTable introspectedTable,IntrospectedColumn introspectedColumn)
Java
屬性注釋。注釋為空就不給屬性添加。
addGetterComment(Method method,IntrospectedTable introspectedTable,IntrospectedColumn introspectedColumn)
給
getter
方法加注釋。這里添加注釋的方法和
Field
一樣,大象把這個(gè)方法以及
addSetterComment
方法都清空了,因?yàn)槲冶容^習(xí)慣把注釋加到屬性上面,如果你習(xí)慣在
getter
方法上面加注釋可以自行改一下。
上面這些修改做完后,記得要在
org.mybatis.generator.codegen.mybatis3.model.BaseRecordGenerator
的
61
行增加下面這行代碼:
commentGenerator.addClassComment(topLevelClass,
introspectedTable
);
因?yàn)?/span>
mybatis-generator
源碼中本來(lái)就是不加類注釋的。
大家都在不同的公司,要求肯定都不一樣,大象沒(méi)法滿足所有人,只對(duì)該類做了一定程度的修改,姑且把它當(dāng)做一個(gè)示例模板吧,主要是弄明白怎么改就成了。
mybatis-generator
在
1.3.2
版里對(duì)生成
xml
的
namespace
作了修改,不再用表名當(dāng)為
namespace
的值,而是用包結(jié)構(gòu)
+
類名
+Mapper
后綴的形式設(shè)置,大象不喜歡這么復(fù)雜做法,所以這里需要改一改,只保留類名
+Mapper
的命名形式。去掉
org.mybatis.generator.api.IntrospectedTable
類的
907
行與
908
行代碼。
接下來(lái)再來(lái)說(shuō)說(shuō)對(duì)大對(duì)象類型的處理,
mybatis-generator
默認(rèn)會(huì)把所有
jdbcType
為:
BINARY
、
BLOB
、
CLOB
、
LONGVARBINARY
、
LONGVARCHAR
、
VARBINARY
這些類型都作為大對(duì)象,反應(yīng)出來(lái)的效果就是生成的
pojo
類會(huì)多一個(gè)類名
+WithBLOBs.java
的文件
(
含有的大對(duì)象個(gè)數(shù)大于
1
時(shí)
)
,而在
XML
里面也會(huì)增加一個(gè)
id
為
ResultMapWithBLOBs
的
resultMap
,它繼承
BaseResultMap
,大象一向喜歡簡(jiǎn)單的風(fēng)格,這看得太不爽了。如果你覺(jué)得無(wú)所謂,不需要修改,請(qǐng)?zhí)^(guò)這段往下看。
表中的
text
或
blob
等類型,通過(guò)
databaseMetaData
.
getColumns()
取出來(lái)后,它的
rs.getInt(
"DATA_TYPE"
)
值是與
java.sql.Types
對(duì)應(yīng)的。
text
類型的值:
Types.
LONGVARCHAR
blob
類型是
值:
Types.
LONGVARBINARY
它用
org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl
解析
java
類型與
jdbc
類型,然后設(shè)置到
org.mybatis.generator.api.IntrospectedColumn
的
jdbcTypeName
屬性里,最關(guān)鍵的地方到了,
IntrospectedColumn
類第
156
行有個(gè)
isBLOBColumn()
方法,它就是用來(lái)判斷是否生成
xxxWithBLOBs.java
和
ResultMapWithBLOBs
的條件。當(dāng)然
mybatis-generator
不會(huì)這么直接用,它在里面定義了一個(gè)
Rules
接口,由它來(lái)統(tǒng)一進(jìn)行調(diào)用。所以我們只需要把
isBLOBColumn()
里面的代碼都去掉,直接返回
false
就可以了
,再結(jié)合配置文件中的
columnOverride
屬性就能達(dá)到目的。
jdbcType
指定的值就是生成
xml
后
result
里面對(duì)應(yīng)的類型,
javaType
與生成的
pojo
里面屬性類型一致,這里其實(shí)可以不定義
javaType
,但是當(dāng)數(shù)據(jù)庫(kù)的表字段有的定義為
tinyint
時(shí),如果不給它指定類型,那么默認(rèn)生成的
java
類型就是
java.lang.Byte
,假如你想轉(zhuǎn)換類型,而且保證不會(huì)超出字段類型的大小限制,那么你可以將它的
javaType
設(shè)為
java.lang.Integer
經(jīng)過(guò)這么一番修改之后,輸出結(jié)果已經(jīng)比較理想了,但是
xml
文件看上去還是有點(diǎn)問(wèn)題,元素與元素之間沒(méi)空行,看起來(lái)好別扭。恩,這里要給它加上空行,所以請(qǐng)找到
org.mybatis.generator.api.dom.xml.XmlElement
類的
getFormattedContent
方法,這個(gè)方法有個(gè)參數(shù):
indentLevel
,通過(guò)名字我們可以很直觀的理解它的作用就是來(lái)控制縮進(jìn)等級(jí),它的初始值為
0
,這表示不縮進(jìn),當(dāng)變成
1
時(shí)就是縮進(jìn)一級(jí),也即縮進(jìn)四個(gè)空格,后面以此類推,我們應(yīng)該還注意到,方法內(nèi)部用到了遞歸,所以它是從最底元素開(kāi)始,再一步步返回,所以我們就應(yīng)該在
indentLevel
為
1
的元素后面加上換行。
在生成
xml
的文件里面,我們看到有一個(gè)
update
元素,
id
為
updateByPrimaryKey
,這個(gè)基本上用不到,但是你還不能在
table
里加上
enableUpdateByPrimaryKey
=
"false"
,如果你這么做,雖然
updateByPrimaryKey
沒(méi)有了,但
updateByPrimaryKeySelective
也會(huì)消失。所以這時(shí)
請(qǐng)看看
org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator
這個(gè)類,
getSqlMapElement()
里面,有大量的
addXXX
方法,這些方法里面每個(gè)都用到了
Rules
規(guī)則來(lái)處理是否執(zhí)行,比如我們?cè)?/span>
table
里面加了
enableDeleteByExample
=
"false"
,它對(duì)應(yīng)的是
addDeleteByExampleElement()
,而它又調(diào)用了
introspectedTable.
getRules().generateDeleteByExample()
方法,再進(jìn)入到
generateDeleteByExample()
里面,我們可以看到紅線部分,上一篇大象講過(guò),在加載配置文件的時(shí)候,
TableConfiguration
會(huì)將
table
中的這些屬性設(shè)置到對(duì)應(yīng)的屬性里,所以說(shuō)其實(shí)最后還是回到了判斷
enableDeleteByExample
的布爾值上面。
上面啰嗦了一大堆,現(xiàn)在再來(lái)解決之前提到的問(wèn)題,如何去掉
id
為
updateByPrimaryKey
的
update
元素,注釋掉
addUpdateByPrimaryKeyWithoutBLOBsElement()
或直接去掉這行代碼,跟蹤代碼你會(huì)發(fā)現(xiàn),它和
addUpdateByPrimaryKeySelectiveElement()
的
rules
驗(yàn)證里面都用到了
enableUpdateByPrimaryKey
的值。或者你不想采取我說(shuō)的這個(gè)辦法,而是改
BaseRules
的
generateUpdateByPrimaryKeyWithoutBLOBs()
,讓它直接返回
false
最后大象再嘮叨一句,這些
addXXX
方法的順序決定了生成
xml
文件中的元素順序,所以有代碼潔癖的人可以作下調(diào)整。
上一篇加這一篇都是講怎么少量的改動(dòng)源碼以實(shí)現(xiàn)自定義文件輸出,寫(xiě)的比較凌亂,不是很系統(tǒng),完全是從實(shí)用的角度出發(fā),關(guān)鍵還是大象水平有限,有什么錯(cuò)誤還請(qǐng)大家?guī)臀抑赋鰜?lái),謝謝!
改了這么多
,總要看下效果吧,下一篇大象將寫(xiě)個(gè)測(cè)試看看生成的結(jié)果,然后用
maven
assembly
將它打包生成一個(gè)
zip
,它將包含:
本文為菠蘿大象原創(chuàng),如要轉(zhuǎn)載請(qǐng)注明出處。
http://www.tkk7.com/
bolo
posted on 2015-03-25 16:33
菠蘿大象
閱讀(26603)
評(píng)論(0)
編輯
收藏
所屬分類:
mybatis-generator
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
相關(guān)文章:
修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(三)
修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(二)
修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(一)
<
2015年3月
>
日
一
二
三
四
五
六
22
23
24
25
26
27
28
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
1
2
3
4
隨筆分類
(67)
Concurrency(3)
Database(4)
dom4j&jdom(3)
Eclipse(3)
Flex(4)
Hibernate(2)
Java(11)
jBPM(1)
jQuery(5)
Linux(1)
mybatis-generator(3)
Spring3(11)
Struts2(9)
隨筆(7)
隨筆檔案
(67)
2015年9月 (1)
2015年8月 (1)
2015年7月 (1)
2015年5月 (1)
2015年4月 (1)
2015年3月 (3)
2015年2月 (1)
2015年1月 (2)
2014年8月 (1)
2014年6月 (2)
2014年5月 (2)
2014年4月 (3)
2014年3月 (1)
2014年2月 (1)
2014年1月 (2)
2013年12月 (3)
2013年11月 (2)
2013年10月 (2)
2013年9月 (2)
2012年5月 (1)
2012年4月 (2)
2011年8月 (1)
2011年6月 (1)
2011年5月 (3)
2010年9月 (1)
2010年8月 (1)
2010年7月 (1)
2010年6月 (1)
2010年5月 (2)
2010年4月 (4)
2010年3月 (2)
2010年2月 (7)
2008年9月 (2)
2008年8月 (6)
搜索
積分與排名
積分 - 782085
排名 - 55
最新隨筆
1.?由Struts2Action代理和googlecode-jsonplugin產(chǎn)生的一個(gè)IllegalArgumentException異常問(wèn)題
2.?在CentOS系統(tǒng)中同步時(shí)間
3.?全局唯一ID生成器淺析
4.?用Java實(shí)現(xiàn)MJD轉(zhuǎn)UTC
5.?修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(三)
6.?修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(二)
7.?修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(一)
8.?Quartz Spring與Spring Task總結(jié)
9.?常用的MySQL復(fù)雜查詢語(yǔ)句寫(xiě)法
10.?常用的MySQL語(yǔ)句寫(xiě)法
11.?淺談Java兩種并發(fā)類型——計(jì)算密集型與IO密集型
12.?使用XStream注解實(shí)現(xiàn)Java對(duì)象與XML互相轉(zhuǎn)換的代碼示例
13.?淺談volatile變量的理解
14.?淺談Java共享變量
15.?m2eclipse安裝小貼士
最新評(píng)論
1.?re: 修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(一)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--半湖思絮
2.?re: 修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(一)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--菠蘿大象
3.?re: 修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(一)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--donghc
4.?re: 修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(一)
@donghc
maven不是這樣玩的呀,我的run是打包后用的,你仔細(xì)看了第三篇的內(nèi)容么?在IDE里直接啟動(dòng)StartUp就行了,這個(gè)類是用來(lái)測(cè)試的
--菠蘿大象
5.?re: 修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(一)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--donghc
閱讀排行榜
1.?使用jackson對(duì)Java對(duì)象與JSON字符串相互轉(zhuǎn)換的一些總結(jié)(59352)
2.?在Eclipse中反編譯Class文件完全詳解(43617)
3.?Quartz Spring與Spring Task總結(jié)(38592)
4.?使用XStream注解實(shí)現(xiàn)Java對(duì)象與XML互相轉(zhuǎn)換的代碼示例(33158)
5.?Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(二)(32470)
評(píng)論排行榜
1.?Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(五)(69)
2.?Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(三)(47)
3.?Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(一)(35)
4.?Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(二)(27)
5.?Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(三)(26)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 菠蘿大象
主站蜘蛛池模板:
久久亚洲精品无码AV红樱桃
|
成年女人毛片免费观看97
|
亚洲综合色区在线观看
|
羞羞视频免费观看
|
国产免费观看网站
|
色欲色欲天天天www亚洲伊
|
日本免费一区二区三区最新
|
亚洲AV日韩综合一区尤物
|
亚洲国产无线乱码在线观看
|
免费阿v网站在线观看g
|
亚洲国产高清视频在线观看
|
91嫩草国产在线观看免费
|
亚洲AV一二三区成人影片
|
黄页网站免费观看
|
亚洲色成人网站WWW永久四虎
|
亚洲成a人片在线观看天堂无码
|
免费看AV毛片一区二区三区
|
久久亚洲精品高潮综合色a片
|
免费一级毛片不卡不收费
|
一级毛片高清免费播放
|
亚洲精品成人片在线播放
|
久久久久久毛片免费播放
|
日韩亚洲国产高清免费视频
|
国产成人在线免费观看
|
丝瓜app免费下载网址进入ios
|
亚洲国产精品高清久久久
|
中文字幕免费视频
|
亚洲精品无码高潮喷水A片软
|
亚洲精品色婷婷在线影院
|
日韩免费无码一区二区三区
|
亚洲国产欧美日韩精品一区二区三区
|
国产高清视频在线免费观看
|
一个人看的www在线免费视频
|
亚洲成色WWW久久网站
|
欧美a级成人网站免费
|
女人裸身j部免费视频无遮挡
|
亚洲国产第一页www
|
成人免费毛片观看
|
在线观看肉片AV网站免费
|
亚洲AV色吊丝无码
|
亚洲中文字幕无码久久综合网
|