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