properties
首先所有的元素都在generatorConfiguration中,下面就首先来看一下generatorConfiguration的子元素。
<properties url="file:///F:/archive/fun/generator/generatorConfig.properties"/>
<properties resource="generatorConfig.properties"/>
可以用于加载配置项或者配置文件,在整个配置文件中就可以使用${propertyKey}的方式来引用配置项。resource和url各个中随便选一个,并且只能选择一个。 resource:使用resource,MBG从classpath开始找,比如: generatorConfig.properties
url:使用URL的方式,比如: file:///F:/generate/generatorConfig.properties http://localhost/generate/generatorConfig.properties
注意:properties元素最好放在第一个,否则可能会出一下莫名其妙的错误。最好使用url配置绝对路径,直接通过命令行使用resource的时候classpath不好指定。在generatorConfiguration中最多只能有一个properties。 当然也可以变通一下运行类把包当做库,通过java -cp 而不是java -jar来,例如:
java -cp .;mybatis-generator-core-1.3.2.jar org.mybati
s.generator.api.ShellRunner -configfile mybatis.xml -overwrite
其中.(;(分号)表示分割符,分割不同的classpath目录)表示的是把当前目录(运行命令的目录)添加到classpath中。
classPathEntry
<classPathEntry location="mysql-connector-java-5.1.21.jar" />
classPathEntry使用来指定数据库驱动包的配置,可以使用相对路径也可以使用绝对路径。在generatorConfiguration中可以有0到多个classPathEntry。
context元素
在generatorConfiguration中至少有1个context元素,context元素非常重要,它指定连接哪一个数据库,包括url,数据库名,用户名,密码,怎样生成表,怎样生成mapper配置文件,怎样生成mapper接口,怎样生成bean等。下面就来看一下context的元素。
<context
id="DB2Tables"
targetRuntime="MyBatis3"
defaultModelType="conditional"
>
context的属性有4个,其中id是必须的。 id:id主要用来表示context的因为context可以有多个嘛。
targetRuntime:targetRuntime主要是用来控制怎样生成Mapper接口,mapper配置文件,java的bean的属性。有4个可选项,分别是MyBatis3、MyBatis3Simple、Ibatis2Java2、Ibatis2Java5,默认的是使用的MyBatis3。这里主要介绍一下MyBatis3、MyBatis3Simple因为这2个是兼容mybatis3以上的版本,其他2个是兼容ibatis2.2以上的版本。 MyBatis3、MyBatis3Simple倒是支持mybatis3以上版本,Java1.5以上的版本,支持泛型,支持注解。MyBatis3和MyBatis3Simple的区别主要是:MyBatis3Simple生成的主要是简单的CRUD,而MyBatis3生成的是复杂一些的动态where语句。
defaultModelType:context的defaultModelType属性是用来指定怎样把表对应生成bean,defaultModelType扩展之org.mybatis.generator.api.IntrospectedTable。可选项有: flat、conditional、hierarchical,默认是conditional。 flat模式是为一张表生成一个bean, hierarchical模式是为主键生成一个bean,BLOB类型的列生成一个bean,剩下的列生成一个bean,BLOB生成的bean和剩下列生成的bean是继承之主键生成的bean。 conditional模式和hierarchical模式一样,区别是conditional模式会把只有一个field bean合并到父类中。
introspectedColumnImpl:introspectedColumnImpl属性是用来修改生成代码时计算列信息的方式,扩展之org.mybatis.generator.api.IntrospectedColumn类。这个基本很少用到,主要是持有表列的元数据(metadata)
context元素的子元素
property(0..N) plugin(0..N) commentGenerator(0..1) connectionFactory和jdbcConnection(2选1必须有1个) javaTypeResolver(0..1) javaModelGenerator(1) sqlMapGenerator(0..1) javaClientGenerator(0..1) table(1..N)
connectionFactory 与 jdbcConnection
connectionFactory与jdbcConnection必须2选1,主要是用来配置数据库连接的。 jdbcConnection:
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/practice"
userId="tim"
password="123456">
</jdbcConnection>
connectionFactory:
<connectionFactory>
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="connectionURL" value="jdbc:mysql://127.0.0.1:3306/practice"/>
<property name="userId" value="tim"/>
<property name="password" value="123456"/>
</connectionFactory>
javaModelGenerator
javaModelGenerator主要用来控制怎样生成bean(model)的元素。 javaModelGenerator元素只有两个属性,都是必填的 targetPackage:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响 targetProject:指定目标项目路径,可以使用相对路径或者绝对路径。
javaModelGenerator元素property子元素:
constructorBased:该属性只对MyBatis3有效,如果true就会使用构造方法入参,如果false就会使用setter方式。默认为false。
enableSubPackages:如果true,MBG会根据catalog和schema来生成子包。如果false就会直接用targetPackage属性。默认为false。
immutable:该属性用来配置实体类属性是否可变,如果设置为true,那么 constructorBased不管设置成什么,都会使用构造方法入参,并且不会生成setter方法。如果为false,实体类属性就可以改变。默认为false。
rootClass:设置所有实体类的基类。如果设置,需要使用类的全限定名称。并且如果MBG能够加载rootClass,那么MBG不会覆盖和父类中完全匹配的属性。匹配规则: 属性名完全相同 属性类型相同 属性有getter方法 属性有setter方法
trimStrings:是否对数据库查询结果进行trim操作,如果设置为true就会生成下面模式的 setter:
public void setUsername(String username) {
this.username = username == null ? null : username.trim();
}
<javaModelGenerator targetPackage="cn.freemethod.dao.model" targetProject="src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="false" />
<property name="constructorBased" value="false" />
<property name="immutable" value="false" />
<!-- <property name="rootClass" value="cn.freemethod.dao.model.Base" /> -->
</javaModelGenerator>
sqlMapGenerator
sqlMapGenerator是用来控制生成sqlMapper的元素,最多配置一个。 但是如果targetRuntime配置为iBATIS2,该元素必须配置一个。 如果targetRuntime配置为MyBatis3并且javaClientGenerator需要XML时,必须配置一个。 sqlMapGenerator元素有两个必填属性:
targetPackage:生成实体类存放的包名,一般就是放在该包下 targetProject:指定目标项目路径,可以使用相对路径或者绝对路径
sqlMapGenerator元素支持一个property子元素: enableSubPackages:如果true,MBG会根据catalog和schema来生成子包。如果false就会直接用targetPackage属性。默认为false。
<sqlMapGenerator targetPackage="mapper" targetProject="src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
javaClientGenerator
javaClientGenerator是用来控制生成Mapper接口的元素,javaClientGenerator元素是可选,最多配置一个。如果不配置该元素,就不会生成Mapper接口。
javaClientGenerator元素有3个必选属性:
type:指定Mapper接口生成器,用户可以自定义实现,指定的type必须要继承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:可以使用相对路径或者绝对路径。
javaClientGenerator元素还有一个可选属性: implementationPackage:如果指定了该属性,实现类就会生成在这个包中
javaClientGenerator元素支持property子元素设置的属性:
enableSubPackages:如果true,MBG会根据catalog和schema来生成子包。如果false就会直接用targetPackage属性。默认为false。 exampleMethodVisibility:指定生成的Example方法的可见性,默认public methodNameCalculator:设置计算方法名的类必须实现org.mybatis.generator.api.DAOMethodNameCalculator接口,在 MyBatis3配置中被忽略。 useLegacyBuilder:客户端是否使用SqlBuilder,默认false rootInterface:用于指定一个所有生成的接口都继承的父接口,这个值可以通过table配置的rootInterface属性覆盖。这个属性对于通用Mapper来说,可以让生成的所有接口都继承该接口。
<javaClientGenerator type="XMLMAPPER" targetPackage="cn.freemethod.dao" targetProject="src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
table
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会自动根据表名来生成名称 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: selectByExampleQueryId: modelType:和context的defaultModelType含义一样,这里可以针对表进行配置,这里的配置会覆盖context的defaultModelType配置。 escapeWildcards:这个属性表示当查询列,是否对schema和表名中的SQL通配符 ('_' and '%') 进行转义。 对于某些驱动当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接口如果配置了sqlMapGenerator,并且modelOnly为true,那么XML映射文件中只有实体对象的映射元素。如果为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。
table还可以包含包含以下子元素:
generatedKey>(0个或1个) columnRenamingRule(0个或1个) columnOverride(0个或多个) ignoreColumn(0个或多个)
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来生成代码。 这是一个独立于数据库获取标识列中的值的方法。 重要:只有当目标运行为MyBatis3时才会产生正确的代码。 如果与iBATIS2一起使用目标运行时会产生运行时错误的代码。
这个元素还包含两个可选属性:
identity:当设置为true时,该列会被标记为identity列, 并且<selectKey>元素会被插入在insert后面。 当设置为false时,<selectKey>会插入到insert之前(通常是序列)。重要: 即使您type属性指定为post,您仍然需要为identity列将该参数设置为true。 这将标志MBG从插入列表中删除该列。默认值是false。 type:type=post and identity=true的时候生成的<selectKey>中的order=AFTER,当type=pre的时候,identity只能为false,生成的<selectKey>中的order=BEFORE。可以这么理解,自动增长的列只有插入到数据库后才能得到ID,所以是AFTER,使用序列时,只有先获取序列之后,才能插入数据库,所以是BEFORE。
commentGenerator
<commentGenerator >
<property name="suppressAllComments" value="false"/><!-- 是否取消注释 -->
<property name="suppressDate" value="true" /> <!-- 是否生成注释代时间戳-->
</commentGenerator>
有一个type属性可以指定实现类,指定的type必须实现接口 org.mybatis.generator.api.CommentGenerator,还可以通过dateFormat指定生成日期的格式,使用的是java.text.SimpleDateFormat类。
javaTypeResolver
<!-- 类型转换 -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
有一个type属性可以指定实现类,指定的type必须实现接口 org.mybatis.generator.api.JavaTypeResolver。 javaTypeResolver只有一个property就是forceBigDecimals。forceBigDecimals主要是针对表的decimal和numeric这2个定点数类型的时候,如果forceBigDecimals为true,则只要列的类型是decimal或者numeric就使用BigDecimal类。
如果是false就根据decimal或者numeric的precision和scale决定: 这里就发现咬文嚼字有时候还是有必要的,我们以MySQL为例来看一看: 在MySQL中numeric是继承了decimal的,所以来看decimal就可以了,假设定义一个字段: salary DECIMAL(5,2)根据MySQL的定义其中salary的precision就为5,scale就为2。可以参考MySQL的官方文档12.2.2章节。这里总结一下precision的意思就是字段的长度,scale就是小数点的位数。所以salary的取值范围是-999.99到999.99
接着看当javaTypeResolver只有一个property就是forceBigDecimals的值为FALSE的时候 decimal和numeric是怎样转换的: scale>0 || precision > 18 使用 java.math.BigDecimal scale=0 && precision >= 10 && precision <= 18 使用 java.lang.Long scale=0 && precision >= 5 && precision <= 9 使用 java.lang.Integer scale=0 && precision < 5 使用 java.lang.Short
context元素的属性
autoDelimitKeywords beginningDelimiter endingDelimiter javaFileEncoding javaFormatter xmlFormatter
autoDelimitKeywords:当表名或者字段名为SQL关键字的时候,可以设置该属性为true,MBG会自动给表名或字段名添加分隔符,默认的分隔符为"。 因为MySQL的分隔符是反引号,所以就需要beginningDelimiter和endingDelimiter来兼容不同的数据库了。 所以如果MySQL的表名或者字段名使用了关键字就可以做如下的配置:
<property name="autoDelimitKeywords" value="true"/>
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
感觉是不是很有用,如果你真的已经用到了上面的配置了,就应该和设计数据的同学好好交流学习一下了。重点是问一句:设计的什么玩意儿?
javaFileEncoding:设置要使用的Java文件的编码,默认使用当前平台的编码,只有当生产的编码需要特殊指定时才需要使用,一般用不到。
javaFormatter:指定格式化Java代码的类 xmlFormatter:指定格式化mapper配置文件的类
参考
项目源码 编译好的工程 mybatis-generator扩展 context元素 javaTypeResolver commentGenerator javaModelGenerator sqlMapGenerator javaClientGenerator table context
附录 配置实例
附录一个配置实例,通过简单的修改数据库的配置的table配置就可以使用的简单配置
<?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 url="file:///F:/archive/fun/generator/generatorConfig.properties"/> -->
<!-- <properties resource="generatorConfig.properties"/> -->
<!-- 驱动程序位置,使用相对路径和mybatis-generator在同一个jar包下 -->
<classPathEntry location="mysql-connector-java-5.1.21.jar" />
<!-- defaultModelType="flat" 一张表对应一个类 -->
<context
id="DB2Tables"
targetRuntime="MyBatis3"
defaultModelType="conditional"
>
<!-- 数据库连接配置,url,port,数据库,用户名密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/practice"
userId="user_name"
password="password">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- bean -->
<javaModelGenerator targetPackage="cn.freemethod.dao.model" targetProject="src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="false" />
</javaModelGenerator>
<!-- mapper -->
<sqlMapGenerator targetPackage="mapper" targetProject="src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- dao XMLMAPPER使用xml文件配置 ANNOTATEDMAPPER使用annotation方式 MIXEDMAPPER 动态sql使用xml,其它使用annotation方式-->
<javaClientGenerator type="XMLMAPPER" targetPackage="cn.freemethod.dao" targetProject="src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="cn.freemethod.dao" targetProject="src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
-->
<!--生成对应表及类名-->
<!--
<table schema="mybatis" tableName="user" domainObjectName="User" >
<property name="useActualColumnNames" value="true"/>
<generatedKey column="ID" sqlStatement="DB2" identity="true" />
<columnOverride column="DATE_FIELD" property="startDate" />
<ignoreColumn column="FRED" />
<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
</table>
-->
<table
schema="db_name"
tableName="user"
domainObjectName="User"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false" >
</table>
<!-- <table
schema="practice"
tableName="user_auth"
domainObjectName="UserAuth"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false">
</table>
-->
</context>
</generatorConfiguration>