mybatis Generator 實現與插件

PluginAdaptor 是適配器設計模式嗎?html

  • 首先我以爲是模板方法設計模式,用接口定義執行順序,你能夠對其中的一些方法作自定義開發
  • 從自定義開發方法,若是想在執行過程當中使用,必須知足接口要求的角度,這個也算適配器模式
  • 20190311 我的理解:
    • 是適配器,統一插件的擴展接口,使其可以適配上相應的位置,正確執行

程序入口:java

  • Main-Class: org.mybatis.generator.api.ShellRunner
  • 如上所示類org.mybatis.generator.api.ShellRunner   的main 方法就是咱們要解讀源碼的入口

主函數基本邏輯

  • 一、命令行參數是否合理並解析
  • 二、讀取xml配置文件並解析位內存數據以工使用
  • 三、實例化一個shell回調函數,用於執行過程當中的回調
  • 四、實例化一個mybatis代碼生成對象
  • 五、實例化一個過程回調函數,用因而否輸出過程日誌等處理(或根本不須要回調)
  • 六、調用生成方法生成代碼並保存爲相關文件

https://blog.csdn.net/u011781521/article/list/6 大神講解連接sql

插件shell

  • Plugin可以用來在MyBatis Generator生成Java和XML文件過程當中修改或者添加內容,Plugin必須實現org.mybatis.generator.api.Plugin接口,在這個接口中提供了很是多的方法,MBG還提供了一個適配器org.mybatis.generator.api.PluginAdapter,適配器類提供基本的插件支持,併爲大多數接口方法實現無操做方法,通常狀況下只須要繼承這個適配器便可

自帶插件舉例(具體參見官網http://www.mybatis.org/generator/reference/plugins.html):設計模式

  • org.mybatis.generator.plugins.CachePlugin###
    • sqlMap文件中,開啓二級緩存的做用
    • <cache 
      eviction="FIFO"  <!--回收策略爲先進先出-->
      flushInterval="60000" <!--自動刷新時間60s-->
      size="512" <!--最多緩存512個引用對象-->
      readOnly="true"/> <!--只讀-->

插件生命週期api

  • 在代碼生成過程的初始化過程當中建立插件,並按順序調用進程的不一樣階段
  • Plugin 接口定義了全部的插件接口,這些接口PluginAdapter抽象類大部分都實現了默認啥也不作的方法
  • 繼承PluginAdapter,而後作你想作的事情 

(第一種接口)Java客戶端方法:1,2緩存

  • 1.clientXXXMethodGenerated(Method,TopLevelClass,IntrospectedTable) - 這些方法被調用,由於生成了Java客戶端實現類的每一個方法。
  • 2.clientXXXMethodGenerated(Method,Interface,IntrospectedTable) - 這些方法被調用,由於生成了每一個Java客戶端接口的方法。
  • 3.clientGenerated(Interface,TopLevelClass,IntrospectedTable)方法調用 

(第二種接口)模型方法:1mybatis

  • 1.modelFieldGenerated,modelGetterMethodGenerated,modelSetterMethod爲類中的每一個字段生成
  • 2.modelExampleClassGenerated(TopLevelClass,IntrospectedTable)
  • 3.modelPrimaryKeyClassGenerated(TopLevelClass,IntrospectedTable)
  • 4.modelBaseRecordClassGenerated(TopLevelClass,IntrospectedTable)
  • 5.modelRecordWithBLOBsClassGenerated(TopLevelClass,IntrospectedTable) 

(第三種類型接口)SQL Map方法:1app

  • 1.sqlMapXXXElementGenerated(XmlElement,IntrospectedTable) - 這些方法被調用,由於SQL映射的每一個元素都被生成
  • 2.sqlMapDocumentGenerated(Document,IntrospectedTable)
  • 3.sqlMapDocument(GeneratedXmlFile,IntrospectedTable)
  • 4.contextGenerateAdditionalJavaFiles(IntrospectedTable)方法調用
  • 5.contextGenerateAdditionalXmlFiles(IntrospectedTable)方法調用
  • 6.contextGenerateAdditionalJavaFiles()方法調用
  • 7.contextGenerateAdditionalXmlFiles()方法調用 

詳細版:函數

1.使用默認構造器建立;

2.setContext方法調用,注入生成器上下文;

3.setProperties方法調用,傳入在配置文件中插件的參數;

4.validate方法調用,該方法通常用於驗證傳給參數的正確性,若是該方法返回false,則該插件結束執行;

5.針對context中配置的每個table:

6.initialized方法被調用,用於初始化操做,傳入IntrospectedTable;

7.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)方法調用;

8.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的結構而已;

9.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)方法,只是沒有提供參數;

注意:

  • 1 - 這些方法將被封裝的代碼生成器調用。
  • 若是您提供自定義代碼生成器,則只有在自定義代碼生成器調用它們時纔會調用這些方法。
  •  
  • 2 - Java客戶端方法只會被調用是一個Java客戶端生成器被配置。
  •  
  • 3.contextXXX方法老是會被調用,而Java Client Method,Model Method和SQL Map Method是根據配置的MBG參數來選擇性的執行;好比若是配置的是flat生成樣式,那麼modelPrimaryKeyClassGenerated(TopLevelClass, IntrospectedTable)方法就不會被調用;
  •  
  • 4.若是一個方法返回的是boolean類型的,那麼,若是該方法返回false,這個方法對應生成的代碼片斷(JAVA或者XML)就不會被生成了,而且,若是一個plugin返回了false,就會阻止其餘的plugin的相同方法的繼續執行,換句話說,配置在generatorConfig.xml中的plugin元素是有序的,這點須要特別注意。若是配置了多個插件,則從方法返回false的第一個插件將致使MyBatis Generator在全部其餘插件中中止調用該方法  
相關文章
相關標籤/搜索