相關(guān)鏈接:MyBatis Generator 配置文件詳解
開篇說明
此篇主要說明MyBatis Generator 配置文件詳解 中的 table 元素,有關(guān)MyBatis Generator 配置文件詳解的其他內(nèi)容請移步:MyBatis Generator 配置文件詳解
table 元素
table 元素用來配置要通過內(nèi)省的表。只有配置的才會生成實體類和其他文件。有一個必選屬性(tableName)指定要生成的表名,可以使用SQL通配符匹配多個表。例如要生成全部的表,可以按如下配置:
<table tableName="%" />
table 元素包含多個可選屬性:
- schema:數(shù)據(jù)庫的schema,可以使用SQL通配符匹配。如果設(shè)置了該值,生成SQL的表名會變成如schema.tableName的形式。
- catalog:數(shù)據(jù)庫的catalog,如果設(shè)置了該值,生成SQL的表名會變成如catalog.tableName的形式。
- alias:如果指定,這個值會用在生成的select查詢SQL的表的別名和列名上。 列名會被別名為 alias_actualColumnName(別名_實際列名) 這種模式。
- domainObjectName:生成對象的基本名稱。如果沒有指定,MBG會自動根據(jù)表名來生成名稱。
- enableXXX:XXX代表多種SQL方法,該屬性用來指定是否生成對應(yīng)的XXX語句。
- selectByPrimaryKeyQueryId:DBA跟蹤工具會用到,具體請看詳細文檔。
- selectByExampleQueryId:DBA跟蹤工具會用到,具體請看詳細文檔。
- modelType:和<context>的defaultModelType含義一樣,這里可以針對表進行配置,這里的配置會覆蓋<context>的defaultModelType配置。
- escapeWildcards:這個屬性表示當查詢列,是否對schema和表名中的SQL通配符 ('_' and '%') 進行轉(zhuǎn)義。 對于某些驅(qū)動當schema或表名中包含SQL通配符時(例如,一個表名是MY_TABLE,有一些驅(qū)動需要將下劃線進行轉(zhuǎn)義)是必須的。默認值是false。
- delimitIdentifiers:是否給標識符增加分隔符。默認false。當catalog,schema或tableName中包含空白時,默認為true。
- delimitAllColumns:是否對所有列添加分隔符。默認false。
該元素包含多個可用的<property>子元素,可選屬性為:
- constructorBased:和<javaModelGenerator>中的屬性含義一樣。
- ignoreQualifiersAtRuntime:生成的SQL中的表名將不會包含schema和catalog前綴。
- immutable:和<javaModelGenerator>中的屬性含義一樣。
- modelOnly:此屬性用于配置是否為表只生成實體類。如果設(shè)置為true就不會有Mapper接口。如果配置了<sqlMapGenerator>,并且modelOnly為true,那么XML映射文件中只有實體對象的映射元素(<resultMap>)。如果為true還會覆蓋屬性中的enableXXX方法,將不會生成任何CRUD方法。
- rootClass:和<javaModelGenerator>中的屬性含義一樣。
- rootInterface:和<javaClientGenerator>中的屬性含義一樣。
- runtimeCatalog:運行時的catalog,當生成表和運行環(huán)境的表的catalog不一樣的時候可以使用該屬性進行配置。
- runtimeSchema:運行時的schema,當生成表和運行環(huán)境的表的schema不一樣的時候可以使用該屬性進行配置。
- runtimeTableName:運行時的tableName,當生成表和運行環(huán)境的表的tableName不一樣的時候可以使用該屬性進行配置。
- selectAllOrderByClause:該屬性值會追加到selectAll方法后的SQL中,會直接跟order by拼接后添加到SQL末尾。
- useActualColumnNames:如果設(shè)置為true,那么MBG會使用從數(shù)據(jù)庫元數(shù)據(jù)獲取的列名作為生成的實體對象的屬性。 如果為false(默認值),MGB將會嘗試將返回的名稱轉(zhuǎn)換為駝峰形式。 在這兩種情況下,可以通過 元素顯示指定,在這種情況下將會忽略這個(useActualColumnNames)屬性。
- useColumnIndexes:如果是true,MBG生成resultMaps的時候會使用列的索引,而不是結(jié)果中列名的順序。
- useCompoundPropertyNames:如果是true,那么MBG生成屬性名的時候會將列名和列備注接起來. 這對于那些通過第四代語言自動生成列(例如:FLD22237),但是備注包含有用信息(例如:"customer id")的數(shù)據(jù)庫來說很有用. 在這種情況下,MBG會生成屬性名FLD2237_CustomerId。
除了<property>子元素外,<table>還包含以下子元素:
- <generatedKey> (0個或1個)
- <columnRenamingRule> (0個或1個)
- <columnOverride> (0個或多個)
- <ignoreColumn> (0個或多個)
后面的小節(jié)對這4個元素進行詳細講解。
generatedKey 元素
這個元素是可選的,最多可以配置一個。
這個元素用來指定自動生成主鍵的屬性(identity字段或者sequences序列)。如果指定這個元素,MBG在生成insert的SQL映射文件中插入一個<selectKey>元素。 這個元素非常重要,這個元素包含下面兩個必選屬性:
- column:生成列的列名。
- sqlStatement:將返回新值的 SQL 語句。如果這是一個identity列,您可以使用其中一個預(yù)定義的的特殊值。預(yù)定義值如下:
- Cloudscape
- DB2
- DB2_MF
- Derby
- HSQLDB
- Informix
- MySql
- SqlServer
- SYBASE
- JDBC:這會配置MBG使用MyBatis3支持的JDBC標準的生成key來生成代碼。 這是一個獨立于數(shù)據(jù)庫獲取標識列中的值的方法。 重要: 只有當目標運行為MyBatis3時才會產(chǎn)生正確的代碼。 如果與iBATIS2一起使用目標運行時會產(chǎn)生運行時錯誤的代碼。
這個元素還包含兩個可選屬性:
- identity:當設(shè)置為true時,該列會被標記為identity列, 并且<selectKey>元素會被插入在insert后面。 當設(shè)置為false時,<selectKey>會插入到insert之前(通常是序列)。重要: 即使您type屬性指定為post,您仍然需要為identity列將該參數(shù)設(shè)置為true。 這將標志MBG從插入列表中刪除該列。默認值是false。
- type:type=post and identity=true的時候生成的<selectKey>中的order=AFTER,當type=pre的時候,identity只能為false,生成的<selectKey>中的order=BEFORE??梢赃@么理解,自動增長的列只有插入到數(shù)據(jù)庫后才能得到ID,所以是AFTER,使用序列時,只有先獲取序列之后,才能插入數(shù)據(jù)庫,所以是BEFORE。
columnRenamingRule 元素
該元素是可選的,最多可以配置一個,使用該元素可以在生成列之前,對列進行重命名。這對那些存在同一前綴的字段想在生成屬性名時去除前綴的表非常有用。 例如假設(shè)一個表包含以下的列:
- CUST_BUSINESS_NAME
- CUST_STREET_ADDRESS
- CUST_CITY
- CUST_STATE
生成的所有屬性名中如果都包含CUST的前綴可能會讓人不爽。這些前綴可以通過如下方式定義重命名規(guī)則:
<columnRenamingRule searchString="^CUST_" replaceString="" />
注意,在內(nèi)部,MBG使用java.util.regex.Matcher.replaceAll方法實現(xiàn)這個功能。 請參閱有關(guān)該方法的文檔和在Java中使用正則表達式的例子。
當<columnOverride>匹配一列時,這個元素(<columnRenamingRule>)會被忽略。<columnOverride>優(yōu)先于重命名的規(guī)則。
該元素有一個必選屬性(searchString):定義將被替換的字符串的正則表達式。
該元素有一個可選屬性(replaceString):這是一個用來替換搜索字符串列每一個匹配項的字符串。如果沒有指定,就會使用空字符串。
關(guān)于<table>的<property>屬性useActualColumnNames對此的影響可以查看完整文檔。
columnOverride 元素
該元素可選,可以配置多個。該元素將某些屬性默認計算的值更改為指定的值。
該元素有一個必選屬性(column):要重寫的列名。
該元素有多個可選屬性:
- property:要使用的Java屬性的名稱。如果沒有指定,MBG會根據(jù)列名生成。 例如,如果一個表的一列名為STRT_DTE,MBG會根據(jù)<table>的useActualColumnNames屬性生成STRT_DTE或strtDte。
- javaType:該列屬性值為完全限定的Java類型。如果需要,這可以覆蓋由JavaTypeResolver計算出的類型。 對某些數(shù)據(jù)庫來說,這是必要的用來處理“奇怪的”數(shù)據(jù)庫類型(例如MySql的unsigned bigint類型需要映射為java.lang.Object)。
- jdbcType:該列的JDBC類型(INTEGER, DECIMAL, NUMERIC, VARCHAR等等)。 如果需要,這可以覆蓋由JavaTypeResolver計算出的類型。 對某些數(shù)據(jù)庫來說,這是必要的用來處理怪異的JDBC驅(qū)動 (例如DB2的LONGVARCHAR類型需要為iBATIS 映射為VARCHAR)。
- typeHandler:用戶定義的需要用來處理這列的類型處理器。它必須是一個繼承iBATIS的TypeHandler類或TypeHandlerCallback接口(該接口很容易繼承)的全限定的類名。如果沒有指定或者是空白,iBATIS會用默認的類型處理器來處理類型。重要:MBG不會校驗這個類型處理器是否存在或者可用。 MGB只是簡單的將這個值插入到生成的SQL映射的配置文件中。
- delimitedColumnName:指定是否應(yīng)在生成的SQL的列名稱上增加分隔符。 如果列的名稱中包含空格,MGB會自動添加分隔符, 所以這個重寫只有當列名需要強制為一個合適的名字或者列名是數(shù)據(jù)庫中的保留字時是必要的。
配置示例:
<table schema="DB2ADMIN" tableName="ALLTYPES" >
<columnOverride column="LONG_VARCHAR_FIELD" javaType="java.lang.String" jdbcType="VARCHAR" />
</table>
ignoreColumn 元素
該元素可選,可以配置多個。該元素可以用來屏蔽不需要生成的列。
該元素有一個必選屬性(column):要忽略的列名。
該元素還有一個可選屬性(delimitedColumnName):匹配列名的時候是否區(qū)分大小寫。如果為true則區(qū)分。默認值為false,不區(qū)分大小寫。