【原創(chuàng)文章,轉(zhuǎn)載請注明原文章地址,謝謝圾亏!】
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璧针。