Mybatis Generator 配置

一个空白的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>
    
    <properties resource="xxx" />
    
    <classPathEntry location="xxx/mysql-connector-java-5.1.47.jar"/>
    
    <context id="context" targetRuntime="MyBatis3">
        
        <property name="xxx" value="xxx" />
        
        <plugin type="org.mybatis.generator.plugins.SqlMapConfigPlugin" />
        
        <commentGenerator>
            <property name="suppressAllComments" value="false"/>
            <property name="suppressDate" value="true"/>
        </commentGenerator>
        
        <jdbcConnection driverClass="" connectionURL="" userId="" password=""/>
        
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        
        <javaModelGenerator targetPackage="" targetProject="THIS_CONFIGURATION_IS_NOT_REQUIRED">
            <property name="enableSubPackages" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        
        <sqlMapGenerator targetPackage="" targetProject="THIS_CONFIGURATION_IS_NOT_REQUIRED">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        
        <javaClientGenerator targetPackage="" targetProject="THIS_CONFIGURATION_IS_NOT_REQUIRED" type="XMLMAPPER">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        
        <table tableName="" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
               enableUpdateByExample="false"/>
    </context>
</generatorConfiguration>

maven下使用方式以下:

<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.7</version>
    <configuration>
        <configurationFile>src/main/resources/mybatis-generator/mybatis-generator.xml</configurationFile>
        <overwrite>true</overwrite>
        <verbose>true</verbose>
    </configuration>
    <dependencies>
        <dependency> <!-- github上, mybatis-generator的第三方插件扩展. 不须要能够删除 -->
            <groupId>com.itfsw</groupId>
            <artifactId>mybatis-generator-plugin</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
    </dependencies>
</plugin>

mybatis-generator.xml详细说明:

1. properties子节点

这个元素用来指定外部的属性元素,不是必须的元素.html

元素用于指定一个须要在配置中解析使用的外部属性文件,引入属性文件后,能够在配置中使用 ${property}这种形式的引用,经过这种方式引用属性文件中的属性值. 对于后面须要配置的jdbc信息和targetProject属性会颇有用.这个属性能够经过resource或者url来指定属性文件的位置,这两个属性只能使用其中一个来指定,同时出现会报错.java

  • resource:指定classpath下的属性文件,例如properties/generatorConfig.properties
  • url:能够指定文件系统上的特定位置,例如file:///C:/myfolder/generatorConfig.properties

2. classPathEntry子节点

这个元素的做用是将mybatis-generator运行时须要用到的jar包(或zip格式)添加到classpath下.(若是使用mybatis-generator-maven-plugin插件运行, 在dependencies中添加便可不须要添加该子节点)mysql

3. context子节点

<context>元素用于指定生成一组对象的环境.例如指定要链接的数据库,要生成对象的类型和要处理的数据库中的表.git

该元素只有一个必选属性id,用来惟一肯定一个<context>元素.github

此外还有几个可选属性:正则表达式

  • defaultModelType:这个属性很重要,这个属性定义了MBG如何生成实体类.这个属性有如下可选值:
    • conditional:这是默认值,这个模型和下面的hierarchical相似,除了若是那个单独的类将只包含一个字段,将不会生成一个单独的类. 所以,若是一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中.
    • flat:该模型为每一张表只生成一个实体类.这个实体类包含表中的全部字段.这种模型最简单,推荐使用.
    • hierarchical:若是表有主键,那么该模型会产生一个单独的主键实体类,若是表还有BLOB字段, 则会为表生成一个包含全部BLOB字段的单独的实体类,而后为全部其余的字段生成一个单独的实体类. MBG会在全部生成的实体类之间维护一个继承关系.
  • targetRuntime:此属性用于指定生成的代码的运行时环境.该属性支持如下可选值(通常状况下使用默认值便可,有关这些值的具体做用以及区别请查看中文文档的详细内容):introspectedColumnImpl:该参数能够指定扩展org.mybatis.generator.api.IntrospectedColumn该类的实现类.该属性的做用能够查看扩展MyBatis Generator.
    • MyBatis3:这是默认值
    • MyBatis3Simple: 不生成和Example查询有关的内容
    • Ibatis2Java2:
    • Ibatis2Java5:

3.1 property子节点

  • autoDelimitKeywords: 当表名或者字段名为SQL关键字的时候,能够设置该属性为true,MBG会自动给表名或字段名添加分隔符.
  • beginningDelimiter: 指明数据库的用于标记数据库对象名的符号. 因为beginningDelimiter和endingDelimiter的默认值为双引号("),在Mysql中不能这么写,因此还要将这两个默认值改成反单引号(`).
  • endingDelimiter: 同beginningDelimiter.
  • javaFileEncoding: java文件的编码,默认使用当前平台的编码,只有当生产的编码须要特殊指定时才须要使用,通常用不到.
  • javaFormatter: 若是你想使用模板来定制生成的java文件的样式,你能够经过指定这个属性的值来实现.
  • xmlFormatter: 若是你想使用模板来定制生成的xml文件的样式,你能够经过指定这个属性的值来实现.

3.2 plugin子节点

用来定义一个插件.插件用于扩展或修改经过MyBatis Generator (MBG)代码生成器生成的代码.插件将按在配置中配置的顺序执行.sql

https://github.com/itfsw/mybatis-generator-plugin/tree/master:第三方mybatis-generator插件数据库

3.3 commentGenerator子节点

该元素有一个可选属性type, 能够指定用户的实现类,该类须要实现org.mybatis.generator.api.CommentGenerator接口.并且必有一个默认的构造方法.api

这个属性接收默认的特殊值DEFAULT,会使用默认的实现类org.mybatis.generator.internal.DefaultCommentGenerator.默认的实现类中提供了两个可选属性,须要经过<property>属性进行配置.mybatis

  • suppressAllComments:阻止生成注释,默认为false(建议保留为默认值)
  • suppressDate:阻止生成的注释包含时间戳,默认为false

通常状况下因为MBG生成的时间注释信息没有任何价值,并且每次生成的注释都不同,使用版本控制的时候每次都会提交,于是通常状况下咱们都会屏蔽时间的注释信息.

对于suppressAllComments, 无论你是否要重写本身的注释生成器,有一点不能忘记,那就是注释中必定要保留@mbggenerated, MBG经过该字符串来判断代码是否为代码生成器生成的代码,有该标记的的代码在从新生成的时候会被删除,不会重复.不会在XML中出现重复元素.

3.4 jdbcConnection子节点

用于指定数据库链接信息,该元素必选,而且只能有一个.

  • driverClass: 访问数据库的JDBC驱动程序的彻底限定类名
  • connectionURL: 访问数据库的JDBC链接URL
  • userId: 访问数据库的用户ID
  • password: 访问数据库的密码

3.5 javaTypeResolver子节点

这个元素的配置用来指定JDBC类型和Java类型如何转换.该元素提供了一个可选的属性type,和<commentGenerator>比较相似,提供了默认的实现DEFAULT,通常状况下使用默认便可,须要特殊处理的状况能够经过其余元素配置来解决,不建议修改该属性.

  • 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.
  • useJSR310Types: 用于指定MyBatis Generator是否应强制在DATE,TIME和TIMESTAMP字段中使用JSR-310数据类型,而不是使用java.util.Date.

3.6 javaModelGenerator子节点

该元素用来控制生成的实体类,根据<context>中配置的defaultModelType,一个表可能会对应生成多个不一样的实体类.

该元素只有两个属性,都是必选的.

  • targetPackage:生成实体类存放的包名,通常就是放在该包下.实际还会受到其余配置的影响(<table>中会提到).
  • targetProject:指定目标项目路径,使用的是文件系统的绝对路径.

该元素支持如下几个<property>子元素属性:

  • constructorBased:该属性只对MyBatis3有效,若是true就会使用构造方法入参,若是false就会使用setter方式.默认为false.
  • enableSubPackages:若是true,MBG会根据catalog和schema来生成子包.若是false就会直接用targetPackage属性.默认为false.
  • immutable:该属性用来配置实体类属性是否可变,若是设置为true,那么constructorBased无论设置成什么,都会使用构造方法入参,而且不会生成setter方法.默认为false.
  • rootClass:设置全部实体类的基类.若是设置,须要使用类的全限定名称.而且若是MBG可以加载rootClass,那么MBG不会覆盖和父类中彻底匹配的属性.匹配规则:
    • 属性名彻底相同
    • 属性类型相同
    • 属性有getter方法
    • 属性有setter方法
  • trimStrings:是否对数据库查询结果进行trim操做,若是设置为true, setter方法中会调用trim()方法.默认值为false.

3.7 sqlMapGenerator子节点

该元素可选,最多配置一个.可是有以下两种必选的特殊状况:

  • 若是targetRuntime目标是iBATIS2,该元素必须配置一个.
  • 若是targetRuntime目标是MyBatis3,只有当<javaClientGenerator>须要XML时,该元素必须配置一个. 若是没有配置 <javaClientGenerator>,则使用如下的规则:
    • 若是指定了一个<sqlMapGenerator>,那么MBG将只生成XML的SQL映射文件和实体类.
    • 若是没有指定<sqlMapGenerator>,那么MBG将只生成实体类.

该元素的两个属性和javaModelGenerator子节点同样,都是必选的.

该元素支持<property>子元素,只有一个能够配置的属性:

  • enableSubPackages:若是true,MBG会根据catalog和schema来生成子包.若是false就会直接用targetPackage属性.默认为false.

3.8 javaClientGenerator子节点

若是不配置该元素,就不会生成Mapper接口. 该元素有4个属性:

  • 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接口
  • targetPackage与targetProject: sqlMapGenerator子节点同样, 都是必选的.
  • implementationPackage:若是指定了该属性,实现类就会生成在这个包中.

该元素支持<property>子元素设置的属性:

  • enableSubPackages: 若是true,MBG会根据catalog和schema来生成子包.若是false就会直接用targetPackage属性.默认为false.
  • exampleMethodVisibility
  • methodNameCalculator
  • rootInterface
  • useLegacyBuilder

这几个属性不太经常使用,具体做用请看完整的文档.

3.9 table子节点

该元素至少要配置一个,能够配置多个.该元素用来配置要经过内省的表.只有配置的才会生成实体类和其余文件(注意,table里面不少参数都是对javaModelGenerator,context等元素的默认属性的一个复写.).

该元素有一个必选属性:

  • tableName:指定要生成的表名,可使用SQL通配符匹配多个表.若是要生成所有的表,能够设置为"%".

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

  • schema:数据库的schema,可使用SQL通配符匹配.若是设置了该值,生成SQL的表名会变成如schema.tableName的形式.
  • catalog:数据库的catalog,若是设置了该值,生成SQL的表名会变成如catalog.tableName的形式.
  • alias:若是指定,这个值会用在生成的select查询SQL的表的别名和列名上.列名会被别名为 alias_actualColumnName(别名_实际列名) 这种模式.
  • domainObjectName:生成的domain类的名字,若是不设置,直接使用表名做为domain类的名字.
  • enableInsert:(默认true):指定是否生成insert语句.
  • enableSelectByPrimaryKey:(默认true):指定是否生成按照主键查询对象的语句(就是getById或get).
  • enableSelectByExample:(默认true):MyBatis3Simple为false,指定是否生成动态查询语句.
  • enableUpdateByPrimaryKey:(默认true):指定是否生成按照主键修改对象的语句(即update).
  • enableDeleteByPrimaryKey:(默认true):指定是否生成按照主键删除对象的语句(即delete).
  • enableDeleteByExample:(默认true):MyBatis3Simple为false,指定是否生成动态删除语句.
  • enableCountByExample:(默认true):MyBatis3Simple为false,指定是否生成动态查询总条数语句(用于分页的总条数查询).
  • enableUpdateByExample:(默认true):MyBatis3Simple为false,指定是否生成动态修改语句(只修改对象中不为空的属性).
  • selectByPrimaryKeyQueryId:DBA跟踪工具会用到,具体请看详细文档.
  • selectByExampleQueryId:DBA跟踪工具会用到,具体请看详细文档.
  • modelType:参考context元素的defaultModelType,至关于覆盖.
  • escapeWildcards:这个属性表示当查询列,是否对schema和表名中的SQL通配符 ('_' and '%') 进行转义. 对于某些驱动当schema或表名中包含SQL通配符时(例如,一个表名是MY_TABLE,有一些驱动须要将下划线进行转义)是必须的.默认值是false.
  • delimitIdentifiers:参考tableName的解释,注意,默认的delimitIdentifiers是双引号,若是相似MYSQL这样的数据库,使用的是`(反引号,那么还须要设置context的beginningDelimiter和endingDelimiter属性)
  • delimitAllColumns:设置是否全部生成的SQL中的列名都使用标识符引发来.默认为false,delimitIdentifiers参考context的属性

该元素包含多个可用的<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个或多个)

3.9.1 generatedKey子节点

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

  • column:主键的列名
  • sqlStatement:要生成的selectKey语句,有如下可选项:
  • Cloudscape:至关于selectKey的SQL为:VALUES IDENTITY_VAL_LOCAL()
  • DB2 :至关于selectKey的SQL为:VALUES IDENTITY_VAL_LOCAL()
  • DB2_MF :至关于selectKey的SQL为:SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1
  • Derby :至关于selectKey的SQL为:VALUES IDENTITY_VAL_LOCAL()
  • HSQLDB :至关于selectKey的SQL为:CALL IDENTITY()
  • Informix :至关于selectKey的SQL为:select dbinfo('sqlca.sqlerrd1') from systables where tabid=1
  • MySql :至关于selectKey的SQL为:SELECT LAST_INSERT_ID()
  • SqlServer :至关于selectKey的SQL为:SELECT SCOPE_IDENTITY()
  • SYBASE :至关于selectKey的SQL为:SELECT @@IDENTITY
  • JDBC :至关于在生成的insert元素上添加useGeneratedKeys="true"和keyProperty属性

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

  • 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.
配置1: 	
<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>
配置2: 
<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>
配置3:
<table tableName="user login info" domainObjectName="UserLoginInfo">
  	<generatedKey column="id" sqlStatement="JDBC"/>
</table>
<insert id="insert" keyProperty="id" parameterType="test.model.UserLoginInfo" useGeneratedKeys="true">
	insert into `user login info` (username, logindate, loginip)
	values (#{username,jdbcType=VARCHAR}, #{logindate,jdbcType=TIMESTAMP}, #{loginip,jdbcType=VARCHAR})
</insert>		

3.9.2 columnRenamingRule子节点

该元素会在根据表中列名计算对象属性名以前先重命名列名,很是适合用于表中的列都有公用的前缀字符串的时候, 好比列名为:CUST_ID,CUST_NAME,CUST_EMAIL,CUST_ADDRESS等, 那么就能够设置searchString为"^CUST_",并使用空白替换, 那么生成的Customer对象中的属性名称就不是custId,custName等,而是先被替换为ID,NAME,EMAIL,而后变成属性:id,name,email. 注意,MBG是使用java.util.regex.Matcher.replaceAll来替换searchString和replaceString的,若是使用了columnOverride元素,该属性无效.

该元素有一个必选属性:

  • searchString:定义将被替换的字符串的正则表达式.

该元素有一个可选属性:

  • replaceString:这是一个用来替换搜索字符串列每个匹配项的字符串.若是没有指定,就会使用空字符串.

关于<table>的<property>属性useActualColumnNames对此的影响能够查看完整文档.

3.9.3 columnOverride子节点

该元素可选,能够配置多个. 该元素从将某些属性默认计算的值更改成指定的值.

该元素有一个必选属性:

  • column:要重写的列名.

该元素有多个可选属性:

  • property:要使用的Java属性的名称.若是没有指定,MBG会根据列名生成.
  • javaType:该列属性值为彻底限定的Java类型.若是须要,这能够覆盖由JavaTypeResolver计算出的类型.
  • jdbcType:该列的JDBC类型(INTEGER, DECIMAL, NUMERIC, VARCHAR等等). 若是须要,这能够覆盖由JavaTypeResolver计算出的类型.
  • typeHandler:用户定义的须要用来处理这列的类型处理器.它必须是一个继承iBATIS的TypeHandler类或TypeHandlerCallback接口(该接口很容易继承)的全限定的类名.若是没有指定或者是空白,iBATIS会用默认的类型处理器来处理类型.重要:MBG不会校验这个类型处理器是否存在或者可用. MGB只是简单的将这个值插入到生成的SQL映射的配置文件中.
  • delimitedColumnName:指定是否应在生成的SQL的列名称上增长分隔符. 若是列的名称中包含空格,MGB会自动添加分隔符, 因此这个重写只有当列名须要强制为一个合适的名字或者列名是数据库中的保留字时是必要的.

3.9.4 ignoreColumn子节点

该元素可选,能够配置多个. 该元素能够用来屏蔽不须要生成的列.

该元素有一个必选属性:

  • column:要忽略的列名.

该元素还有一个可选属性:

  • delimitedColumnName:匹配列名的时候是否区分大小写.若是为true则区分.默认值为false,不区分大小写.