MyBatis Generator

MyBatis Generator中文文檔

MyBatis Generator中文文檔地址:http://generator.sturgeon.mopaas.com/html

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

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

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

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

下載本文檔的PDF版本
mysql

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

運行MyBatis Generator

有4種運行MBG的方法,具體請看文檔 運行 MyBatis Generatorgithub

MBG下載地址:http://repo1.maven.org/maven2/org/mybatis/generator/mybatis-generator-core/正則表達式

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

XML配置詳解

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

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

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頭,配置文件必須包含上面的DOCTYPEmybatis


2. 根節點<generatorConfiguration>

generatorConfiguration節點沒有任何屬性,直接寫節點便可,以下:

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


3. <generatorConfiguration>子元素

從這段開始,就是配置的主要內容,這些配置都是generatorConfiguration元素的子元素。

包含如下子元素(有嚴格的順序):

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

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

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

3.1 <properties> 元素

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

元素用於指定一個須要在配置中解析使用的外部屬性文件,引入屬性文件後,能夠在配置中使用 ${property}這種形式的引用,經過這種方式引用屬性文件中的屬性值。 對於後面須要配置的**jdbc信息**和targetProject屬性會頗有用。

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

  • resource:指定**classpath**下的屬性文件,使用相似com/myproject/generatorConfig.properties這樣的屬性值。

  • url:能夠指定文件系統上的特定位置,例如file:///C:/myfolder/generatorConfig.properties

3.2 <classPathEntry> 元素

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

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

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

<classPathEntry location="E:\mysql\mysql-connector-java-5.1.29.jar"/>

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

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

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

3.3 <context> 元素

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

<context>元素用於指定生成一組對象的環境。例如指定要鏈接的數據庫,要生成對象的類型和要處理的數據庫中的表。運行MBG的時候還能夠指定要運行的<context>

該元素只有一個**必選屬性**id,用來惟一肯定一個<context>元素,該id屬性能夠在運行MBG的使用。

此外還有幾個**可選屬性**:

  • defaultModelType:**這個屬性很重要**,這個屬性定義了MBG如何生成**實體類**。
    這個屬性有如下可選值:

    • conditional:*這是默認值*,這個模型和下面的hierarchical相似,除了若是那個單獨的類將只包含一個字段,將不會生成一個單獨的類。 所以,若是一個表的主鍵只有一個字段,那麼不會爲該字段生成單獨的實體類,會將該字段合併到基本實體類中。

    • flat:該模型爲每一張表只生成一個實體類。這個實體類包含表中的全部字段。**這種模型最簡單,推薦使用。**

    • hierarchical:若是表有主鍵,那麼該模型會產生一個單獨的主鍵實體類,若是表還有BLOB字段, 則會爲表生成一個包含全部BLOB字段的單獨的實體類,而後爲全部其餘的字段生成一個單獨的實體類。 MBG會在全部生成的實體類之間維護一個繼承關係。

  • targetRuntime:此屬性用於指定生成的代碼的運行時環境。該屬性支持如下可選值:

    • MyBatis3:*這是默認值*

    • MyBatis3Simple

    • Ibatis2Java2

    • Ibatis2Java5 

    通常狀況下使用默認值便可,有關這些值的具體做用以及區別請查看中文文檔的詳細內容。

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

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

<context id="Mysql" defaultModelType="flat">

若是你但願不生成和Example查詢有關的內容,那麼能夠按照以下進行配置:

<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">

使用MyBatis3Simple能夠避免在後面的<table>中逐個進行配置(後面會提到)。

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

其中<property>屬性比較特殊,後面講解的時候都會和父元素一塊兒進行講解。在講解<property>屬性前,咱們先看看**什麼是分隔符?**。

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

select * from `user info`

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

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

  • autoDelimitKeywords

  • beginningDelimiter

  • endingDelimiter

  • javaFileEncoding

  • javaFormatter

  • xmlFormatter

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

首先是autoDelimitKeywords,當表名或者字段名爲SQL關鍵字的時候,能夠設置該屬性爲true,MBG會自動給表名或字段名添加**分隔符**。

而後這裏繼續上面的例子來說beginningDelimiterendingDelimiter屬性。
因爲beginningDelimiterendingDelimiter的默認值爲雙引號("),在Mysql中不能這麼寫,因此還要將這兩個默認值改成**反單引號(`)**,配置以下:

<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>

屬性javaFileEncoding設置要使用的Java文件的編碼,默認使用當前平臺的編碼,只有當生產的編碼須要特殊指定時才須要使用,通常用不到。

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

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

3.3.1 <plugin> 元素

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

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

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

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

3.3.2 <commentGenerator> 元素

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

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

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

該元素有一個可選屬性type,能夠指定用戶的實現類,該類須要實現org.mybatis.generator.api.CommentGenerator接口。並且必有一個默認的構造方法。這個屬性接收默認的特殊值DEFAULT,會使用默認的實現類org.mybatis.generator.internal.DefaultCommentGenerator

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

  • suppressAllComments:**阻止**生成註釋,默認爲false

  • suppressDate:**阻止**生成的註釋包含時間戳,默認爲false

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

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

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

由於系統提供了一個默認的實現類,因此對咱們來講,本身實現一個會很容易,最簡單的方法就是複製默認實現類代碼到一個新的文件中,修改類名如MyCommentGenerator,在你本身的實現類中,你能夠選擇是否繼續支持上面的兩個屬性,你還能夠增長對其餘屬性的支持。

咱們經過下面一個方法的修改來了解,其餘幾個方法請自行修改(寫本章的時候我也沒有徹底實現該類,因此不提供完整源碼了):

@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
    if (introspectedColumn.getRemarks() != null && !introspectedColumn.getRemarks().equals("")) {
        field.addJavaDocLine("/**");
        field.addJavaDocLine(" * " + introspectedColumn.getRemarks());
        addJavadocTag(field, false);
        field.addJavaDocLine(" */");
    }
}

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

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

<commentGenerator type="com.github.abel533.mybatis.generator.MyCommentGenerator"/>
3.3.3 <jdbcConnection> 元素

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

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

該元素有兩個必選屬性:

  • driverClass:訪問數據庫的JDBC驅動程序的徹底限定類名

  • connectionURL:訪問數據庫的JDBC鏈接URL

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

  • userId:訪問數據庫的用戶ID

  • password:訪問數據庫的密碼

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

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

<jdbcConnection driverClass="com.mysql.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/test"
                userId="root"
                password="">
</jdbcConnection>
3.3.4 <javaTypeResolver> 元素

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

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

該元素提供了一個可選的屬性type,和<commentGenerator>比較類型,提供了默認的實現DEFAULT,通常狀況下使用默認便可,須要特殊處理的狀況能夠經過其餘元素配置來解決,不建議修改該屬性。

該屬性還有一個能夠配置的<property>元素。

能夠配置的屬性爲forceBigDecimals,該屬性能夠控制是否強制DECIMALNUMERIC類型的字段轉換爲Java類型的java.math.BigDecimal,默認值爲false,通常不須要配置。

默認狀況下的轉換規則爲:

  1. 若是精度>0或者長度>18,就會使用java.math.BigDecimal

  2. 若是精度=0而且10<=長度<=18,就會使用java.lang.Long

  3. 若是精度=0而且5<=長度<=9,就會使用java.lang.Integer

  4. 若是精度=0而且長度<5,就會使用java.lang.Short

若是設置爲true,那麼必定會使用java.math.BigDecimal,配置示例以下:

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

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

該元素用來控制生成的實體類,根據<context>中配置的defaultModelType,一個表可能會對應生成多個不一樣的實體類。一個表對應多個類實際上並不方便,因此前面也推薦使用flat,這種狀況下一個表對應一個實體類。

該元素只有兩個屬性,都是必選的。

  • targetPackage:生成實體類存放的包名,通常就是放在該包下。實際還會受到其餘配置的影響(<table>中會提到)。

  • targetProject:指定目標項目路徑,使用的是文件系統的絕對路徑。

該元素支持如下幾個<property>子元素屬性:

  • constructorBased:該屬性只對MyBatis3有效,若是true就會使用構造方法入參,若是false就會使用setter方式。默認爲false

  • enableSubPackages:若是true,MBG會根據catalogschema來生成子包。若是false就會直接用targetPackage屬性。默認爲false

  • immutable:該屬性用來配置實體類屬性是否可變,若是設置爲true,那麼constructorBased無論設置成什麼,都會使用構造方法入參,而且不會生成setter方法。若是爲false,實體類屬性就能夠改變。默認爲false

  • rootClass:設置全部實體類的基類。若是設置,須要使用類的全限定名稱。而且若是MBG可以加載rootClass,那麼MBG不會覆蓋和父類中徹底匹配的屬性。匹配規則:

    • 屬性名徹底相同

    • 屬性類型相同

    • 屬性有getter方法

    • 屬性有setter方法

  • trimStrings:是否對數據庫查詢結果進行trim操做,若是設置爲true就會生成相似這樣public void setUsername(String username) {this.username = username == null ? null : username.trim();}setter方法。默認值爲false

配置示例以下:

<javaModelGenerator targetPackage="test.model" targetProject="E:\MyProject\src\main\java">
    <property name="enableSubPackages" value="true" />
    <property name="trimStrings" value="true" />
</javaModelGenerator>
3.3.6 <sqlMapGenerator> 元素

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

  • 若是targetRuntime目標是**iBATIS2**,該元素必須配置一個。

  • 若是targetRuntime目標是**MyBatis3**,只有當<javaClientGenerator>須要XML時,該元素必須配置一個。 若是沒有配置<javaClientGenerator>,則使用如下的規則:

    • 若是指定了一個<sqlMapGenerator>,那麼MBG將只生成XML的SQL映射文件和實體類。

    • 若是沒有指定<sqlMapGenerator>,那麼MBG將只生成實體類。

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

  • targetPackage:生成實體類存放的包名,通常就是放在該包下。實際還會受到其餘配置的影響(<table>中會提到)。

  • targetProject:指定目標項目路徑,使用的是文件系統的絕對路徑。

該元素支持<property>子元素,只有一個能夠配置的屬性:

  • enableSubPackages:若是true,MBG會根據catalogschema來生成子包。若是false就會直接用targetPackage屬性。默認爲false

配置示例:

<sqlMapGenerator targetPackage="test.xml"  targetProject="E:\MyProject\src\main\resources">
    <property name="enableSubPackages" value="true" />
</sqlMapGenerator>
3.3.7 <javaClientGenerator> 元素

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

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

該元素有3個必選屬性:

  • type:該屬性用於選擇一個預約義的客戶端代碼(能夠理解爲Mapper接口)生成器,用戶能夠自定義實現,須要繼承org.mybatis.generator.codegen.AbstractJavaClientGenerator類,必選有一個默認的構造方法。 該屬性提供瞭如下預約的代碼生成器,首先根據<context>targetRuntime分紅三類:

    • IBATIS:生成的對象符合iBATIS的DAO框架(不建議使用)。

    • GENERIC-CI:生成的對象將只依賴於SqlMapClient,經過構造方法注入。

    • GENERIC-SI:生成的對象將只依賴於SqlMapClient,經過setter方法注入。

    • SPRING:生成的對象符合Spring的DAO接口

    • ANNOTATEDMAPPER:基於註解的Mapper接口,不會有對應的XML映射文件

    • XMLMAPPER:全部的方法都在XML中,接口調用依賴XML文件。

    • ANNOTATEDMAPPER:基於註解的Mapper接口,不會有對應的XML映射文件

    • MIXEDMAPPER:XML和註解的混合形式,(上面這種狀況中的)SqlProvider註解方法會被XML替代。

    • XMLMAPPER:全部的方法都在XML中,接口調用依賴XML文件。

    • MyBatis3:

    • MyBatis3Simple:

    • Ibatis2Java2或**Ibatis2Java5**:

  • targetPackage:生成實體類存放的包名,通常就是放在該包下。實際還會受到其餘配置的影響(<table>中會提到)。

  • targetProject:指定目標項目路徑,使用的是文件系統的絕對路徑。

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

  • implementationPackage:若是指定了該屬性,實現類就會生成在這個包中。

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

  • enableSubPackages

  • exampleMethodVisibility

  • methodNameCalculator

  • rootInterface

  • useLegacyBuilder

這幾個屬性不太經常使用,具體做用請看完整的文檔,這裏對rootInterface作個簡單介紹。

rootInterface用於指定一個全部生成的接口都繼承的父接口。 這個值能夠經過<table>配置的rootInterface屬性覆蓋。

這個屬性對於通用Mapper來講,可讓生成的全部接口都繼承該接口。

配置示例:

<javaClientGenerator type="XMLMAPPER" targetPackage="test.dao"
              targetProject="E:\MyProject\src\main\java"/>
3.3.8 <table> 元素

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

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

該元素有一個必選屬性:

  • tableName:指定要生成的表名,可使用SQL通配符匹配多個表。

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

<table tableName="%" />

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

  • schema:數據庫的schema,可使用SQL通配符匹配。若是設置了該值,生成SQL的表名會變成如schema.tableName的形式。

  • catalog:數據庫的catalog,若是設置了該值,生成SQL的表名會變成如catalog.tableName的形式。

  • alias:若是指定,這個值會用在生成的select查詢SQL的表的別名和列名上。 列名會被別名爲 alias_actualColumnName(別名_實際列名) 這種模式。

  • domainObjectName:生成對象的基本名稱。若是沒有指定,MBG會自動根據表名來生成名稱。

  • enableXXX:XXX表明多種SQL方法,該屬性用來指定是否生成對應的XXX語句。

  • selectByPrimaryKeyQueryId:DBA跟蹤工具會用到,具體請看詳細文檔。

  • selectByExampleQueryId:DBA跟蹤工具會用到,具體請看詳細文檔。

  • modelType:和<context>defaultModelType含義同樣,這裏能夠針對表進行配置,這裏的配置會覆蓋<context>defaultModelType配置。

  • escapeWildcards:這個屬性表示當查詢列,是否對schema和表名中的SQL通配符 ('_' and '%') 進行轉義。 對於某些驅動當schema或表名中包含SQL通配符時(例如,一個表名是MY_TABLE,有一些驅動須要將下劃線進行轉義)是必須的。默認值是false

  • delimitIdentifiers:是否給標識符增長**分隔符**。默認false。當catalog,schematableName中包含空白時,默認爲true

  • delimitAllColumns:是否對全部列添加**分隔符**。默認false

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

  • constructorBased:和<javaModelGenerator>中的屬性含義同樣。

  • ignoreQualifiersAtRuntime:生成的SQL中的表名將不會包含schemacatalog前綴。

  • immutable:和<javaModelGenerator>中的屬性含義同樣。

  • modelOnly:此屬性用於配置是否爲表只生成實體類。若是設置爲true就不會有Mapper接口。若是配置了<sqlMapGenerator>,而且modelOnlytrue,那麼XML映射文件中只有實體對象的映射元素(<resultMap>)。若是爲true還會覆蓋屬性中的enableXXX方法,將不會生成任何CRUD方法。

  • rootClass:和<javaModelGenerator>中的屬性含義同樣。

  • rootInterface:和<javaClientGenerator>中的屬性含義同樣。

  • runtimeCatalog:運行時的catalog,當生成表和運行環境的表的catalog不同的時候可使用該屬性進行配置。

  • runtimeSchema:運行時的schema,當生成表和運行環境的表的schema不同的時候可使用該屬性進行配置。

  • runtimeTableName:運行時的tableName,當生成表和運行環境的表的tableName不同的時候可使用該屬性進行配置。

  • selectAllOrderByClause:該屬性值會追加到selectAll方法後的SQL中,會直接跟order by拼接後添加到SQL末尾。

  • useActualColumnNames:若是設置爲true,那麼MBG會使用從數據庫元數據獲取的列名做爲生成的實體對象的屬性。 若是爲false(默認值),MGB將會嘗試將返回的名稱轉換爲駝峯形式。 在這兩種狀況下,能夠經過 元素顯示指定,在這種狀況下將會忽略這個(useActualColumnNames)屬性。

  • useColumnIndexes:若是是true,MBG生成resultMaps的時候會使用列的索引,而不是結果中列名的順序。

  • useCompoundPropertyNames:若是是true,那麼MBG生成屬性名的時候會將列名和列備註接起來. 這對於那些經過第四代語言自動生成列(例如:FLD22237),可是備註包含有用信息(例如:"customer id")的數據庫來講頗有用. 在這種狀況下,MBG會生成屬性名FLD2237_CustomerId。

除了<property>子元素外,<table>還包含如下子元素:

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

1. <generatedKey> 元素

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

  • column:生成列的列名。

  • sqlStatement:將返回新值的 SQL 語句。若是這是一個identity列,您可使用其中一個預約義的的特殊值。預約義值以下:

    • Cloudscape

    • DB2

    • DB2_MF

    • Derby

    • HSQLDB

    • Informix

    • MySql

    • SqlServer

    • SYBASE

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

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

  • identity:當設置爲true時,該列會被標記爲identity列, 而且<selectKey>元素會被插入在insert後面。 當設置爲false時,<selectKey>會插入到insert以前(一般是序列)。**重要**: 即便您type屬性指定爲post,您仍然須要爲identity列將該參數設置爲true。 這將標誌MBG從插入列表中刪除該列。默認值是false

  • type:type=post and identity=true的時候生成的<selectKey>中的order=AFTER,當type=pre的時候,identity只能爲false,生成的<selectKey>中的order=BEFORE。能夠這麼理解,自動增加的列只有插入到數據庫後才能獲得ID,因此是AFTER,使用序列時,只有先獲取序列以後,才能插入數據庫,因此是BEFORE

配置示例一:

<table tableName="user login info" domainObjectName="UserLoginInfo">
    <generatedKey column="id" sqlStatement="Mysql"/>
</table>

對應的生成的結果:

<insert id="insert" parameterType="test.model.UserLoginInfo">
    <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
        SELECT LAST_INSERT_ID()
    </selectKey>
    insert into `user login info` (Id, username, logindate, loginip)
    values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{logindate,jdbcType=TIMESTAMP}, #{loginip,jdbcType=VARCHAR})
</insert>

配置示例二:

<table tableName="user login info" domainObjectName="UserLoginInfo">
    <generatedKey column="id" sqlStatement="select SEQ_ID.nextval from dual"/>
</table>

對應的生成結果:

<insert id="insert" parameterType="test.model.UserLoginInfo">
    <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
        select SEQ_ID.nextval from dual
    </selectKey>
    insert into `user login info` (Id, username, logindate, loginip)
    values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{logindate,jdbcType=TIMESTAMP},#{loginip,jdbcType=VARCHAR})
</insert>

2. <columnRenamingRule> 元素

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

  • CUST_BUSINESS_NAME

  • CUST_STREET_ADDRESS

  • CUST_CITY

  • CUST_STATE

生成的全部屬性名中若是都包含CUST的前綴可能會讓人不爽。這些前綴能夠經過以下方式定義重命名規則:

<columnRenamingRule searchString="^CUST_" replaceString="" />

注意,在內部,MBG使用java.util.regex.Matcher.replaceAll方法實現這個功能。 請參閱有關該方法的文檔和在Java中使用正則表達式的例子。

<columnOverride>匹配一列時,這個元素(<columnRenamingRule>)會被忽略。<columnOverride>優先於重命名的規則。

該元素有一個必選屬性:

  • searchString:定義將被替換的字符串的正則表達式。

該元素有一個可選屬性:

  • replaceString:這是一個用來替換搜索字符串列每個匹配項的字符串。若是沒有指定,就會使用空字符串。

關於<table><property>屬性useActualColumnNames對此的影響能夠查看完整文檔。

3. <columnOverride> 元素

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

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

該元素有一個必選屬性:

  • column:要重寫的列名。

該元素有多個可選屬性:

  • property:要使用的Java屬性的名稱。若是沒有指定,MBG會根據列名生成。 例如,若是一個表的一列名爲STRT_DTE,MBG會根據<table>useActualColumnNames屬性生成STRT_DTEstrtDte

  • javaType:該列屬性值爲徹底限定的Java類型。若是須要,這能夠覆蓋由JavaTypeResolver計算出的類型。 對某些數據庫來講,這是必要的用來處理**「奇怪的」**數據庫類型(例如MySql的unsigned bigint類型須要映射爲java.lang.Object)。

  • jdbcType:該列的JDBC類型(INTEGER, DECIMAL, NUMERIC, VARCHAR等等)。 若是須要,這能夠覆蓋由JavaTypeResolver計算出的類型。 對某些數據庫來講,這是必要的用來處理怪異的JDBC驅動 (例如DB2的LONGVARCHAR類型須要爲iBATIS 映射爲VARCHAR)。

  • typeHandler:用戶定義的須要用來處理這列的類型處理器。它必須是一個繼承iBATIS的TypeHandler類或TypeHandlerCallback接口(該接口很容易繼承)的全限定的類名。若是沒有指定或者是空白,iBATIS會用默認的類型處理器來處理類型。**重要**:MBG不會校驗這個類型處理器是否存在或者可用。 MGB只是簡單的將這個值插入到生成的SQL映射的配置文件中。

  • delimitedColumnName:指定是否應在生成的SQL的列名稱上增長**分隔符**。 若是列的名稱中包含空格,MGB會自動添加**分隔符**, 因此這個重寫只有當列名須要強制爲一個合適的名字或者列名是數據庫中的保留字時是必要的。

配置示例:

<table schema="DB2ADMIN" tableName="ALLTYPES" >
    <columnOverride column="LONG_VARCHAR_FIELD" javaType="java.lang.String" jdbcType="VARCHAR" />
</table>

4. <ignoreColumn> 元素

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

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

該元素有一個必選屬性:

  • column:要忽略的列名。

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

  • delimitedColumnName:匹配列名的時候是否區分大小寫。若是爲true則區分。默認值爲false,不區分大小寫。

MyBatis Generator最佳實踐

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

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

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

  2. 取消Example方法的配置,經過<table>上的enablexxExample方法能夠屏蔽,可是最好的方法是在<context>上設置targetRuntime="MyBatis3Simple"

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

  4. 關於註釋<commentGenerator>,無論你是否要重寫本身的註釋生成器,有一點不能忘記,那就是註釋中必定要保留@mbggenerated,MBG經過該字符串來判斷代碼是否爲代碼生成器生成的代碼,有該標記的的代碼在從新生成的時候會被刪除,不會重複。不會在XML中出現重複元素。

  5. 使用MBG生成的代碼時,建議儘量不要去修改自動生成的代碼,並且要生成帶有@mbggenerated,這樣纔不會在每次從新生成代碼的時候須要手動修改好多內容。

  6. 仍然是註釋相關,在<commentGenerator>中,建議必定要保留suppressAllComments屬性(使用默認值false),必定要取消(設爲true)時間戳suppressDate,避免重複提交SVN。

  7. <jdbcConnection>建議將JDBC驅動放到項目的**classpath**下,而不是使用<classPathEntry>來引入jar包,主要考慮到全部開發人員的統一性。

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

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

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

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

綜合以上信息,這裏給出一個Mysql的簡單配置:

<?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>

<table>這裏用的通配符匹配所有的表,另外全部表都有自動增加的id字段。若是不是全部表的配置都同樣,能夠作針對性的配置。

相關文章
相關標籤/搜索