開篇說明
此篇主要說明MyBatis Generator 配置文件詳解 中的 table 元素刃麸,有關MyBatis Generator 配置文件詳解的其他內容請移步:MyBatis Generator 配置文件詳解
table 元素
table 元素用來配置要通過內省的表糟袁。只有配置的才會生成實體類和其他文件乓诽。有一個必選屬性(tableName)指定要生成的表名最域,可以使用SQL通配符匹配多個表。例如要生成全部的表啡直,可以按如下配置:
<table tableName="%" />
table 元素包含多個可選屬性:
- schema:數(shù)據(jù)庫的schema,可以使用SQL通配符匹配烁涌。如果設置了該值,生成SQL的表名會變成如schema.tableName的形式酒觅。
- catalog:數(shù)據(jù)庫的catalog撮执,如果設置了該值,生成SQL的表名會變成如catalog.tableName的形式舷丹。
- alias:如果指定抒钱,這個值會用在生成的select查詢SQL的表的別名和列名上。 列名會被別名為 alias_actualColumnName(別名_實際列名) 這種模式颜凯。
- domainObjectName:生成對象的基本名稱谋币。如果沒有指定,MBG會自動根據(jù)表名來生成名稱症概。
- 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,當生成表和運行環(huán)境的表的catalog不一樣的時候可以使用該屬性進行配置痕寓。
- runtimeSchema:運行時的schema傲醉,當生成表和運行環(huán)境的表的schema不一樣的時候可以使用該屬性進行配置。
- runtimeTableName:運行時的tableName呻率,當生成表和運行環(huán)境的表的tableName不一樣的時候可以使用該屬性進行配置硬毕。
- selectAllOrderByClause:該屬性值會追加到selectAll方法后的SQL中,會直接跟order by拼接后添加到SQL末尾礼仗。
- useActualColumnNames:如果設置為true,那么MBG會使用從數(shù)據(jù)庫元數(shù)據(jù)獲取的列名作為生成的實體對象的屬性昭殉。 如果為false(默認值)苞七,MGB將會嘗試將返回的名稱轉換為駝峰形式。 在這兩種情況下挪丢,可以通過 元素顯示指定蹂风,在這種情況下將會忽略這個(useActualColumnNames)屬性。
- useColumnIndexes:如果是true,MBG生成resultMaps的時候會使用列的索引,而不是結果中列名的順序乾蓬。
- 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列摘盆,您可以使用其中一個預定義的的特殊值翼雀。預定義值如下:
- Cloudscape
- DB2
- DB2_MF
- Derby
- HSQLDB
- Informix
- MySql
- SqlServer
- SYBASE
- JDBC:這會配置MBG使用MyBatis3支持的JDBC標準的生成key來生成代碼。 這是一個獨立于數(shù)據(jù)庫獲取標識列中的值的方法孩擂。 重要: 只有當目標運行為MyBatis3時才會產(chǎn)生正確的代碼狼渊。 如果與iBATIS2一起使用目標運行時會產(chǎn)生運行時錯誤的代碼。
這個元素還包含兩個可選屬性:
- identity:當設置為true時,該列會被標記為identity列类垦, 并且<selectKey>元素會被插入在insert后面狈邑。 當設置為false時,<selectKey>會插入到insert之前(通常是序列)蚤认。重要: 即使您type屬性指定為post官地,您仍然需要為identity列將該參數(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 元素
該元素是可選的,最多可以配置一個宴凉,使用該元素可以在生成列之前誊锭,對列進行重命名。這對那些存在同一前綴的字段想在生成屬性名時去除前綴的表非常有用弥锄。 例如假設一個表包含以下的列:
- CUST_BUSINESS_NAME
- CUST_STREET_ADDRESS
- CUST_CITY
- CUST_STATE
生成的所有屬性名中如果都包含CUST的前綴可能會讓人不爽丧靡。這些前綴可以通過如下方式定義重命名規(guī)則:
<columnRenamingRule searchString="^CUST_" replaceString="" />
注意,在內部籽暇,MBG使用java.util.regex.Matcher.replaceAll方法實現(xiàn)這個功能温治。 請參閱有關該方法的文檔和在Java中使用正則表達式的例子。
當<columnOverride>匹配一列時戒悠,這個元素(<columnRenamingRule>)會被忽略熬荆。<columnOverride>優(yōu)先于重命名的規(guī)則。
該元素有一個必選屬性(searchString):定義將被替換的字符串的正則表達式绸狐。
該元素有一個可選屬性(replaceString):這是一個用來替換搜索字符串列每一個匹配項的字符串卤恳。如果沒有指定,就會使用空字符串六孵。
關于<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驅動 (例如DB2的LONGVARCHAR類型需要為iBATIS 映射為VARCHAR)具伍。
- typeHandler:用戶定義的需要用來處理這列的類型處理器。它必須是一個繼承iBATIS的TypeHandler類或TypeHandlerCallback接口(該接口很容易繼承)的全限定的類名圈驼。如果沒有指定或者是空白人芽,iBATIS會用默認的類型處理器來處理類型。重要:MBG不會校驗這個類型處理器是否存在或者可用碗脊。 MGB只是簡單的將這個值插入到生成的SQL映射的配置文件中啼肩。
- delimitedColumnName:指定是否應在生成的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ū)分大小寫蹋艺。