Mybatis-generator常用的幾個內置插件

Plugin能夠用來在MyBatis Generator生成Java和XML文件過程中修改或者添加內容;Plugin必須實現org.mybatis.generator.api.Plugin接口,在這個接口中提供了非常多的方法,所以,很自然,MBG提供了一個適配器org.mybatis.generator.api.PluginAdapter,一般情況下只需要繼承這個適配器即可;
MBG已經提供了一些內置的Plugin(這些Plugin是我們學習插件的非常好的示例),這些插件都在org.mybatis.generator.plugins包中;要能夠寫自己的插件,最重要的是瞭解插件的執行過程(生命週期)。

插件的生命週期

插件擁有一個生命週期,在MBG初始化和生成的過程中,會有序的調用Plugin上不同的方法。插件的生命週期如下:

使用默認構造器創建;
setContext方法調用,注入生成器上下文;
setProperties方法調用,傳入在配置文件中插件的參數;
validate方法調用,該方法一般用於驗證傳給參數的正確性,如果該方法返回false,則該插件結束執行;
針對context中配置的每一個table:
initialized方法被調用,用於初始化操作,傳入IntrospectedTable;
Java Client Methods被調用(這個地方需要注意一下,這裏的Java Client Method調用和下面的Model Method,SQL Map Method的調用的前提是針對該table配置是分別需要生成client,model和SQL的,如果一個table不需要生成java client,那麼這個階段就忽略,下面兩個階段同理):
clientXXXMethodGenerated(Method, TopLevelClass, IntrospectedTable)方法調用(比如clientCountByExampleMethodGenerated方法),這些方法其實就是對應Java DAO中生成對應方法時調用(那個TopLevelClass其實就是對Java類的DOM封裝)【注意】,這些方法主要針對ibatis;
clientXXXMethodGenerated(Method, Interface, IntrospectedTable)方法調用(比如clientCountByExampleMethodGenerated方法),這些方法其實就是對應Java中Mapper生成對應方法時調用;通過返回true和false來代表該方法是否需要生成;
-clientGenerated(Interface, TopLevelClass, IntrospectedTable)方法調用;
Model Methods被調用:
對每一個字段依次調用modelFieldGenerated
, modelGetterMethodGenerated
, modelSetterMethodGenerated方法(就不一個一個詳細解釋了,看名字就看得出來在幹嘛)
modelExampleClassGenerated(TopLevelClass, IntrospectedTable):用於創建XXXExample類;TopLevelClass參數同理,也是就是生成XXXExample類的DOM;
modelPrimaryKeyClassGenerated(TopLevelClass, IntrospectedTable):用於創建那個主鍵(KeyClass)類;
modelBaseRecordClassGenerated(TopLevelClass, IntrospectedTable):用於創建那個Record class(主Class)類;
modelRecordWithBLOBsClassGenerated(TopLevelClass, IntrospectedTable):用於創建包含所有BLOB列的類;
-如果要修改這些類的生成結果,就是去修改TopLevelClass這個DOM的結構而已;
SQL Map Methods:這些方法主要是在生成SQL 那個mapper.xml文件時調用;
sqlMapXXXElementGenerated(XmlElement, IntrospectedTable),比如sqlMapDeleteByExampleElementGenerated,其實就是在XML文件中生成對應SQL元素的時候調用該方法,我們要修改生成的SQL或者元素內容,其實就是修改那個XmlElement,XmlElement是MBG對XML文件的DOM封裝;
sqlMapDocumentGenerated(Document, IntrospectedTable)
sqlMapDocument(GeneratedXmlFile, IntrospectedTable),這兩個方法都是最後生成XML的時候調用;
contextGenerateAdditionalJavaFiles(IntrospectedTable)方法調用(生成額外的Java文件,MBG自己是沒有實現這個方法的,提供給插件一個擴展機會);
contextGenerateAdditionalXmlFiles(IntrospectedTable)方法調用(同理,生成額外的XML文件,MBG自己是沒有實現這個方法的,提供給插件一個擴展機會)
contextGenerateAdditionalJavaFiles()方法調用,同contextGenerateAdditionalJavaFiles(IntrospectedTable)方法,只是沒有參數而已;
-contextGenerateAdditionalXmlFiles()方法調用,同contextGenerateAdditionalXmlFiles(IntrospectedTable)方法,只是沒有提供參數;
開發插件

開發插件最好的方法就是繼承org.mybatis.generator.api.PluginAdapter,然後只擴展自己需要擴展的方法;
實現自己的方法,可以用來修改默認的MBG生成好的代碼,或者添加自己額外需要生成的代碼,一般可以在插件中完成:

可以使用自己的註解來輔助生成代碼;
可以在類上面添加一些方法來輔助生成代碼;
可以添加一些XML中的元素的屬性配置;
可以添加一些額外的XML文件或者Java文件(比如一個例子就是生成MyBatisConfig.xml文件);
再次提醒,contextXXX方法總是會被調用,而Java Client Method,Model Method和SQL Map Method是根據配置的MBG參數來選擇性的執行;比如如果配置的是flat生成樣式,那麼modelPrimaryKeyClassGenerated(TopLevelClass, IntrospectedTable)方法就不會被調用;
特別注意,如果一個方法返回的是boolean類型的,那麼,如果該方法返回false,這個方法對應生成的代碼片段(JAVA或者XML)就不會被生成了,並且,如果一個plugin返回了false,就會阻止其他的plugin的相同方法的繼續執行,換句話說,配置在generatorConfig.xml中的plugin元素是有序的,這點需要特別注意。

MBG提供的內置的插件

在MBG中,提供了一些插件,是我們很好的學習的素材,簡單介紹下這些內置的插件:

org.mybatis.generator.plugins.CachePlugin

這個插件是一個挺有用的插件,用來生成在XML中的元素(這個插件只針對MyBatis3/MyBatis3Simple有效哈);
很顯然,這個插件需要一些配置,支持的配置屬性有:cache_eviction,cache_flushInterval,cache_readOnly,cache_size,cache_type,具體就不解釋了,和cache元素的屬性一一對應;
很好的一點,在

元素中,可以通過定義property元素,來覆蓋元素中提供的默認值;

org.mybatis.generator.plugins.CaseInsensitiveLikePlugin

這個插件用來在XXXExample類中生成大小寫敏感的LIKE方法(插件本身用處不大,但是我們可以通過這個插件學習給XXXExample類添加額外的方法)

org.mybatis.generator.plugins.EqualsHashCodePlugin

很明顯,這個插件用來給Java模型生成equals和hashcode方法;注意下,如果Domain類有rootClass,需要重新處理下生成的代碼(因爲MBG是不會考慮rootClass相關內容的,甚至都不會加載rootClass,可以參考配置文件中rootClass相關說明);

org.mybatis.generator.plugins.MapperConfigPlugin

比較有用的一個插件,可以用來幫助生成一個默認的MapperConfig.xml文件骨架,在這個骨架文件中完成了本次生成的mapper.xml文件的配置;
該插件支持的配置屬性有:

fileName:配置文件名稱,默認爲MapperConfig.xml;
targetPackage:配置文件所在的包,同MBG配置文件中的所有targetPackage配置;
targetProject:配置文件所在目錄,同MBG配置文件中的所有targetProject配置;
org.mybatis.generator.plugins.RenameExampleClassPlugin

這個插件可以使用正則表達式的方式來重命名生成的XXXExample類,通過配置 searchString和replaceString屬性來完成(這個實現原理請參考MBG配置文件中的columnRenamingRule元素),
一個例子,比如要xxxExample改成xxxCriteria,只需要配置:



org.mybatis.generator.plugins.RowBoundsPlugin

這個插件可以生成一個新的selectByExample方法,這個方法可以接受一個RowBounds參數,主要用來實現分頁(當然,我們後面會生成我們自己的分頁查詢函數),這個插件只針對MyBatis3/MyBatis3Simple有效哈;

org.mybatis.generator.plugins.SerializablePlugin

這個插件主要用來爲生成的Java模型類添加序列化接口,並生成serialVersionUID字段;
有兩個配置項:

addGWTInterface:這個是針對GWT的,我們忽略;
suppressJavaInterface:這個參數是必須要填的,我們設置爲false就可以了;
org.mybatis.generator.plugins.ToStringPlugin

這個插件顧名思義,爲生成的Java模型創建一個toString方法,(PS:一個挺有用的插件,而且這個插件生成的toString方法性能還挺高哦~~)

好了,這篇文章先到這裏吧,下面再來說說怎麼自己寫一個插件吧;

作者:小碼哥Java學院
鏈接:http://www.jianshu.com/p/1b826d43dbaf
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章