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