MyBatis Generator 配置文件详解 之 table 元素

相关链接:MyBatis Generator 配置文件详解

开篇说明

此篇主要说明MyBatis Generator 配置文件详解 中的 table 元素,有关MyBatis Generator 配置文件详解的其他内容请移步:MyBatis Generator 配置文件详解

table 元素

table 元素用来配置要通过内省的表。只有配置的才会生成实体类和其他文件。有一个必选属性(tableName)指定要生成的表名,可以使用SQL通配符匹配多个表。例如要生成全部的表,可以按如下配置:

<table tableName="%" />

table 元素包含多个可选属性:

  1. schema:数据库的schema,可以使用SQL通配符匹配。如果设置了该值,生成SQL的表名会变成如schema.tableName的形式。
  2. catalog:数据库的catalog,如果设置了该值,生成SQL的表名会变成如catalog.tableName的形式。
  3. alias:如果指定,这个值会用在生成的select查询SQL的表的别名和列名上。 列名会被别名为 alias_actualColumnName(别名_实际列名) 这种模式。
  4. domainObjectName:生成对象的基本名称。如果没有指定,MBG会自动根据表名来生成名称。
  5. enableXXX:XXX代表多种SQL方法,该属性用来指定是否生成对应的XXX语句。
  6. selectByPrimaryKeyQueryId:DBA跟踪工具会用到,具体请看详细文档。
  7. selectByExampleQueryId:DBA跟踪工具会用到,具体请看详细文档。
  8. modelType:和<context>的defaultModelType含义一样,这里可以针对表进行配置,这里的配置会覆盖<context>的defaultModelType配置。
  9. escapeWildcards:这个属性表示当查询列,是否对schema和表名中的SQL通配符 ('_' and '%') 进行转义。 对于某些驱动当schema或表名中包含SQL通配符时(例如,一个表名是MY_TABLE,有一些驱动需要将下划线进行转义)是必须的。默认值是false。
  10. delimitIdentifiers:是否给标识符增加分隔符。默认false。当catalog,schema或tableName中包含空白时,默认为true。
  11. delimitAllColumns:是否对所有列添加分隔符。默认false。

该元素包含多个可用的<property>子元素,可选属性为:

  1. constructorBased:和<javaModelGenerator>中的属性含义一样。
  2. ignoreQualifiersAtRuntime:生成的SQL中的表名将不会包含schema和catalog前缀。
  3. immutable:和<javaModelGenerator>中的属性含义一样。
  4. modelOnly:此属性用于配置是否为表只生成实体类。如果设置为true就不会有Mapper接口。如果配置了<sqlMapGenerator>,并且modelOnly为true,那么XML映射文件中只有实体对象的映射元素(<resultMap>)。如果为true还会覆盖属性中的enableXXX方法,将不会生成任何CRUD方法。
  5. rootClass:和<javaModelGenerator>中的属性含义一样。
  6. rootInterface:和<javaClientGenerator>中的属性含义一样。
  7. runtimeCatalog:运行时的catalog,当生成表和运行环境的表的catalog不一样的时候可以使用该属性进行配置。
  8. runtimeSchema:运行时的schema,当生成表和运行环境的表的schema不一样的时候可以使用该属性进行配置。
  9. runtimeTableName:运行时的tableName,当生成表和运行环境的表的tableName不一样的时候可以使用该属性进行配置。
  10. selectAllOrderByClause:该属性值会追加到selectAll方法后的SQL中,会直接跟order by拼接后添加到SQL末尾。
  11. useActualColumnNames:如果设置为true,那么MBG会使用从数据库元数据获取的列名作为生成的实体对象的属性。 如果为false(默认值),MGB将会尝试将返回的名称转换为驼峰形式。 在这两种情况下,可以通过 元素显示指定,在这种情况下将会忽略这个(useActualColumnNames)属性。
  12. useColumnIndexes:如果是true,MBG生成resultMaps的时候会使用列的索引,而不是结果中列名的顺序。
  13. useCompoundPropertyNames:如果是true,那么MBG生成属性名的时候会将列名和列备注接起来. 这对于那些通过第四代语言自动生成列(例如:FLD22237),但是备注包含有用信息(例如:"customer id")的数据库来说很有用. 在这种情况下,MBG会生成属性名FLD2237_CustomerId。

除了<property>子元素外,<table>还包含以下子元素:

  1. <generatedKey> (0个或1个)
  2. <columnRenamingRule> (0个或1个)
  3. <columnOverride> (0个或多个)
  4. <ignoreColumn> (0个或多个)

后面的小节对这4个元素进行详细讲解。

generatedKey 元素

这个元素是可选的,最多可以配置一个。

这个元素用来指定自动生成主键的属性(identity字段或者sequences序列)。如果指定这个元素,MBG在生成insert的SQL映射文件中插入一个<selectKey>元素。 这个元素非常重要,这个元素包含下面两个必选属性:

  1. column:生成列的列名。
  2. sqlStatement:将返回新值的 SQL 语句。如果这是一个identity列,您可以使用其中一个预定义的的特殊值。预定义值如下:
    • Cloudscape
    • DB2
    • DB2_MF
    • Derby
    • HSQLDB
    • Informix
    • MySql
    • SqlServer
    • SYBASE
    • JDBC:这会配置MBG使用MyBatis3支持的JDBC标准的生成key来生成代码。 这是一个独立于数据库获取标识列中的值的方法。 重要: 只有当目标运行为MyBatis3时才会产生正确的代码。 如果与iBATIS2一起使用目标运行时会产生运行时错误的代码。

这个元素还包含两个可选属性:

  1. identity:当设置为true时,该列会被标记为identity列, 并且<selectKey>元素会被插入在insert后面。 当设置为false时,<selectKey>会插入到insert之前(通常是序列)。重要: 即使您type属性指定为post,您仍然需要为identity列将该参数设置为true。 这将标志MBG从插入列表中删除该列。默认值是false。
  2. type:type=post and identity=true的时候生成的<selectKey>中的order=AFTER,当type=pre的时候,identity只能为false,生成的<selectKey>中的order=BEFORE。可以这么理解,自动增长的列只有插入到数据库后才能得到ID,所以是AFTER,使用序列时,只有先获取序列之后,才能插入数据库,所以是BEFORE。

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对此的影响可以查看完整文档。

columnOverride 元素

该元素可选,可以配置多个。该元素将某些属性默认计算的值更改为指定的值。

该元素有一个必选属性(column):要重写的列名。

该元素有多个可选属性:

  1. property:要使用的Java属性的名称。如果没有指定,MBG会根据列名生成。 例如,如果一个表的一列名为STRT_DTE,MBG会根据<table>的useActualColumnNames属性生成STRT_DTE或strtDte。
  2. javaType:该列属性值为完全限定的Java类型。如果需要,这可以覆盖由JavaTypeResolver计算出的类型。 对某些数据库来说,这是必要的用来处理“奇怪的”数据库类型(例如MySql的unsigned bigint类型需要映射为java.lang.Object)。
  3. jdbcType:该列的JDBC类型(INTEGER, DECIMAL, NUMERIC, VARCHAR等等)。 如果需要,这可以覆盖由JavaTypeResolver计算出的类型。 对某些数据库来说,这是必要的用来处理怪异的JDBC驱动 (例如DB2的LONGVARCHAR类型需要为iBATIS 映射为VARCHAR)。
  4. typeHandler:用户定义的需要用来处理这列的类型处理器。它必须是一个继承iBATIS的TypeHandler类或TypeHandlerCallback接口(该接口很容易继承)的全限定的类名。如果没有指定或者是空白,iBATIS会用默认的类型处理器来处理类型。重要:MBG不会校验这个类型处理器是否存在或者可用。 MGB只是简单的将这个值插入到生成的SQL映射的配置文件中。
  5. delimitedColumnName:指定是否应在生成的SQL的列名称上增加分隔符。 如果列的名称中包含空格,MGB会自动添加分隔符, 所以这个重写只有当列名需要强制为一个合适的名字或者列名是数据库中的保留字时是必要的。

配置示例:

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

ignoreColumn 元素

该元素可选,可以配置多个。该元素可以用来屏蔽不需要生成的列。

该元素有一个必选属性(column):要忽略的列名。

该元素还有一个可选属性(delimitedColumnName):匹配列名的时候是否区分大小写。如果为true则区分。默认值为false,不区分大小写。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容