mybatis-generator有三種用法:命令行、eclipse插件、maven插件。個人覺得maven插件最方便,可以在eclipse/intellij idea等ide上可以通用。
下面是從官網上的截圖:
在MBG中,最主要也最重要的就是XML配置文件,因此本篇文章主要的內容就是XML配置。這裏按照配置的順序對配置逐個講解,更細的內容可以配合中文文檔參照。
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頭,配置文件必須包含上面的DOCTYPE
。
2.
根節點<generatorConfiguration>
generatorConfiguration
節點沒有任何屬性,直接寫節點即可,如下:
<generatorConfiguration>
<!-- 具體配置內容 -->
</generatorConfiguration>
3. <generatorConfiguration>
子元素
從這段開始,就是配置的主要內容,這些配置都是generatorConfiguration
元素的子元素。
包含以下子元素(有嚴格的順序):
-
<properties>
(0個或1個) -
<classPathEntry>
(0個或多個) -
<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或多個,不受限制。
最常見的用法是通過這個屬性指定驅動的路徑,例如:
<classPathEntry location="E:\mysql\mysql-connector-java-5.1.29.jar"/>
重點提醒:本文之前在這裏有誤導,特別強調。
注意,classPathEntry只在下面這兩種情況下才有效:
- 當加載 JDBC 驅動內省數據庫時
- 當加載根類中的 JavaModelGenerator 檢查重寫的方法時
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>
(0個或多個)<plugin>
(0個或多個)<commentGenerator>
(0個或1個)<jdbcConnection>
(1個)<javaTypeResolver>
(0個或1個)<javaModelGenerator>
(1個)<sqlMapGenerator>
(0個或1個)<javaClientGenerator>
(0個或1個)<table>
(1個或多個)
其中<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會自動給表名或字段名添加**分隔符**。
然後這裏繼續上面的例子來講beginningDelimiter
和endingDelimiter
屬性。
由於beginningDelimiter
和endingDelimiter
的默認值爲雙引號("
),在Mysql中不能這麼寫,所以還要將這兩個默認值改爲**反單引號(`)**,配置如下:
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
屬性javaFileEncoding
設置要使用的Java文件的編碼,默認使用當前平臺的編碼,只有當生產的編碼需要特殊指定時才需要使用,一般用不到。
最後兩個javaFormatter
和xmlFormatter
屬性**可能會**很有用,如果你想使用模板來定製生成的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
方法可以獲取字段的註釋信息。上面這個方法修改起來還是很容易的。除了字段的註釋外還有Getter
和Setter
,以及類的註釋。此外還有生成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
:訪問數據庫的用戶IDpassword
:訪問數據庫的密碼
此外該元素還可以接受多個<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
,該屬性可以控制是否強制DECIMAL
和NUMERIC
類型的字段轉換爲Java類型的java.math.BigDecimal
,默認值爲false
,一般不需要配置。
默認情況下的轉換規則爲:
- 如果
精度>0
或者長度>18
,就會使用java.math.BigDecimal
- 如果
精度=0
並且10<=長度<=18
,就會使用java.lang.Long
- 如果
精度=0
並且5<=長度<=9
,就會使用java.lang.Integer
- 如果
精度=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會根據catalog
和schema
來生成子包。如果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會根據catalog
和schema
來生成子包。如果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
分成三類:
- MyBatis3:
- ANNOTATEDMAPPER:基於註解的Mapper接口,不會有對應的XML映射文件
- MIXEDMAPPER:XML和註解的混合形式,(上面這種情況中的)
SqlProvider
註解方法會被XML替代。 - XMLMAPPER:所有的方法都在XML中,接口調用依賴XML文件。
- MyBatis3Simple:
- ANNOTATEDMAPPER:基於註解的Mapper接口,不會有對應的XML映射文件
- XMLMAPPER:所有的方法都在XML中,接口調用依賴XML文件。
- Ibatis2Java2或**Ibatis2Java5**:
- IBATIS:生成的對象符合iBATIS的DAO框架(不建議使用)。
- GENERIC-CI:生成的對象將只依賴於SqlMapClient,通過構造方法注入。
- GENERIC-SI:生成的對象將只依賴於SqlMapClient,通過
setter
方法注入。 - SPRING:生成的對象符合Spring的DAO接口
- MyBatis3:
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
,schema
或tableName
中包含空白時,默認爲true
。delimitAllColumns
:是否對所有列添加**分隔符**。默認false
。
該元素包含多個可用的<property>
子元素,可選屬性爲:
constructorBased
:和<javaModelGenerator>
中的屬性含義一樣。ignoreQualifiersAtRuntime
:生成的SQL中的表名將不會包含schema
和catalog
前綴。immutable
:和<javaModelGenerator>
中的屬性含義一樣。modelOnly
:此屬性用於配置是否爲表只生成實體類。如果設置爲true
就不會有Mapper接口。如果配置了<sqlMapGenerator>
,並且modelOnly
爲true
,那麼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>
還包含以下子元素:
<generatedKey>
(0個或1個)<columnRenamingRule>
(0個或1個)<columnOverride>
(0個或多個)<ignoreColumn>
(0個或多個)
下面對這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_DTE
或strtDte
。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的不一定適用。
以下根據個人經驗(對此有意見的可以留言)對一些配置看法列出如下幾點:
-
關於實體類的
modelType
,建議使用defaultModelType="flat"
,只有一個對象的情況下管理畢竟方便,使用也簡單。 -
關於註釋
<commentGenerator>
,不管你是否要重寫自己的註釋生成器,有一點不能忘記,那就是註釋中一定要保留@mbggenerated
,MBG通過該字符串來判斷代碼是否爲代碼生成器生成的代碼,有該標記的的代碼在重新生成的時候會被刪除,不會重複。不會在XML中出現重複元素。 -
使用MBG生成的代碼時,建議儘可能不要去修改自動生成的代碼,而且要生成帶有
@mbggenerated
,這樣纔不會在每次重新生成代碼的時候需要手動修改好多內容。 -
仍然是註釋相關,在
<commentGenerator>
中,建議一定要保留suppressAllComments
屬性(使用默認值false
),一定要取消(設爲true
)時間戳suppressDate
,避免重複提交SVN。 -
<jdbcConnection>
建議將JDBC驅動放到項目的**classpath**下,而不是使用<classPathEntry>
來引入jar包,主要考慮到所有開發人員的統一性。 -
當數據庫字段使用
CHAR
時,建議在<javaModelGenerator>
中設置<property name="trimStrings" value="true" />
,可以自動去掉不必要的空格。 -
在
<javaClientGenerator>
中,建議設置type="XMLMAPPER"
,不建議使用註解或混合模式,比較代碼和SQL完全分離易於維護。 -
建議儘可能在
<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=“MyBatis3” defaultModelType=“flat”>
<property name=“beginningDelimiter” value=""</span><span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)">/></span> <span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"><property</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">name=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"endingDelimiter"</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">value=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"
"/>
<span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"><commentGenerator></span>
<span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"><property</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">name=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"suppressDate"</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">value=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"true"</span><span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)">/></span>
<span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"></commentGenerator></span>
<span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"><jdbcConnection</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">driverClass=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"com.mysql.jdbc.Driver"</span>
<span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">connectionURL=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"jdbc:mysql://localhost:3306/test"</span>
<span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">userId=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"root"</span>
<span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">password=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">""</span><span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)">></span>
<span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"></jdbcConnection></span>
<span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"><javaModelGenerator</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">targetPackage=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"test.model"</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">targetProject=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"G:\MyProject\src\main\java"</span><span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)">></span>
<span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"><property</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">name=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"trimStrings"</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">value=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"true"</span> <span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)">/></span>
<span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"></javaModelGenerator></span>
<span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"><sqlMapGenerator</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">targetPackage=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"test.xml"</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">targetProject=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"G:\MyProject\src\main\resources"</span><span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)">/></span>
<span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"><javaClientGenerator</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">type=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"XMLMAPPER"</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">targetPackage=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"test.dao"</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">targetProject=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"G:\MyProject\src\main\java"</span><span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)">/></span>
<span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"><table</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">tableName=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"%"</span><span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)">></span>
<span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"><generatedKey</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">column=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"id"</span> <span class="na" style="margin:0px; padding:0px; color:rgb(0,128,128)">sqlStatement=</span><span class="s" style="margin:0px; padding:0px; color:rgb(221,34,0)">"Mysql"</span><span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)">/></span>
<span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"></table></span>
<span class="nt" style="margin:0px; padding:0px; color:rgb(0,0,128)"></context></span>
</generatorConfiguration>
<table>
這裏用的通配符匹配全部的表,另外所有表都有自動增長的id
字段。如果不是所有表的配置都一樣,可以做針對性的配置。
轉載自 https://blog.csdn.net/zsq520520/article/details/50948926#commentBox