MyBatis Generator介紹

MyBatis Generator中文文檔地址:html

http://generator.sturgeon.mopaas.com/java

該中文文檔因爲儘量和原文內容一致,因此有些地方若是不熟悉,看中文版的文檔的也會有必定的障礙,因此本章根據該中文文檔以及實際應用,使用通俗的語言來說解詳細的配置。mysql

本文使用Markdown進行編輯,可是博客顯示效果很差,因此建議移步這裏進行閱讀

本文是做爲我的籌劃的《Mybatis最佳實踐》(gitbook)其中的一節。

本文中全部節點的連接都是對應的中文文檔地址,能夠點擊查看詳細信息。

下載本文檔的PDF版本
git

注:本文後面提到的**MBG**所有指代MyBatis Generator。sql

運行MyBatis Generator

有4種運行MBG的方法,具體請看文檔 運行 MyBatis Generator數據庫

MBG下載地址:http://repo1.maven.org/maven2/org/mybatis/generator/mybatis-generator-core/api

後續會專門爲gitbook完善此部分mybatis

XML配置詳解

在MBG中,最主要也最重要的就是XML配置文件,所以本篇文章主要的內容就是XML配置。app

這裏按照配置的順序對配置逐個講解,更細的內容能夠配合中文文檔參照。框架

1. 配置文件頭

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

使用最新版的MBG須要使用上面的xml頭,配置文件必須包含上面的<generatorConfiguration>

 

<generatorConfiguration>
    <!-- 具體配置內容 -->
</generatorConfiguration>  

3. <generatorConfiguration>子元素

從這段開始,就是配置的主要內容,這些配置都是 包含如下子元素(有嚴格的順序):

  1. <properties> (0個或1個)

  2. <classPathEntry> (0個或多個)

  3. <context> (1個或多個)

3.1 <properties> 元素

這個元素用來指定外部的屬性元素,不是必須的元素。

元素用於指定一個須要在配置中解析使用的外部屬性文件,引入屬性文件後,能夠在配置中使用 targetProject屬性會頗有用。

這個屬性能夠經過url來指定屬性文件的位置,這兩個屬性只能使用其中一個來指定,同時出現會報錯。

  • com/myproject/generatorConfig.properties這樣的屬性值。

  • file:///C:/myfolder/generatorConfig.properties

3.2 <classPathEntry> 元素

這個元素能夠0或多個,不受限制。

這個元素的做用是將MBG運行時須要用到的jar包(或zip格式)添加到**classpath**下。

最多見的用法是,當**classpath**下面**沒有**JDBC驅動的時候,咱們一般經過這個屬性指定驅動的路徑,例如:

 

若是須要用到其餘的jar包,也能夠這麼配置,例如若是你開發了一個MBG的插件,你就能夠經過這種方式加入到**classpath**

這裏注意上面重點強調的 沒有,通常在項目中使用的時候,**classpath**下面都有JDBC驅動,所以從項目中啓動的時候不須要配置該項。

建議:因爲該參數使用了絕對路徑,所以不利用在不一樣電腦上通用,所以建議最好把須要的jar包放到項目的**classpath**下,避免每一個人都得單獨配置路徑。

3.3 <context> 元素

在MBG的配置中,至少須要有一個<context>元素。

<context>

該元素只有一個**必選屬性**<context>元素,該 此外還有幾個**可選屬性**:

  • 這個屬性有如下可選值:

    • hierarchical相似,除了若是那個單獨的類將只包含一個字段,將不會生成一個單獨的類。 所以,若是一個表的主鍵只有一個字段,那麼不會爲該字段生成單獨的實體類,會將該字段合併到基本實體類中。
    •  

  • org.mybatis.generator.api.IntrospectedColumn該類的實現類。該屬性的做用能夠查看擴展MyBatis Generator

通常狀況下,咱們使用以下的配置便可:

 

若是你但願不生成和

 

使用<table>中逐個進行配置(後面會提到)。

MBG配置中的其餘幾個元素,基本上都是<context>的子元素,這些子元素(有嚴格的配置順序)包括:

其中<property>屬性前,咱們先看看**什麼是分隔符?**。

這裏經過一個例子說明。假設在Mysql數據庫中有一個表名爲select * from user info這樣的語句,確定是要報錯的,在Mysql中的時候咱們通常會寫成以下的樣子:

這裏的使用的**反單引號(`)**就是**分隔符**,**分隔符**能夠用於**表名**或者**列名**。

 

下面繼續看<property>支持的屬性:

  • 因爲這些屬性比較重要,這裏一一講解。

     

    首先是 而後這裏繼續上面的例子來說endingDelimiter屬性。
    因爲endingDelimiter的默認值爲雙引號(

     
        

屬性 最後兩個xmlFormatter屬性**可能會**頗有用,若是你想使用模板來定製生成的java文件和xml文件的樣式,你能夠經過指定這兩個屬性的值來實現。

接下來分節對其餘的子元素逐個進行介紹。

3.3.1 <plugin> 元素

該元素能夠配置0個或者多個,不受限制。

<plugin>元素用來定義一個插件。插件用於擴展或修改經過MyBatis Generator (MBG)代碼生成器生成的代碼。

插件將按在配置中配置的順序執行。

有關插件的詳細信息能夠參考開發插件提供的插件瞭解更多。

3.3.2 <commentGenerator> 元素

該元素最多能夠配置1個。

這個元素很是有用,相信不少人都有過這樣的需求,就是但願MBG生成的代碼中能夠包含**註釋信息**,具體就是生成表或字段的備註信息。

使用這個元素就能很簡單的實現咱們想要的功能。這裏先介紹該元素,介紹完後會舉例如何擴展實現該功能。

該元素有一個可選屬性org.mybatis.generator.api.CommentGenerator接口。並且必有一個默認的構造方法。這個屬性接收默認的特殊值org.mybatis.generator.internal.DefaultCommentGenerator

默認的實現類中提供了兩個可選屬性,須要經過<property>屬性進行配置。

  • false
  • false

通常狀況下因爲MBG生成的註釋信息沒有任何價值,並且有時間戳的狀況下每次生成的註釋都不同,使用**版本控制**的時候每次都會提交,於是通常狀況下咱們都會屏蔽註釋信息,能夠以下配置:

<commentGenerator>
    <property name="suppressAllComments" value="true"/>
    <property name="suppressDate" value="true"/>
</commentGenerator>

接下來咱們簡單舉例實現生成包含表字段註釋信息的註釋

由於系統提供了一個默認的實現類,因此對咱們來講,本身實現一個會很容易,最簡單的方法就是複製默認實現類代碼到一個新的文件中,修改類名如 咱們經過下面一個方法的修改來了解,其餘幾個方法請自行修改(寫本章的時候我也沒有徹底實現該類,因此不提供完整源碼了):

 

這個方法是給字段添加註釋信息的,其中getRemarks方法能夠獲取字段的註釋信息。上面這個方法修改起來仍是很容易的。除了字段的註釋外還有Setter,以及類的註釋。此外還有生成XML的註釋,你們能夠根據默認的實現進行修改。

完成咱們本身的實現類後,咱們還須要作以下配置:

 
3.3.3 <jdbcConnection> 元素

<jdbcConnection>用於指定數據庫鏈接信息,該元素必選,而且只能有一個。

配置該元素只須要注意若是JDBC驅動不在**classpath**下,就須要經過<classPathEntry>元素引入jar包,這裏**推薦**將jar包放到**classpath**下。

該元素有兩個必選屬性:

  • 該元素還有兩個可選屬性:

     

    • 此外該元素還能夠接受多個<property>屬性都會添加到JDBC驅動的屬性中。

       

      這個元素配置起來最容易,這裏舉個簡單例子:

       
      3.3.4 <javaTypeResolver> 元素

      該元素最多能夠配置一個。

      這個元素的配置用來指定JDBC類型和Java類型如何轉換。

      該元素提供了一個可選的屬性<commentGenerator>比較類型,提供了默認的實現 該屬性還有一個能夠配置的<property>元素。

      能夠配置的屬性爲DECIMALjava.math.BigDecimal,默認值爲 默認狀況下的轉換規則爲:

      1. 若是長度>18,就會使用若是10<=長度<=18,就會使用若是5<=長度<=9,就會使用若是長度<5,就會使用 若是設置爲java.math.BigDecimal,配置示例以下:

         

        <javaTypeResolver >
            <property name="forceBigDecimals" value="true" />
        </javaTypeResolver>
        
        3.3.5 <javaModelGenerator> 元素

        該元素必須配置一個,而且最多一個。

        該元素用來控制生成的實體類,根據defaultModelType,一個表可能會對應生成多個不一樣的實體類。一個表對應多個類實際上並不方便,因此前面也推薦使用 該元素只有兩個屬性,都是必選的。

        • <table>中會提到)。
        • 該元素支持如下幾個<property>子元素屬性:

           

          • MyBatis3有效,若是false就會使用false
          • true,MBG會根據schema來生成子包。若是targetPackage屬性。默認爲true,那麼setter方法。若是爲false
          • rootClass,那麼MBG不會覆蓋和父類中徹底匹配的屬性。匹配規則:

            • 屬性名徹底相同
            • 屬性類型相同
            • 屬性有屬性有

              trim操做,若是設置爲public void setUsername(String username) {this.username = username == null ? null : username.trim();}false

            配置示例以下:

             
                        
            3.3.6 <sqlMapGenerator> 元素

            該元素可選,最多配置一個。可是有以下兩種必選的特殊狀況:

            • 若是
            • 若是<javaClientGenerator>須要XML時,該元素必須配置一個。 若是沒有配置
              • 若是指定了一個若是沒有指定

            該元素只有兩個屬性(和前面提過的<javaModelGenerator>的屬性含義同樣),都是必選的。

            • <table>中會提到)。
            • 該元素支持<property>子元素,只有一個能夠配置的屬性:

               

              • true,MBG會根據schema來生成子包。若是targetPackage屬性。默認爲 配置示例:

                 

                 
                                
                3.3.7 <javaClientGenerator> 元素

                該元素可選,最多配置一個。

                若是不配置該元素,就不會生成Mapper接口。

                該元素有3個必選屬性:

                • org.mybatis.generator.codegen.AbstractJavaClientGenerator類,必選有一個默認的構造方法。 該屬性提供瞭如下預約的代碼生成器,首先根據targetRuntime分紅三類:
                  • MyBatis3:
                    • ANNOTATEDMAPPER:基於註解的Mapper接口,不會有對應的XML映射文件
                    • MIXEDMAPPER:XML和註解的混合形式,(上面這種狀況中的)XMLMAPPER:全部的方法都在XML中,接口調用依賴XML文件。
                  • MyBatis3Simple:
                    • ANNOTATEDMAPPER:基於註解的Mapper接口,不會有對應的XML映射文件
                    • XMLMAPPER:全部的方法都在XML中,接口調用依賴XML文件。
                  • Ibatis2Java2或**Ibatis2Java5**:
                    • IBATIS:生成的對象符合iBATIS的DAO框架(不建議使用)。
                    • GENERIC-CI:生成的對象將只依賴於SqlMapClient,經過構造方法注入。
                    • GENERIC-SI:生成的對象將只依賴於SqlMapClient,經過SPRING:生成的對象符合Spring的DAO接口
                • <table>中會提到)。
                • 該元素還有一個可選屬性:

                   

                  • 該元素支持<property>子元素設置的屬性:

                     

                    • 這幾個屬性不太經常使用,具體做用請看完整的文檔,這裏對 <table>配置的 這個屬性對於通用Mapper來講,可讓生成的全部接口都繼承該接口。

                       

                      配置示例:

                       
                      3.3.8 <table> 元素

                      該元素至少要配置一個,能夠配置多個。

                      該元素用來配置要經過內省的表。只有配置的纔會生成實體類和其餘文件。

                      該元素有一個必選屬性:

                      • SQL通配符匹配多個表。

                      例如要生成所有的表,能夠按以下配置:

                       

                      該元素包含多個可選屬性:

                      • SQL通配符匹配。若是設置了該值,生成SQL的表名會變成如catalog.tableName的形式。
                      • <context><context>false
                      • false。當schematrue
                      • false

                      該元素包含多個可用的<property>子元素,可選屬性爲:

                      • <javaModelGenerator>中的屬性含義同樣。
                      • schema<javaModelGenerator>中的屬性含義同樣。
                      • true就不會有Mapper接口。若是配置了modelOnly<resultMap>)。若是爲enableXXX方法,將不會生成任何CRUD方法。
                      • <javaModelGenerator>中的屬性含義同樣。
                      • <javaClientGenerator>中的屬性含義同樣。
                      • catalog,當生成表和運行環境的表的schema,當生成表和運行環境的表的tableName,當生成表和運行環境的表的selectAll方法後的SQL中,會直接跟 除了<table>還包含如下子元素:

                         

                        下面對這4個元素進行詳細講解。

                        1. <generatedKey> 元素

                        這個元素最多能夠配置一個。
                        這個元素用來指定自動生成主鍵的屬性(identity字段或者sequences序列)。若是指定這個元素,MBG在生成insert的SQL映射文件中插入一個<selectKey>元素。 這個元素**很是重要**,這個元素包含下面兩個必選屬性:

                          • Cloudscape
                          • DB2
                          • DB2_MF
                          • Derby
                          • HSQLDB
                          • Informix
                          • MySql
                          • SqlServer
                          • SYBASE
                          • JDBC:這會配置MBG使用MyBatis3支持的JDBC標準的生成key來生成代碼。 這是一個獨立於數據庫獲取標識列中的值的方法。 重要: 只有當目標運行爲MyBatis3時纔會產生正確的代碼。 若是與iBATIS2一塊兒使用目標運行時會產生運行時錯誤的代碼。

                        這個元素還包含兩個可選屬性:

                        • true時,該列會被標記爲<selectKey>元素會被插入在false時,insert以前(一般是序列)。**重要**: 即便您post,您仍然須要爲true。 這將標誌MBG從插入列表中刪除該列。默認值是type=post and identity=true的時候生成的order=AFTER,當identity只能爲false,生成的order=BEFORE。能夠這麼理解,自動增加的列只有插入到數據庫後才能獲得ID,因此是BEFORE

                        配置示例一:

                         

                        對應的生成的結果:

                         

                        配置示例二:

                         

                        對應的生成結果:

                         

                        2. <columnRenamingRule> 元素

                        該元素最多能夠配置一個,使用該元素能夠在生成列以前,對列進行重命名。這對那些存在同一前綴的字段想在生成屬性名時去除前綴的表很是有用。 例如假設一個表包含如下的列:

                        • 生成的全部屬性名中若是都包含
                           

注意,在內部,MBG使用<columnRenamingRule>)會被忽略。<columnOverride>優先於重命名的規則。

該元素有一個必選屬性:

  • 該元素有一個可選屬性:

     

    關於<property>屬性 3. <columnOverride> 元素

    該元素可選,能夠配置多個。

    該元素從將某些屬性默認計算的值更改成指定的值。

    該元素有一個必選屬性:

    該元素有多個可選屬性:

    • STRT_DTE,MBG會根據useActualColumnNames屬性生成strtDte
    • JavaTypeResolver計算出的類型。 對某些數據庫來講,這是必要的用來處理**「奇怪的」**數據庫類型(例如MySql的java.lang.Object)。
    • INTEGER, DECIMAL, NUMERIC, VARCHAR等等)。 若是須要,這能夠覆蓋由LONGVARCHAR類型須要爲iBATIS 映射爲TypeHandler類或 配置示例:

       

       

      4. <ignoreColumn> 元素

      該元素可選,能夠配置多個。

      該元素能夠用來屏蔽不須要生成的列。

      該元素有一個必選屬性:

      該元素還有一個可選屬性:

      • true則區分。默認值爲

      MyBatis Generator最佳實踐

      本節內容針對MyBatis3,使用iBATIS的不必定適用。

      如下根據我的經驗(對此有意見的能夠留言)對一些配置見解列出以下幾點:

      1. 關於Example方法雖然很強大,可是SQL不易管理,所以不建議使用。

      2. 取消<table>上的<context>上設置

        關於實體類的defaultModelType="flat",只有一個對象的狀況下管理畢竟方便,使用也簡單。

      3. 關於註釋@mbggenerated,MBG經過該字符串來判斷代碼是否爲代碼生成器生成的代碼,有該標記的的代碼在從新生成的時候會被刪除,不會重複。不會在XML中出現重複元素。

      4. 使用MBG生成的代碼時,建議儘量不要去修改自動生成的代碼,並且要生成帶有

        仍然是註釋相關,在suppressAllComments屬性(使用默認值true)時間戳

        <classPathEntry>來引入jar包,主要考慮到全部開發人員的統一性。

      5. 當數據庫字段使用<javaModelGenerator>中設置<property name="trimStrings" value="true" />,能夠自動去掉沒必要要的空格。

      6. type="XMLMAPPER",不建議使用註解或混合模式,比較代碼和SQL徹底分離易於維護。

      7. 建議儘量在<generatedKey>,避免手工操做,以便於MBG重複執行代碼生成。

      若是有其餘有價值的經驗,會繼續補充。

      綜合以上信息,這裏給出一個

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE generatorConfiguration
              PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
              "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
      
      <generatorConfiguration> <context id="MysqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat"> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <commentGenerator> <property name="suppressDate" value="true"/> </commentGenerator> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test" userId="root" password=""> </jdbcConnection> <javaModelGenerator targetPackage="test.model" targetProject="G:\MyProject\src\main\java"> <property name="trimStrings" value="true" /> </javaModelGenerator> <sqlMapGenerator targetPackage="test.xml" targetProject="G:\MyProject\src\main\resources"/> <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="G:\MyProject\src\main\java"/> <table tableName="%"> <generatedKey column="id" sqlStatement="Mysql"/> </table> </context> </generatorConfiguration> 

      id字段。若是不是全部表的配置都同樣,能夠作針對性的配置。

相關文章
相關標籤/搜索