一、XML配置详解
1.1 mybatis generator配置文件约束
<?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>
这个文件头中的mybatis-generator-config_1_0.dtd用于定义该配置文件中所有标签和属性的用法及限制,在文件头之后,需要写上XML文件的根节点generatorConfiguration。
1.2 以上一篇博客mbg.xml配置为例进行说明:
<?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>
<!--
targetRuntime="MyBatis3Simple":生成简单版的CRUD
MyBatis3:豪华版
-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- jdbcConnection:指定如何连接到目标数据库 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true"
userId="root"
password="123456">
</jdbcConnection>
<!-- -->
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- javaModelGenerator:指定javaBean的生成策略
targetPackage="test.model":目标包名
targetProject="\MBGTestProject\src":目标工程
-->
<javaModelGenerator targetPackage="com.xiaomifeng1010.mybatis.bean"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- sqlMapGenerator:sql映射生成策略: -->
<sqlMapGenerator targetPackage="com.xiaomifeng1010.mybatis.dao"
targetProject=".\conf">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- javaClientGenerator:指定mapper接口所在的位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.xiaomifeng1010.mybatis.dao"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 指定要逆向分析哪些表:根据表要创建javaBean -->
<table tableName="tbl_dept" domainObjectName="Department"></table>
<table tableName="tbl_employee" domainObjectName="Employee"></table>
</context>
</generatorConfiguration>
1.3 properties标签。
properties标签用来指定外部的属性元素,可以配置1个该标签或者不配置。
properties 标签用于指定一个需要在配置中解析使用的外部属性文件,引入属性文件后,可以在配置中使用${property}这种形式的引用,通过这种方式引用属性文件中的属性值,对于后面需要配置的JDBC信息会很有用。
properties标签包含resource和url两个属性,配置时候,使用其中一个即可。
· resource:指定classpath下的属性文件,类似com/myproject/generatorConfig.properties这样的属性值。
· url:指定文件系统上的特定位置,例如file:///F:/mybatis/generatorConfig.properties。
1.4 classPathEntry标签。
这个标签可以配置多个,也可以不配置。
classPathEntry标签最常见的用法是通过属性location指定驱动的路径,代码如下。
<classPathEntry location="C:\Users\MSI\.m2\repository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar"/>
1.5context标签。
这个标签比较重要,该标签至少配置1个,可以配置多个。
context标签用于指定生成一组对象的环境。例如指定要连接的数据库,要生成对象的类型和要处理的数据库中的表。运行MBG的时候还可以指定要运行的context。
context标签只有一个必选属性id,用来唯一确定该标签,该id属性可以在运行MBG时使用。此外还有几个可选属性。
· defaultModelType:这个属性很重要,定义了 MBG 如何生成实体类。该属性有以下可选值。
conditional:默认值,和下面的hierarchical类似,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,而是会将该字段合并到基本实体类中。
flat:该模型只为每张表生成一个实体类。这个实体类包含表中的所有字段。这种模型最简单,推荐使用。
hierarchical:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段,则会为表生成一个包含所有BLOB字段的单独的实体类,然后为所有其他的字段另外生成一个单独的实体类。MBG会在所有生成的实体类之间维护一个继承关系。
targetRuntime:此属性用于指定生成的代码的运行时环境,支持以下可选值。
MyBatis3:默认值。
MyBatis3Simple:这种情况不会生成与Example相关的方法。
· introspectedColumnImpl:该参数可以指定扩展org.mybatis.generator.api.Introspected Column类的实现类。
一般情况下,使用如下配置即可。
<context id="Mysql" defaultModelType="flat">
如果不希望生成和Example查询有关的内容,则可以按照如下方法进行配置。
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
MBG配置中的其他几个标签基本上都是context的子标签,这些子标签(有严格的配置顺序,后面括号中的内容为这些标签可以配置的个数)包括以下几个。
· property(0个或多个)
· plugin(0个或多个)
commentGenerator(0个或1个)
· jdbcConnection(1个)
· javaTypeResolver(0个或1个)
· javaModelGenerator(1个)
· sqlMapGenerator(0个或1个)
· javaClientGenerator(0个或1个)
· table(1个或多个)
下面逐条介绍这些重要的标签
1.5.1 property标签
在开始介绍property标签前,先来了解一下数据库中的分隔符 。
举一个简单的例子,假设数据库中有一个表,名为user info,注意这个名字,user和info中间存在一个空格。如果直接写如下查询,在数据库执行这个查询时会报错。
select * from user info
可能会提示user表不存在或者user附近有语法错误,这种情况下该怎么写user info表呢?
这时就会用到分隔符,在MySQL中可以使用反单引号“`”作为分隔符,例如`user info`,在SQL Server中则是[user info]。通过分隔符可以将其中的内容
作为一个整体的字符串进行处理,当SQL中有数据库关键字时,使用反单引号括住关键字,可以避免数据库产生错误。
这里之所以先介绍分隔符,就是因为property标签中包含了以下3个和分隔符相关的属性。
· autoDelimitKeywords
· beginningDelimiter
· endingDelimiter
从名字可以看出,第一个是自动给关键字添加分隔符的属性。MBG中维护了一个关键字列表,当数据库的字段或表与这些关键字一样时,MBG 会自动给这些字段或表添加分隔符。关键字列表可以查看MBG中的org.mybatis.generator.internal.db.SqlReservedWords类。
后面两个属性很简单,一个是配置前置分隔符的属性,一个是配置后置分隔符的属性。在MySQL中,两个分隔符都是“`”,在SQL Server中分别为“[”和“]”,MySQL中的property配置写法如下。
除了上面3个和分隔符相关的属性外,还有以下3个属性。
javaFileEncoding
· javaFormatter
· xmlFormatter
属性javaFileEncoding设置要使用的Java文件的编码,例如GBK或UTF-8。默认使用当前运行环境的编码。后面两个Formatter相关的属性并不常用.
1.5.2 plugin标签
plugin标签可以配置0个或者多个,个数不受限制。
plugin 标签用来定义一个插件,用于扩展或修改通过 MBG 生成的代码。该插件将按在配置中配置的顺序执行。MBG插件使用的情况并不多,如果对开发插件有兴趣,可以参考MBG文档,或者参考下面要介绍的缓存插件的例子,这个例子包含在MBG插件中。
下面要介绍的缓存插件的全限定名称为 org.mybatis.generator.plugins.CachePlugin。
这个插件可以在生成的 SQL XML 映射文件中增加一个 cache 标签。只有当targetRuntime为MyBatis3时,该插件才有效。
该插件接受下列可选属性。
· cache_eviction
· cache_flushInterval
· cache_readOnly
cache_size
· cache_type
配置方法如下。
增加这个配置后,生成的Mapper.xml文件中会增加如下的缓存相关配置。
在MBG默认包含的插件中,除了缓存插件外,还有序列化插件、RowBounds插件、ToString插件等,关于这些插件的介绍可以查看 MBG 文档。查看英文文档: http://www.mybatis.org/generator/reference/plugins.html。查看中文文档:http://mbg.cndocs.tk/reference/plugins.html。
1.5.3 commentGenerator标签
该标签用来配置如何生成注释信息,最多可以配置1个。
该标签有一个可选属性 type,可以指定用户的实现类,该类需要实现 org.mybatis.generator.api.CommentGenerator接口,而且必有一个默认空的构造方法。type属性接收默认的特殊值 DEFAULT,使用默认的实现类 org.mybatis.generator.internal.DefaultCommentGenerator。
默认的实现类中提供了三个可选属性,需要通过property属性进行配置。
· suppressAllComments:阻止生成注释,默认为false。
· suppressDate:阻止生成的注释包含时间戳,默认为false。
· addRemarkComments:注释是否添加数据库表的备注信息,默认为false。
一般情况下,由于 MBG 生成的注释信息没有任何价值,而且有时间戳的情况下每次生成的注释都不一样,使用版本控制的时候每次都会提交,因而一般情况下都会屏蔽注释信息,可以如下配置。
提醒!
MBG是通过JDBC的DatabaseMetaData方式来获取数据库表和字段的备注信息的,大多数的JDBC驱动并不支持,常用数据库中MySQL支持,SQL Server不支持。Oracle特殊配置后可以支持,配置方式见下一节关于jdbcConnection标签的介绍。
1.5.4 jdbcConnection标签
jdbcConnection用于指定MBG要连接的数据库信息,
该标签必选,并且只能有一个。
配置该标签需要注意,如果JDBC驱动不在classpath下,就要通过classPathEntry标签引入jar包,这里推荐将jar包放到classpath下,或者参考前面classPathEntry配置JDBC驱动的方法。
该标签有两个必选属性。
· driverClass:访问数据库的JDBC驱动程序的完全限定类名。
· connectionURL:访问数据库的JDBC连接URL。
该标签还有两个可选属性。
· userId:访问数据库的用户ID。
· password:访问数据库的密码。
此外,该标签还可以接受多个property子标签,这里配置的property属性都会添加到JDBC驱动的属性中(使用proprety标签的name属性反射赋值)。
这个标签配置起来非常容易,基本配置如下。
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true"
userId="root"
password="123456">
</jdbcConnection>
Oracle可以通过特殊配置使JDBC方式能够获取到列的注释信息,配置方式如下。
<jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver"
connectionURL="jdbc:oracle:thin:@//localhost:1521/XE"
uerId="system"
password="oracle">
<property name="remarksReporting" value="true"/>
<jdbcConnection>
这种方式就是通过property标签配置了Oracle的remarksReporting属性,使得JDBC方式可以获取注释信息。
1.5.5 javaTypeResolver标签
该标签的配置用来指定JDBC类型和Java类型如何转换,最多可以配置一个。
该标签提供了一个可选的属性 type。另外,和 commentGenerator 类似,该标签提供了默认的实现DEFAULT,一般情况下使用默认即可,需要特殊处理的情况可以通过其他标签配置来解决,不建议修改该属性。
该属性还有一个可以配置的property标签,可以配置的属性为forceBigDecimals,该属性可以控制是否强制将 DECIMAL 和 NUMERIC 类型的 JDBC 字段转换为 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。
如果将forceBigDecimals设置为true,那么一定会使用java.math.BigDecimal类型。
javaTypeResolver标签配置如下
<javaTypeResolver>
<property name="forceBigDecimals" value=false"/>
</javaTypeResolver>
1.5.6 javaModelGenerator标签
该标签用来控制生成的实体类,根据context标签中配置的defaultModelType属性值的不同,一个表可能会对应生成多个不同的实体类。一个表对应多个类时使用并不方便,所以前面推荐使用flat,保证一个表对应一个实体类。该标签必须配置一个,并且最多配置一个。
该标签只有两个必选属性。
· targetPackage:生成实体类存放的包名。一般就是放在该包下,实际还会受到其他配置的影响。
· 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(可以通过 classPathEntry 引入 jar 包,或者classpath方式),那么MBG不会覆盖和父类中完全匹配的属性。匹配规则如下。
属性名完全相同
属性类型相同
属性有getter方法
属性有setter方法
trimStrings:判断是否对数据库查询结果进行trim操作,默认值为false。如果设置为true就会生成如下代码。
public void setUsername(String username){
this.username=username==null?null:username.trim();
}
javaModelGenerator配置示例如下。
<javaModelGenerator targetPackage="com.xiaomifeng1010.mybatis.bean"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
1.5.7 sqlMapGenerator标签
该标签用于配置SQL映射生成器(Mapper.xml文件)的属性,该标签可选,最多配置一个。如果targetRuntime设置为MyBatis3,则只有当javaClientGenerator配置需要XML时,该标签才必须配置一个。如果没有配置javaClientGenerator,则使用以下规则。
如果指定了一个sqlMapGenerator,那么MBG将只生成XML的SQL映射文件和实体类。
· 如果没有指定sqlMapGenerator,那么MBG将只生成实体类。
该标签只有两个必选属性。
· targetPackage:生成SQL映射文件(XML文件)存放的包名。一般就是放在该包下,实际还会受到其他配置的影响。
· targetProject:指定目标项目路径,可以使用相对路径或绝对路径。
该标签还有一个可选的 property 子标签属性 enableSubPackages,如果为 true,MBG会根据catalog和schema来生成子包。如果为false就会直接用targetPackage属性,默认为false。
sqlMapGenerator配置示例如下。
<!-- sqlMapGenerator:sql映射生成策略: -->
<sqlMapGenerator targetPackage="com.xiaomifeng1010.mybatis.dao"
targetProject=".\conf">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
1.5.8 javaClientGenerator标签
该标签用于配置Java客户端生成器(Mapper 接口)的属性,该标签可选,最多配置一个。如果不配置该标签,就不会生成Mapper接口。
该标签有以下3个必选属性。
· type:用于选择客户端代码(Mapper接口)生成器,用户可以自定义实现,需要继承org.mybatis.generator.codegen.AbstractJavaClientGenerator 类,必须有一个默认空的构造方法。该属性提供了以下预设的代码生成器,首先根据context的targetRuntime分成两类(不考虑 iBATIS)。
MyBatis3
√ ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件。
√ MIXEDMAPPER:XML和注解的混合形式,上面这种情况中的SQL Provider注解方法会被XML方式替代。
√ XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
MyBatis3Simple
√ ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件。
√ XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
· targetPackage:生成 Mapper 接口存放的包名。一般就是放在该包下,实际还会受到其他配置的影响。
· targetProject:指定目标项目路径,可以使用相对路径或绝对路径。
该标签还有一个可选属性implementationPackage,如果指定了该属性,Mapper接口的实现类就会生成在这个属性指定的包中。
该标签还支持几个property子标签,由于这些属性不常用,因此不做介绍。
javaClientGenerator标签中的type属性非常重要,此处提供一些选择的建议。
· XMLMAPPER:推荐使用,将接口和XML完全分离,容易维护,接口中不出现SQL语句,只在XML中配置SQL,修改SQL时不需要重新编译。
· ANNOTATEDMAPPER:不推荐使用,纯注解方式的好处是,SQL都在Java代码中,基本上只在一处写代码,看着方便。但是实际上维护不容易,写 SQL 过程中需要大量字符串拼接操作,复杂情况需要大量的Java判断,代码很乱,不容易维护。
· MIXEDMAPPER:不推荐使用,这种情况下注解和XML混合使用会很乱,不利于维护。
javaClientGenerator标签配置示例如下。
<!-- javaClientGenerator:指定mapper接口所在的位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.xiaomifeng1010.mybatis.dao"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
1.5.9 table标签
table是最重要的一个标签,该标签用于配置需要通过内省数据库的表,只有在table中配置过的表,才能经过上述其他配置生成最终的代码,该标签至少要配置一个,可以配置多个。
table标签有一个必选属性tableName,该属性指定要生成的表名,可以使用SQL通配符匹配多个表。
例如要生成全部的表,可以如下配置。
<table tableName="%"/>
table标签包含多个可选属性。
· 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通配符(_和%)进行转义。对于某些驱动,当schema或表名中包含SQL通配符时,转义是必须的。有一些驱动则需要将下画线进行转义,例如MY_TABLE。默认值是false。
· delimitIdentifiers:是否给标识符增加分隔符。默认为false。当catalog、schema或tableName中包含空白时,默认为true。
· delimitAllColumns:是否对所有列添加分隔符。默认为false。
table标签包含多个可用的property子标签,可选属性如下。
· constructorBased:和javaModelGenerator中的属性含义一样。
· ignoreQualifiersAtRuntime:生成的 SQL 中的表名将不会包含 schema 和catalog前缀。
· immutable:和javaModelGenerator中的属性含义一样。
· modelOnly:用于配置是否只生成实体类。如果设置为true,就不会有Mapper接口,同时还会覆盖属性中的 enableXXX 方法,并且不会生成任何 CRUD 方法。如果配置了sqlMapGenerator,并且modelOnly为true,那么XML映射文件中只有实体对象的映射标签(resultMap)。
· rootClass:和javaModelGenerator中的属性含义一样。
· rootInterface:和javaClientGenerator中的属性含义一样。
· runtimeCatalog:运行时的catalog,当生成表和运行环境表的catalog不一样时,可以使用该属性进行配置。
runtimeSchema:运行时的schema,当生成表和运行环境表的schema不一样时,可以使用该属性进行配置。
· runtimeTableName:运行时的tableName,当生成表和运行环境表的tableName不一样时,可以使用该属性进行配置。
· selectAllOrderByClause:该属性值会追加到selectAll方法后的SQL中,直接与order by拼接后添加到SQL末尾。
· useActualColumnNames:如果设置为true,那么MBG会使用从数据库元数据获取的列名作为生成的实体对象的属性。如果为false(默认值为false),MGB将会尝试将返回的名称转换为驼峰形式。在这两种情况下,可以通过columnOverride标签显式指定,此时将会忽略该属性。
· 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.5.9.1 generatedKey标签
该标签用来指定自动生成主键的属性(identity字段或者sequences序列)。如果指定这个标签,MBG将在生成insert的SQL映射文件中插入一个selectKey标签。这个标签非常重要,而且只能配置一个。
该标签包含以下两个必选属性。
· column:生成列的列名。
· sqlStatement:返回新值的SQL语句。如果这是一个identity列,则可以使用其中一个预定义的的特殊值,预定义值如下。
Cloudscape
DB2
DB2_MF
Derby
HSQLDB
Informix
MySQL
SQL Server
SYBASE
JDBC:使用该值时,MyBatis会使用JDBC标准接口来获取值,这是一个独立于数据库获取标识列中的值的方法。
该标签还包含两个可选属性。
· identity:当设置为true时,该列会被标记为identity列,并且selectKey标签会被插入在insert后面。当设置为false时,selectKey会插入到insert之前(通常是序列)。切记 :即使type属性指定为post,仍然需要将identity列设置为true,这会作为MBG从插入列表中删除该列的标识。该属性默认值是false。
· type:type=post且identity=true时,生成的selectKey中order=AFTER;当type=pre时,identity只能为false,生成的selectKey中order=BEFORE。可以这么理解,自动增长的列只有插入到数据库后才能得到ID,所以是AFTER;使用序列时,只有先获取序列之后才能插入数据库,所以是BEFORE。
table配置示例一 (针对MySQL、SQL Server 等自增类型主键)。
该配置生成的对应的insert方法如下。
该配置生成的对应的insert方法如下。
1.5.9.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对此标签的影响,可以查看完整文档。
1.5.9.3 columnOverride标签
该标签用于将某些默认计算的属性值更改为指定的值,标签可选,可以配置多个。
该标签有一个必选属性column,表示要重写的列名。
该标签有多个可选属性,具体如下。
· property:要使用的Java属性的名称。如果没有指定,MBG会根据列名生成。例如,如果一个表的一列名为STRT_DTE,MBG会根据table的
useActualColumnNames属性生成STRT_DTE或strtDte。
· javaType:列的属性值为完全限定的 Java 类型。如果需要,可以覆盖由JavaTypeResolver计算出的类型。
· jdbcType:列的JDBC类型(如INTEGER、DECIMAL、NUMERIC、VARCHAR等)。如果需要,可以覆盖由JavaTypeResolver计算出的类型。
· typeHandler:根据用户定义的需要用来处理列的类型处理器。必须是一个继承自TypeHandler 接口的全限定的类名。如果没有指定或者是空白,MyBatis 会用默认的类型处理器来处理类型。切记 :MBG不会校验这个类型处理器是否存在或可用,MGB只是简单地将值插入到已生成的SQL映射的配置文件中。
· delimitedColumnName:指定是否应在生成的SQL的列名称上增加分隔符。如果列的名称中包含空格,MGB 会自动添加分隔符,所以只有当列名需要被强制为一个合适的名字或者列名是数据库中的保留字时,才是必要的。
columnOverride配置示例如下。
1.5.9.4 ignoreColumn标签
该标签是可选标签,用于忽略不需要生成的字段,可以配置多个。
column是必选属性,表示要忽略的列名。
该标签还有一个可选属性 delimitedColumnName,标识匹配列名的时候是否区分大小写。如果为true则区分,默认值为false,表示不区分大小写。
1.6 Example类
在MBG的context中将targetRuntime配置为MyBatis3时,MBG会生成和Example相关的对象和方法。
在创建实体类时,每个实体类创建了对应的example类
查看example类
package com.xiaomifeng1010.mybatis.bean;
import java.util.ArrayList;
import java.util.List;
public class EmployeeExample {
/**
* This field was generated by MyBatis Generator.
* This field corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
protected String orderByClause;
/**
* This field was generated by MyBatis Generator.
* This field corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
protected boolean distinct;
/**
* This field was generated by MyBatis Generator.
* This field corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
protected List<Criteria> oredCriteria;
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
public EmployeeExample() {
oredCriteria = new ArrayList<Criteria>();
}
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
public void setOrderByClause(String orderByClause) {
this.orderByClause = orderByClause;
}
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
public String getOrderByClause() {
return orderByClause;
}
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
public void setDistinct(boolean distinct) {
this.distinct = distinct;
}
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
public boolean isDistinct() {
return distinct;
}
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
public List<Criteria> getOredCriteria() {
return oredCriteria;
}
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
public void or(Criteria criteria) {
oredCriteria.add(criteria);
}
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
public Criteria or() {
Criteria criteria = createCriteriaInternal();
oredCriteria.add(criteria);
return criteria;
}
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
public Criteria createCriteria() {
Criteria criteria = createCriteriaInternal();
if (oredCriteria.size() == 0) {
oredCriteria.add(criteria);
}
return criteria;
}
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
protected Criteria createCriteriaInternal() {
Criteria criteria = new Criteria();
return criteria;
}
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
public void clear() {
oredCriteria.clear();
orderByClause = null;
distinct = false;
}
/**
* This class was generated by MyBatis Generator.
* This class corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
protected abstract static class GeneratedCriteria {
protected List<Criterion> criteria;
protected GeneratedCriteria() {
super();
criteria = new ArrayList<Criterion>();
}
public boolean isValid() {
return criteria.size() > 0;
}
public List<Criterion> getAllCriteria() {
return criteria;
}
public List<Criterion> getCriteria() {
return criteria;
}
protected void addCriterion(String condition) {
if (condition == null) {
throw new RuntimeException("Value for condition cannot be null");
}
criteria.add(new Criterion(condition));
}
protected void addCriterion(String condition, Object value, String property) {
if (value == null) {
throw new RuntimeException("Value for " + property + " cannot be null");
}
criteria.add(new Criterion(condition, value));
}
protected void addCriterion(String condition, Object value1, Object value2, String property) {
if (value1 == null || value2 == null) {
throw new RuntimeException("Between values for " + property + " cannot be null");
}
criteria.add(new Criterion(condition, value1, value2));
}
public Criteria andIdIsNull() {
addCriterion("id is null");
return (Criteria) this;
}
public Criteria andIdIsNotNull() {
addCriterion("id is not null");
return (Criteria) this;
}
public Criteria andIdEqualTo(Integer value) {
addCriterion("id =", value, "id");
return (Criteria) this;
}
public Criteria andIdNotEqualTo(Integer value) {
addCriterion("id <>", value, "id");
return (Criteria) this;
}
public Criteria andIdGreaterThan(Integer value) {
addCriterion("id >", value, "id");
return (Criteria) this;
}
public Criteria andIdGreaterThanOrEqualTo(Integer value) {
addCriterion("id >=", value, "id");
return (Criteria) this;
}
public Criteria andIdLessThan(Integer value) {
addCriterion("id <", value, "id");
return (Criteria) this;
}
public Criteria andIdLessThanOrEqualTo(Integer value) {
addCriterion("id <=", value, "id");
return (Criteria) this;
}
public Criteria andIdIn(List<Integer> values) {
addCriterion("id in", values, "id");
return (Criteria) this;
}
public Criteria andIdNotIn(List<Integer> values) {
addCriterion("id not in", values, "id");
return (Criteria) this;
}
public Criteria andIdBetween(Integer value1, Integer value2) {
addCriterion("id between", value1, value2, "id");
return (Criteria) this;
}
public Criteria andIdNotBetween(Integer value1, Integer value2) {
addCriterion("id not between", value1, value2, "id");
return (Criteria) this;
}
public Criteria andLastNameIsNull() {
addCriterion("last_name is null");
return (Criteria) this;
}
public Criteria andLastNameIsNotNull() {
addCriterion("last_name is not null");
return (Criteria) this;
}
public Criteria andLastNameEqualTo(String value) {
addCriterion("last_name =", value, "lastName");
return (Criteria) this;
}
public Criteria andLastNameNotEqualTo(String value) {
addCriterion("last_name <>", value, "lastName");
return (Criteria) this;
}
public Criteria andLastNameGreaterThan(String value) {
addCriterion("last_name >", value, "lastName");
return (Criteria) this;
}
public Criteria andLastNameGreaterThanOrEqualTo(String value) {
addCriterion("last_name >=", value, "lastName");
return (Criteria) this;
}
public Criteria andLastNameLessThan(String value) {
addCriterion("last_name <", value, "lastName");
return (Criteria) this;
}
public Criteria andLastNameLessThanOrEqualTo(String value) {
addCriterion("last_name <=", value, "lastName");
return (Criteria) this;
}
public Criteria andLastNameLike(String value) {
addCriterion("last_name like", value, "lastName");
return (Criteria) this;
}
public Criteria andLastNameNotLike(String value) {
addCriterion("last_name not like", value, "lastName");
return (Criteria) this;
}
public Criteria andLastNameIn(List<String> values) {
addCriterion("last_name in", values, "lastName");
return (Criteria) this;
}
public Criteria andLastNameNotIn(List<String> values) {
addCriterion("last_name not in", values, "lastName");
return (Criteria) this;
}
public Criteria andLastNameBetween(String value1, String value2) {
addCriterion("last_name between", value1, value2, "lastName");
return (Criteria) this;
}
public Criteria andLastNameNotBetween(String value1, String value2) {
addCriterion("last_name not between", value1, value2, "lastName");
return (Criteria) this;
}
public Criteria andEmailIsNull() {
addCriterion("email is null");
return (Criteria) this;
}
public Criteria andEmailIsNotNull() {
addCriterion("email is not null");
return (Criteria) this;
}
public Criteria andEmailEqualTo(String value) {
addCriterion("email =", value, "email");
return (Criteria) this;
}
public Criteria andEmailNotEqualTo(String value) {
addCriterion("email <>", value, "email");
return (Criteria) this;
}
public Criteria andEmailGreaterThan(String value) {
addCriterion("email >", value, "email");
return (Criteria) this;
}
public Criteria andEmailGreaterThanOrEqualTo(String value) {
addCriterion("email >=", value, "email");
return (Criteria) this;
}
public Criteria andEmailLessThan(String value) {
addCriterion("email <", value, "email");
return (Criteria) this;
}
public Criteria andEmailLessThanOrEqualTo(String value) {
addCriterion("email <=", value, "email");
return (Criteria) this;
}
public Criteria andEmailLike(String value) {
addCriterion("email like", value, "email");
return (Criteria) this;
}
public Criteria andEmailNotLike(String value) {
addCriterion("email not like", value, "email");
return (Criteria) this;
}
public Criteria andEmailIn(List<String> values) {
addCriterion("email in", values, "email");
return (Criteria) this;
}
public Criteria andEmailNotIn(List<String> values) {
addCriterion("email not in", values, "email");
return (Criteria) this;
}
public Criteria andEmailBetween(String value1, String value2) {
addCriterion("email between", value1, value2, "email");
return (Criteria) this;
}
public Criteria andEmailNotBetween(String value1, String value2) {
addCriterion("email not between", value1, value2, "email");
return (Criteria) this;
}
public Criteria andGenderIsNull() {
addCriterion("gender is null");
return (Criteria) this;
}
public Criteria andGenderIsNotNull() {
addCriterion("gender is not null");
return (Criteria) this;
}
public Criteria andGenderEqualTo(String value) {
addCriterion("gender =", value, "gender");
return (Criteria) this;
}
public Criteria andGenderNotEqualTo(String value) {
addCriterion("gender <>", value, "gender");
return (Criteria) this;
}
public Criteria andGenderGreaterThan(String value) {
addCriterion("gender >", value, "gender");
return (Criteria) this;
}
public Criteria andGenderGreaterThanOrEqualTo(String value) {
addCriterion("gender >=", value, "gender");
return (Criteria) this;
}
public Criteria andGenderLessThan(String value) {
addCriterion("gender <", value, "gender");
return (Criteria) this;
}
public Criteria andGenderLessThanOrEqualTo(String value) {
addCriterion("gender <=", value, "gender");
return (Criteria) this;
}
public Criteria andGenderLike(String value) {
addCriterion("gender like", value, "gender");
return (Criteria) this;
}
public Criteria andGenderNotLike(String value) {
addCriterion("gender not like", value, "gender");
return (Criteria) this;
}
public Criteria andGenderIn(List<String> values) {
addCriterion("gender in", values, "gender");
return (Criteria) this;
}
public Criteria andGenderNotIn(List<String> values) {
addCriterion("gender not in", values, "gender");
return (Criteria) this;
}
public Criteria andGenderBetween(String value1, String value2) {
addCriterion("gender between", value1, value2, "gender");
return (Criteria) this;
}
public Criteria andGenderNotBetween(String value1, String value2) {
addCriterion("gender not between", value1, value2, "gender");
return (Criteria) this;
}
public Criteria andDIdIsNull() {
addCriterion("d_id is null");
return (Criteria) this;
}
public Criteria andDIdIsNotNull() {
addCriterion("d_id is not null");
return (Criteria) this;
}
public Criteria andDIdEqualTo(Integer value) {
addCriterion("d_id =", value, "dId");
return (Criteria) this;
}
public Criteria andDIdNotEqualTo(Integer value) {
addCriterion("d_id <>", value, "dId");
return (Criteria) this;
}
public Criteria andDIdGreaterThan(Integer value) {
addCriterion("d_id >", value, "dId");
return (Criteria) this;
}
public Criteria andDIdGreaterThanOrEqualTo(Integer value) {
addCriterion("d_id >=", value, "dId");
return (Criteria) this;
}
public Criteria andDIdLessThan(Integer value) {
addCriterion("d_id <", value, "dId");
return (Criteria) this;
}
public Criteria andDIdLessThanOrEqualTo(Integer value) {
addCriterion("d_id <=", value, "dId");
return (Criteria) this;
}
public Criteria andDIdIn(List<Integer> values) {
addCriterion("d_id in", values, "dId");
return (Criteria) this;
}
public Criteria andDIdNotIn(List<Integer> values) {
addCriterion("d_id not in", values, "dId");
return (Criteria) this;
}
public Criteria andDIdBetween(Integer value1, Integer value2) {
addCriterion("d_id between", value1, value2, "dId");
return (Criteria) this;
}
public Criteria andDIdNotBetween(Integer value1, Integer value2) {
addCriterion("d_id not between", value1, value2, "dId");
return (Criteria) this;
}
}
/**
* This class was generated by MyBatis Generator.
* This class corresponds to the database table tbl_employee
*
* @mbggenerated do_not_delete_during_merge Fri Oct 11 22:03:26 CST 2019
*/
public static class Criteria extends GeneratedCriteria {
protected Criteria() {
super();
}
}
/**
* This class was generated by MyBatis Generator.
* This class corresponds to the database table tbl_employee
*
* @mbggenerated Fri Oct 11 22:03:26 CST 2019
*/
public static class Criterion {
private String condition;
private Object value;
private Object secondValue;
private boolean noValue;
private boolean singleValue;
private boolean betweenValue;
private boolean listValue;
private String typeHandler;
public String getCondition() {
return condition;
}
public Object getValue() {
return value;
}
public Object getSecondValue() {
return secondValue;
}
public boolean isNoValue() {
return noValue;
}
public boolean isSingleValue() {
return singleValue;
}
public boolean isBetweenValue() {
return betweenValue;
}
public boolean isListValue() {
return listValue;
}
public String getTypeHandler() {
return typeHandler;
}
protected Criterion(String condition) {
super();
this.condition = condition;
this.typeHandler = null;
this.noValue = true;
}
protected Criterion(String condition, Object value, String typeHandler) {
super();
this.condition = condition;
this.value = value;
this.typeHandler = typeHandler;
if (value instanceof List<?>) {
this.listValue = true;
} else {
this.singleValue = true;
}
}
protected Criterion(String condition, Object value) {
this(condition, value, null);
}
protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
super();
this.condition = condition;
this.value = value;
this.secondValue = secondValue;
this.typeHandler = typeHandler;
this.betweenValue = true;
}
protected Criterion(String condition, Object value, Object secondValue) {
this(condition, value, secondValue, null);
}
}
}
使用Example查询能解决大部分复杂的单表操作,从一定程度上能减少工作量。但是建议在条件很多并且判断很多的情况下,避免使用Example查询。这种情况下,使用XML方式会更有效。
说明:本文参考了《mybatis从入门到精通》作者:刘增辉(开源了mybatis的page—helper的一个大牛)