MyBatis Generator 基礎(chǔ)擴展

【原創(chuàng)文章,轉(zhuǎn)載請注明原文章地址,謝謝圾亏!】

Paste_Image.png

MyBatis Generator 本身在設(shè)計的時候就考慮到了基礎(chǔ)的擴展能力类少,在MBG中提供了不少可以直接擴展的擴展點叙身,了解這些擴展點對進一步理解MBG工作原理會有不少幫助,下面先簡單描述一下MBG文檔中關(guān)于擴展的部分內(nèi)容:

擴展MyBatis Generator##

MBG被設(shè)計成非常靈活瞒滴,便于擴展的框架曲梗,在MBG中,所有的XML和JAVA代碼的生成都是設(shè)計成DOM形式的妓忍,分別放在下面兩個包中:

  • Java DOM在org.mybatis.generator.api.dom.java包中虏两;
  • XML DOM在org.mybatis.generator.api.dom.xml包中;

什么意思世剖?簡單點說定罢,就是MBG默認(rèn)的生成代碼的方式,并不是使用類似FreeMarker或者Velocity這樣的模板生成代碼旁瘫,而是完全把要生成的代碼(XML DOM很好理解祖凫,特別是Java)代碼,封裝成了一個一個的類似DOM的結(jié)構(gòu)酬凳,然后根據(jù)封裝好的這個DOM結(jié)構(gòu)惠况,來生成Java和XML代碼;這樣做很難把所有的結(jié)構(gòu)都考慮在內(nèi)宁仔,但是對于生成代碼來說稠屠,基本足夠了。同時翎苫,MyBatis還提供了很多擴展點权埠,適合各種級別的擴展。

擴展MBG一般有兩種方式煎谍,一種方式就是使用繼承MBG中關(guān)鍵類來實現(xiàn)攘蔽,另一種就是通過MBG提供了Plugin方式擴展,一般情況下建議使用Plugin就可以基本完成大部分的擴展內(nèi)容呐粘,如果真的要做很大的改動满俗,可以使用繼承的方式转捕;

使用繼承方式的擴展點##

下面要列出的是MBG中提供了擴展點,通過實現(xiàn)這些接口或者繼承這些類漫雷,并在配置文件中配置瓜富,就可以達到擴展MBG的目的:

org.mybatis.generator.api.IntrospectedTable###

IntrospectedTable是MBG提供的一個比較基礎(chǔ)的擴展類,相當(dāng)于可以重新定義一個runtime降盹,同時与柑,IntrospectedTable也是一個比較低級的擴展點,比較適合做低級的擴展蓄坏,比如想使用FreeMarker或者Velocity來生成代碼(這個也是我們后面想要的)价捧;
如果你要通過繼承IntrospectedTable完成擴展,你需要自己來實現(xiàn)生成XML和Java代碼的所有代碼涡戳,在該類中提供了一個org.mybatis.generator.internal.rules.Rules類结蟋,來提供基礎(chǔ)的生成規(guī)則的查詢;
在MBG中渔彰,提供了幾種默認(rèn)的IntrospectedTable的實現(xiàn)嵌屎,其實在context上設(shè)置的runtime對應(yīng)的就是不同的IntrospectedTable的實現(xiàn),下面就是幾種runtime和對應(yīng)的IntrospectedTable關(guān)系:

  • MyBatis3 (default):org.mybatis.generator.codegen.mybatis3.IntrospectedTableMyBatis3Impl
  • MyBatis3Simple:
    org.mybatis.generator.codegen.mybatis3.IntrospectedTableMyBatis3SimpleImpl
  • Ibatis2Java2:org.mybatis.generator.codegen.ibatis2.IntrospectedTableIbatis2Java2Impl
  • Ibatis2Java5:org.mybatis.generator.codegen.ibatis2.IntrospectedTableIbatis2Java5Impl
    注意恍涂,其中的IntrospectedTableMyBatis3Impl和IntrospectedTableMyBatis3SimpleImpl兩個類是值得我們在自己擴展前仔細閱讀的宝惰;

當(dāng)擴展了自己的IntrospectedTable之后,就可以在context的runtime中配置自己的實現(xiàn)類的全限定名即可再沧;

org.mybatis.generator.api.IntrospectedColumn###

IntrospectedColumn類主要用于解析和包裝表中的一個列的信息尼夺,這些信息主要通過DataBase MetaData獲得;如果需要重新寫一個IntrospectedTable類的話炒瘸,一般會重寫該類淤堵;只需要在context元素的introspectedColumnImpl屬性中寫該類的全限定名即可完成配置;

org.mybatis.generator.api.JavaTypeResolver###

JavaTypeResolver類主要用于Jdbc類型和Java類型的一個映射關(guān)系顷扩;默認(rèn)的實現(xiàn)是org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl拐邪;完成自己的擴展后,只需要在context元素中javaTypeResolver 子元素中配置該類的全限定名即可隘截;

org.mybatis.generator.api.ShellCallback###

ShellCallback主要提供了兩個方面的功能:

  • 把project屬性或者package屬性翻譯成目錄結(jié)構(gòu)(MBG中面對的還是文件結(jié)構(gòu))庙睡;
  • 當(dāng)Java或者XML文件存在的時候,負責(zé)怎么處理這些重復(fù)的文件技俐;
    該接口的默認(rèn)實現(xiàn)為org.mybatis.generator.internal.DefaultShellCallback,默認(rèn)的這個實現(xiàn)只提供了把project和package直接翻譯成文件結(jié)構(gòu)统台,如果某些文件夾不存在雕擂,則創(chuàng)建,另外對于重復(fù)存在的文件贱勃,默認(rèn)實現(xiàn)也只能選擇覆蓋或者忽略井赌;
    如果你想把MBG集成在其他應(yīng)用環(huán)境中谤逼,這是一個相當(dāng)值得擴展的類,比如在eclipse中仇穗,可以方便的擴展該接口來處理文件方法合并的功能流部;
    但是注意一點,該擴展在generatorConfig XML文件中默認(rèn)沒有提供配置的地方纹坐,只能通過在org.mybatis.generator.api.MyBatisGenerator的構(gòu)造方法中自己去創(chuàng)建一個(該類主要用于實際的生成動作枝冀,換句話說,要擴展這個擴展點耘子,就必須要自己去實現(xiàn)一個運行MBG的代碼果漾,比如自己實現(xiàn)一個Ant應(yīng)用或者Maven插件,可以參考o(jì)rg.mybatis.generator.api.ShellRunner來實現(xiàn)自己的啟動類谷誓,PS:這個ShellRunner其實就是直接使用命令行運行MBG的那個main入口類)绒障;

org.mybatis.generator.api.ProgressCallback###

ProgressCallback類也是一個很有用的擴展點,當(dāng)MBG在生成的過程當(dāng)中捍歪,會不斷的調(diào)用這個接口里面的指定方法户辱,簡單說,這個類非常適合用來做MBG生成的進度條顯示糙臼;默認(rèn)的實現(xiàn)是org.mybatis.generator.internal.NullProgressCallback庐镐,即簡單的忽略所有的進度消息,可以通過實現(xiàn)這個接口完成自己的進度提醒甚至可以在中途取消代碼的生成進度弓摘;
同樣焚鹊,該類也不能直接在generatorConfig.xml中配置,需要在org.mybatis.generator.api.MyBatisGenerator.generate()方法中傳一個ProgressCallback類的實例即可韧献;

下面一篇就是介紹MBG的plugin機制末患,我們會了解這個接口,研究一個示例锤窑,并自己完成一個Plugin璧针。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市渊啰,隨后出現(xiàn)的幾起案子探橱,更是在濱河造成了極大的恐慌,老刑警劉巖绘证,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隧膏,死亡現(xiàn)場離奇詭異,居然都是意外死亡嚷那,警方通過查閱死者的電腦和手機胞枕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魏宽,“玉大人腐泻,你說我怎么就攤上這事决乎。” “怎么了派桩?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵构诚,是天一觀的道長。 經(jīng)常有香客問我铆惑,道長范嘱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任鸭津,我火速辦了婚禮彤侍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逆趋。我一直安慰自己盏阶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布闻书。 她就那樣靜靜地躺著名斟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪魄眉。 梳的紋絲不亂的頭發(fā)上砰盐,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天,我揣著相機與錄音坑律,去河邊找鬼岩梳。 笑死,一個胖子當(dāng)著我的面吹牛晃择,可吹牛的內(nèi)容都是我干的冀值。 我是一名探鬼主播,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼宫屠,長吁一口氣:“原來是場噩夢啊……” “哼列疗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浪蹂,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抵栈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坤次,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體古劲,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年缰猴,在試婚紗的時候發(fā)現(xiàn)自己被綠了绢慢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胰舆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蹬挤,我是刑警寧澤缚窿,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站焰扳,受9級特大地震影響倦零,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吨悍,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一扫茅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧育瓜,春花似錦葫隙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至焰手,卻和暖如春糟描,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背书妻。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工船响, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躲履。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓见间,卻偏偏與公主長得像,于是被迫代替她去往敵國和親崇呵。 傳聞我的和親對象是個殘疾皇子缤剧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,442評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,271評論 25 707
  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL域慷、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,527評論 0 4
  • Swift版本點擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,409評論 7 249
  • 焦點網(wǎng)絡(luò)三期中級班 翟沖【原創(chuàng)】分享第321天 2017.11.14 狼來了,狼來了叠骑,喊了好長時間李皇,狼似乎又...
    春暖花開zc閱讀 302評論 0 0
  • 我喜歡和我爸媽大聲說話,也喜歡叫我爸媽的名字和各種小外號,也要吵吵架掉房,是吵架不過三分鐘就立馬破功的那種茧跋。經(jīng)常也看我...
    肖太陽啊閱讀 139評論 0 0