1. 程式人生 > >Mybatis-generator常用的幾個內建外掛

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方法效能還挺高哦~~)

好了,這篇文章先到這裡吧,下面再來說說怎麼自己寫一個外掛吧;