您现在的位置是:首页 > 后台技术 > MyBatisMyBatis

MyBatis代码生成器(第五章)(图文)

第十三双眼睛2020-06-01【MyBatis】人已围观

简介在学习第二章的时候,我们写了很多的单表的增删改查,基本上每个表都有这些方法,而且这些方法都比较类似。当数据库表的字段比较少的时候,写起来还能接受,一旦字段很多时,写起来就比较麻烦。MyBatis团队为我们提供了一个很强大的代码生成器,MyBatisGenerator,后文中会使用缩写MBG来代替。MBG通过丰富的配置可以生成不同类型的代码,代码包含了数据库表对应的实体类,mapper接口类,mapperxml和Example对象,包含了全部的单表操作。

MBG的版本和MyBatis的版本没有直接的关系,MBG可以生成MyBatis和iBATIS的代码
首先引入mybatis-generator-core-1.3.3.jar

XML配置详解
MBG具有丰富的配置可供使用,这些配置需要以XML形式的标签和属性来实现,首先按照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">
这个文件中的http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd用于定义该配置文件中所有标签和属性的用法及限制,在文件头之后,需要写上XML文件的根节点
<generatorConfiguration>
<!-- 具体配置内容 -->
</generatorConfiguration>
上面这两部分是MBG的必备信息,后面是MBG中的自定义配置部分,下面介绍generatorConfiguration标签下的3个子标签,分别是properties,classPathEntry,context,在配置这三个标签的时候,必须注意它们的顺序,要和这里列举的顺序一致,在后面列举其他标签的时候,也必须按照列举的顺序进行配置。

第一个配置的标签是properties标签,这个标签用来指定外部的属性元素,最多可以配置一个,也可以不配置。

properties标签用于指定一个需要在配置中解析使用的外部属性文件,引入属性文件后,可以在配置中使用${property}这种形式的引用,通过这种方式引用属性文件中的属性值,对于后面需要配置的JDBC信息会有用。
properties标签包含resource和url两个属性,只能使用其中一个属性来指定,同时出现怎么会报错。
resource:指定classpath下的属性文件,类似com/myproject/generatorConfig.properties这样的属性值。
url:指定文件系统上的特定位置,例如file://C:myfold/generatorConfig.properties.
第二个是classPathEntry标签,这个标签可以配置多个,也可以不配置
classPathEntry标签最常见的用法是通过属性location指定驱动的路径,代码如下:
<classPathEntry location="E:\mysql\mysql-connector-java-5.1.29.jar"/>

第三个是context标签,这个标签是重点要讲解的,该标签至少配置1个,可以配置多个,context标签用于指定生成一组对象的环境,例如指定要连接的数据库,要生成对象的类型和要处理的数据库中表,运行MBG的时候还可以指定要运行的context
context标签只有一个属性id,用来唯一确定该标签,该id属性可以在运行MGB时使用,此外还有几个可选属性。
defaultModleType:这个属性很重要,定义了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" defaultModelType="flat" targetRuntime="MyBatis3Simple"/>
MBG配置中的其他几个标签基本上都是context的子标签,这些子标签有严格的配置顺序,后面括号中的内容是配置个数,包括以下几个:
<commentGenerator/>
<connectionFactory/>
<javaClientGenerator />
<javaModelGenerator />
<javaTypeResolver/>
<jdbcConnection /></jdbcConnection>
<plugin/>
<property/>
<sqlMapGenerator/>
<table /></table>
property标签
在开始介绍property标签前,先来了解一下数据库中的分隔符
举一个简单的例子,假设有一个表,名为user info,注意这个名字,user和info中间有一个空格,如果直接写如下查询,就会报错
select * from user info
可能会提示user表不存在或者user附近有错误,这种情况下怎么写user info表呢?
这时候就需要用到分隔符,在mysql中用反引号`作为分隔符,例如`user info` ,在sqlserver中则是[user info],通过分隔符可以将其中的内容作为一个整体的字符串进行处理,当SQL中有数据库关键字时,使用反引号括住该关键字,也能避免数据库产生错误
这里之所以先介绍分隔符,就是因为property标签中包含了以下3个和分隔符相关的属性。
<context id="mysql">
    <property name="autoDelimitKeyWords" value="true"/>
    <property name="beginningDelimiter" value="`"/>
    <property name="endingDelimiter" value="`"/>
</context>
除了上面的3个属性以外,还有以下3个属性
javaFilterEncoding
javaFormatter
xmlFormatter
属性javaFilterEncoding设置要使用java文件的编码,例如GBK,UTF-8,默认使用当前运行环境的编码,后面两个formatter相关的属性不常用,不做详细介绍,用到的时候自行百度。
plugin标签
plugin标签可以配置0个或者多个,个数不受限制
该标签用来定义一个插件,用于扩展或修改通过MBG生成的代码,该插件将按在配置中配置的顺序执行。MBG插件的使用情况并不多,如果对开发插件感兴趣,可以参考MBG文档,或者参考下面要介绍的缓存插件的例子。
下面要介绍的缓存插件全限定名称叫做org.mybatis.generator.plugin.CachePlugin.
这个插件可以在生成的SQL XML映射文件中增加一个cache标签。只有当targetRuntime为MyBatis3时,该插件才有效。
该插件接受下列可选属性。
cache_eviction
cache_flushInterval
cache_readOnly
cache_size
cache_type
配置方法如下:
<plugin type="org.mybatis.generator.plugins.CachePlugin">
        <property name="cache_eviction" value="LRU"/>
        <property name="cache_size" value="1024"/>
</plugin>
增加这个配置以后,在生成的Mapper.xml文件中会增加如下的缓存配置.
<cache eviction="LRU" size="1024"></cache> 
这一节主要介绍如何配置插件,和缓存相关的内容会在第七章介绍。
在MBG默认包含的插件中,除了缓存插件外,还有序列化插件,RowBounds插件,ToString插件,关于这些插件的介绍可以自行查阅资料。


commentGenerator
该标签用来配置如何生成注释信息,最多可以配置一个
该标签有一个可选属性type,可以指定用户的实现类,该类需要实现org.mybatis.generator.api.CommentGenerator接口,而且必须有一个默认空的构造方法,type属性接收默认的特殊值DEFAULT,使用默认的实现类org.mybatis.generator.internal.DefaultCommentGererator.

默认的实现类中提供了3个可选属性,需要通过property属性来进行配置。
suppressAllComments:阻止生成注释,默认为false
suppressDate:阻止生成的注释包含时间戳,默认为false.
addRemarkComments:注释是否添加数据库表的备注信息,默认为false.
一般情况下,MBG生成的注释没有任何价值,而且有时间戳的情况下每次生成的注释都不一样,使用版本控制的时候每次都会提交,因此一般情况下会屏蔽注释信息。可以如下配置。
<commentGenerator>
        <property name="suppressDate" value="true"/>
        <property name="addRemarkComments" value="true"/>
 </commentGenerator>
如果对MBG生成的注释不满意或者想实现自己的注释形式,可以实现CommentGenerator,参考MBG中的DefaultCommentGenerator即可。
有了自己的注释生成器以后,可以在配置文件中如下进行配置
<commentGenerator type="com.zyb.MyCommentGenerator">
        <property name="suppressDate" value="true"/>
        <property name="addRemarkComments" value="true"/>
 </commentGenerator>
MBG是通过jdbc的DatabaseMetaData方式来获取数据库表和字段的备注信息的,大多数的JDBC驱动并不支持,常用数据库中mysql支持,sqlserver不支持,oracle特殊配置后可以支持。

jdbcConnection标签
jdbcConnection用于指定MBG要连接的数据库信息,该标签必选,并且只能有一个
配置该标签需要注意,如果JDBC驱动不再classpath下,就要通过classPathEntry标签引入jar包,这里推荐将jar包放入classpath下,或者参考前面classPathEntry配置JDBC驱动的方法
该标签有两个必选属性:
driverClass:访问数据库的JDBC驱动程序的完全限定类名
connectionURL:访问数据库的JDBC连接的URL
该标签还有两个可选属性
userId:访问数据库的用户id
passwrod:访问数据库的密码
此外,该标签还有多个property子标签,这里配置的property属性都会添加到JDBC驱动的属性中(使用property标签的name属性反射赋值)
这个标签配置起来非常容易,基本配置如下:
<jdbcConnection driverClass="" ,
connectionURL=""
userId="" password="">    
</jdbcConnection>
在上一节中说到过,oracle通过特殊配置可以支持,配置方式如下:
<jdbcConnection driverClass="" ,connectionURL="" userId="" password="">
        <property name="remarksReposting" value="true"/>
</jdbcConnection>
这种方式就是通过property标签配置了oracle的remarksReport属性,使得JDBC可以获得注释信息。
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类型
javaTypeResover标签配置如下:
<javaTypeResolver>
        <property name="forceBigDecimals" value="false"/>
</javaTypeResolver>

javaModelGenerator
该标签用来控制生成的实体类,根据context标签中配置的defaultModelType属性值的不同,一个表可能会对应生成多个不同的实体类,一个表对应多个类时使用不方便,所以前面推荐使用flat,保证一个表对应一个实体类。该标签必须配置一个,并且最多配置一个。
该标签只有两个必选属性。
targetPackage:生成实体类存放的包名,一般就是存放在该包下,实际还会收到其他配置的影响。
targetProject:指定目标项目路径,可以使用相对路径或者绝对路径
该标签还支持以下几个property子标签属性
constructorBased:该属性只对MyBatis3有效,如果为true就会使用构造方法入参,如果为false就会使用setter方式,默认为false.
enableSubPackages:如果为true,MBG会根据catalog和scheme来生成子包,如果为false就会直接使用targetPackage属性,默认为false.
immutable:用来配置实体类属性是否可变,如果设置为true,那么constructorBased不管设置成什么,都会使用构造方法入参,并且不会生成setter方法,如果为false,实体类属性就可以改变,默认为flase.
rootClass:设置所有实体类的基类,如果设置,则需要使用类的全限定名称,并且如果MBG能够加载rootClass,那么MBG不会覆盖和父类中完全匹配的属性,匹配规则如下:
属性名完全相同
属性类型相同
属性有getter方法
属性有setter方法
trimStrings:判断是否对数据库查询结果进行trim操作,默认值为false,如果设置为true就会生成如下代码:
public void setUserEmail(String userEmail) {
        this.userEmail = userEmail ==null ? null :userEmail.trim();
}
javaModelGenerator配置实例如下:
<javaModelGenerator targetPackage="" targetProject="">
        <property name="enableSubPackages" value="false"/>
        <property name="trimsStrings" value="false"/>
</javaModelGenerator>

javaClientGenerator标签
该标签用于配置java客户端生成器的属性,该标签可选,最多可配置一个,如果不配置该标签,就不会生成mapper接口
该标签有以下3个必选属性
1type:用于选择客户端代码生成器,用户可以自定义实现,需要继承org.mybatis.generator.codegen.AbstractJavaClientGenerator类,必须有一个默认的空的构造方法,该属性提供了以下预设的代码生成器,首先根据context的targetRuntime分成两类,
mybatis3:
ANNOTATEDMAPPER:基于注解的mapper,不会有对应的xml文件
MIXEDMAPPER:xml和注解的混合形式,上面这种情况中的SQL Provider注解方法会被xml方式取代。
XMLMAPPER:所有的方法都在xml中,接口调用依赖xml文件
mybatis3Simple:
ANNOTATEDMAPPER:基于注解的mapper接口,不会有对应的xml映射文件
XMLMAPPER:所有的方法都在XML接口调用依赖XML文件
2targetPackage:生成mapper接口的存放的包名,一般就是放在该包下,实际还会收到其他配置的影响
3targetProject:指定目标路径,可以使用相对路径或绝对路径
该标签还有一个可选属性implementationPackage,如果指定了该属性,mapper接口的实现类就会生成在这个属性指定的包中。该标签还支持几个property属性,由于这些属性不常用,因此不做介绍。
javaClientGenerator标签中的属性非常重要,此处提供一些选择性的建议。
XMLMAPPER:推荐使用,将接口和XML完全分离,容易维护,接口中不出现SQL语句,只在XML中配置SQL.修改SQL时不需要重新编译。
ANNOTATEDMAPPER:不推荐使用,纯注解的方式的好处是,SQL和方法在一起,看着方便,但是实际上维护不容易。
MIXEDMAPPER:不推荐使用,这种情况下注解和XML混合使用会很乱,不利于维护
javaClientGenerator标签配置如下:
<javaClientGenerator type="XMLMAPPER" targetPackage="mybatis.dao" 
 targetProject="src/main/java"/>

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:生成对象的基本名称,如果没有指定,MGB会自动根据表名来生成名称
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,可选属性如下:
constructedBased:和javaModelGenerator中的属性和含义一样
ignoreQualifiersAtRuntime:生成的SQL中的表名将不会包含schema和catalog前缀
immutable:和javaModelGenerator中的属性含义一样
modelOnly:用于配置是否只生成实体类。如果设置为true,就不会有Mapper接口,同时还会覆盖属性中的enableXXX方法,并且不会生成任何CRUD方法,如果配置了sqlMapGenerator,并且modelOnly为true,那么XML映射文件中只有实体对象的映射标签。
rootClass:和javaModelGenerator中的属性含义一样
rootInterface:和javaModelGenerator中的属性含义一样
runTimeCatalog:运行时的catalog,当生成表和运行环境表的catalog不一样时,可以使用该属性进行配置
runTimeSchema:运行时的schema,当生成表和运行环境表的schema不一样时,可以使用该属性进行配置
runTimeTableName:运行时的tableName,当生成表和运行环境的tableName不一样时,可以使用该属性进行配置。
selectAllOrderByClause:该属性值会追加到selectAll方法的后面的SQL中,直接与order by拼接后追加到SQL末尾。
useActuallColumnNames:如果设置为true,那么MBG会使用从数据库元数据获取的列名作为生成的实体对象的属性。如果设置为false,MBG将会尝试将返回的名称转为驼峰形式,在这两种情况下,可以通过columnOverride标签显式指定,此时将忽略该属性。
useColumnIndexes:如果为true,MBG生成resultMaps时会使用列的索引,而不是结果中列名的顺序。
useCompoundPropertyNames:如果为true,MBG生成属性名的时候会将列名和列备注连接起来。这对于那么通过第四代语言自动生成列但是备注包含有用信息的数据库来说很有用。
出了property子标签外,table还包含以下子标签
generatedKey0个或者1个
columnRenamingRule:0个或者1个
columnOverride0个或者多个
ignoreColumn:0个或者多个。

generatedKey标签
该标签用来指定自动生成的主键的属性,如果指定这个标签,MBG将在生成insert的SQL映射文件中插入一个selectKey标签,这个标签非常重要,而且只能配置一个。
该标签包含两个必选属性
column:生成列的列名
sqlStatement:返回新值的SQL语句,如果这是一个identity列,则可以使用其中一个于定义的特殊值,预定义值如下:
Cloudscape:
DB2
DB2_MF
Derby
HSQLDB
Informix
MySql
SQL Server
SYABASE
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,使用序列时,必选先得到值,才能插入数据库。
table示例1(针对mysql  sql server等自增类型的主键)
<table tableName="user login info" domainObjectName="UserLoginInfo">
        <generatedKey column="id" sqlStatement="MySql"/>
</table>
该配置生成的Insert如下,
<insert id="insert" parameterType="test.model.UserLoginInfo">
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
        select last_insert_id() 
    </selectKey>
    insert into `user login info` (id,username,email) values (#{id},#{userName},#{email})
</insert>
  
配置示例2
<table tableName="user login info" domainObjectName="UserLoginInfo">
        <generatedKey column="id" sqlStatement="select sql_id.nextval from dual"/>
 </table>
该标签生成的对应的insert方法如下:
<insert id="insert" parameterType="test.model.UserLoginInfo">
    <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
        select sql_id.nextval from dual
    </selectKey>
    insert into `user login info` (id,username,email) values (#{id},#{userName},#{email})
</insert>
 

columnRenamingRule标签
该标签最多可以配置一个,使用该标签可以在生成列之前对列进行重命名,这对于那些由于存在同一前缀得字段因此想生成属性名时去除前缀得表非常有用。假设一个表包含以下列,
CUST_BUSINESS_NAME
CUST_STREET_ADDRESS
CUST_CITY
CUST_STATE
生成得所有属性名中如果都包含CUST前缀可能会让人觉得不舒服,这些前缀可以通过如下方法定义命名规则。
<columnRenamingRule searchString="^CUST_" replaceString="" />
注意MBG内部使用java.util.regex.Matcher.replaceAll方法实现这个功能。columnOverride优于重命名得规则。
当columnOverride匹配一列时,columnRenamingRule标签会被忽略,
该标签有一个必选得属性,seacheString,用于定义将要被替换得字符串得正则表达式。该标签有一个可选得属性replaceString,用于替换搜索字符串列每一个匹配项得字符串,如果没有指定,则使用空字符串。
columnOverride标签
该标签用于将某些默认计算得属性值更改为指定得值,标签可选,可以配置多个。
该标签有一个可选得属性column,具体如下:
property:要使用得java属性得名称,如果没有指定,MBG会根据列名生成,例如一个表得一列名为STRT_CODE,MBG会根据table得useActualColumnNames属性生成STRT_DTE或者strt_Dte.
javaType:列得属性完全限定的java类型,如果需要可以覆盖由javaTypeResover计算出的列类型。
jdbcType:列的jdbc类型,如果需要可以覆盖由javaTypeResolver计算出的类型
typeHandler:根据用户定义的需要来处理列的类型处理器,必须是一个继承字TypeHandler接口的全限定的类名,如果没有指定或者是空白,mybatis会默认的类型处理类型,切记,MBG不会校验这个类型是否存在或可用,MBG只是简单的将值插入到已生成的SQL映射的配置文件中。
delimitedColumnName:指定是否应在生成的列名称上增加分隔符,如果列的名称中包含空格,MGB会自动添加分隔符,所以只有当列名需要被强制为一个合适的名字或者列名是数据库中的保留字时,才是必要的。
columnOverride的配置如下:
<columnOverride column="LONG_VARCHAR_FIELD" javaType="java.lang.String"  jdbcType="VARCHAR"/>
ignoreColumn标签
该标签可以用来屏蔽不需要生成的列,该标签可选,可以配置多个。该标签有一个必须属性column标识要忽略的列名。
该标签还有一个可选的属性delimitedColumnName,标识匹配列名的时候是否区分大小写,如果为true则区分,默认值为false,表示不区分大小写。

一个配置参考示例
为了方便学习,此处针对前面讲过的项目创建一个MBG的配置供大家参考。
在项目的src/main/resources中创建一个generator目录,在该目录下创建一个generatorConfig.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>
    <context id="MySqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
    
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" 
                        connectionURL="jdbc:mysql://localhost:3306/mybatis"
                        userId="root"
                        password="123456">
        </jdbcConnection>
        
        <javaModelGenerator targetPackage="test.model" targetProject="src/main/java">
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        
        <sqlMapGenerator targetPackage="text.xml" targetProject="src/main/resourses"/>
            
        <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" 
                             targetProject="src/main/java"/>
        <table tableName="%">
            <generatedKey column="id" sqlStatement="MySql"/>
        </table>
    </context>
</generatorConfiguration>
有关该配置有以下几点重要说明:
1context属性targetRuntime设置为MyBatis3Simple,主要时为了避免生成与Example相关的代码和方法,如果需要Example相关的代码,也可以设置为MyBatis3
2context属性defaultModelType设置为flat,目的是使每个 表只生成一个实体类,当没有复杂的类继承时,使用起来方便。
3因为此处使用的数据库为MySql,所以前后分隔符都设置成"`"
4注释生成器commentGenerator中配置了生成数据库的注释信息,并且禁止在注释中生成日期。
5jdbcConnection简单地配置了要连接的数据源信息
6javaModelGenerator配置生成的包名为test.model.这个包名可以根据自己的代码进行修改,targetProject设置在src/main/java中
7sqlMapGenerator配置生成mapper.xml文件的位置,这里的targetProject设置为src/main/resources,没有放在src/main/java中
8javaClientGenerator配置生成mapper接口的位置,这里采用XMLMAPPER类型,接口和XML完全分离。
9最后的table使用通配符"%"匹配数据库中所有的表,所有表都有主键自增的id字段,sqlStatement针对当前数据库配置为MySql.
在项目中可以根据需要修改以上配置

运行MyBatis Generator
MBG提供了很多种运行方式,常用的有以下几种:
1使用java编写代码运行
2从命令提示符运行
3使用maven plugin运行
4使用eclipse插件运行
这几种方式都有各自的优点和缺点,接下来进行详细介绍.

使用java编写代码运行
在写代码前,需要将MBG的jar包添加到项目中,第一种方式是下载好有放入项目中,第二种是用maven依赖的方式引入。
在项目中添加tk.mybatis.generator包,创建Generator.java类。
import org.mybatis.generator.internal.DefaultShellCallback;

public class Generator {

    public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean override = true;
        InputStream is = Generator.class.getResourceAsStream("generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(is);
        is.close();
        
        DefaultShellCallback  callback = new DefaultShellCallback(override);
        
        MyBatisGenerator generator = new MyBatisGenerator(config, callback, warnings);
        
        generator.generate(null);
        for(String warning:warnings){
            System.out.println(warning);
        }       
    }
}
使用Java代码方式运行的好处是,generatorConfig.xml配置的一些特殊的类,只要在当前项目中,就可以直接使用,使用其他方式时,需要特殊配置才能在MGB执行过程中找到类并实例化,否则都会因为找不到这个类而抛出异常.使用java编码的不方便之处在于,他和当前项目是绑定在一起的,在maven多子模块的情况下,可能需要增加编写代码量和配置量,管理不方便,但是综合来说,这种方式出现的问题少,最容易配置,因此推荐使用.

从命令提示符运行
从命令提示符运行就必须使用jar包,按照之前提供的下载好的MBG的压缩包,解压后,从lib目录中找到mybatis-generator-core-1.3.3.jar文件。
将这个jar文件和generatorConfig.xml文件放到一起。从这里就可以体会到为什么这种配置方式不方便了。因为需要修改generatorConfig.xml文件。
将Mysql的驱动放到当前目录中,然后再配置文件中添加classPathEntry,代码如下:

除此之外,在当前目录中添加src文件夹,在src中再添加main文件夹,main文件夹中再添加java和resources文件夹,此时,当前目录的结构如下:
下面介绍一下MBG运行时可以接收的几个参数。
-configfile fileName:指定配置文件的名称
-overwrite(可选):指定了该参数后,如果生成的java文件已经存在同名的文件,新生成的文件则会覆盖原有的文件。没有指定该参数的情况下,如果存在同名的文件,MBG会为新生成的代码文件指定一个唯一的名字,如Student.java.1
-verbose(可选)指定该参数,执行过程会输出到控制台.
-forceJavaLogging(可选):指定该参数,MBG会将使用java日志记录而不使用log4j,即使log4j在运行路径中。
-contexdids context1,context2(可选)指定该参数,逗号隔开的这些context会被执行,这些指定的context必须和配置文件中context标签的id属性一致,只有指定的contextid会被激活执行,如果没有指定该参数,所有的context都会被激活执行。
-tables table1,table2(可选)指定该参数,逗号隔开的这些表会被运行,这些表名必须和table配置中的一致,只有被指定的表会被执行。如果没有指定该参数,所有的表都会被执行。
出了上面几个MBG参数外,还要简单介绍一下java命令的参数
-jar XXX.jar:执行jar包时的基本参数
-Dfile.encoding=XXX,一般命令行的环境都是GBK编码,如果要生成UTF-8编码的代码,则要在java命令上指定该参数,通过cp命令可以将其他jar包添加到当前的classpath环境中,使用-cp时不能使用-jar.
知道最基本的命令后,先用最简单的命令执行一下MBG看一下结果。在当前目录中打开命令行,输出以下命令:
java -jar mybatis-generator-core-1.3.3.jar -configfile generatorConfig.xml
执行这个命令后,可以在src/main/java下面的对应目录中看到生成的代码,如果查看这个文件的编码,会发现都是GBK编码,现在很多项目,尤其是使用maven的项目,基本都是UTF-8编码,想要生成UTF-8的项目,可以输入以下命令。
java -Dfile.encoding=UTF-8 -jar mybatis-generator-core-1.3.3,jar -configfile generatorConfig.xml -overwrite
因为前一次已经生成了代码,因此加上了overwrite
再次查看编码,会发现编码已经编程UTF-8了。
可以看到,命令行方式的特点是完全独立于项目,针对不同的项目配置不同的generatorConfig.xml文件,在对MBG的定制很少的时候,这种方式使用起来也比较方便,但是需要定制一些自己的实现时,这种方式就会变得麻烦起来,假设要使用自己实现的MyCommentGenerator类,需要按照如下步骤进行。
1将包含MyCommentGenerator类的项目打包成jar
2将该jar包放到当前目录中
3需要使用-cp参数代替-jar,将依赖的jar都依赖进来。
修改命令如下:
java -Dfile.encoding=UTF-8 -cp my-comment-generator-jar;mybatis-generator-core-1.3.3.jar org.mybatis.generator.api.ShellRunner - configfile generatorConfig.xml -overwrite
需要注意,-cp后面有多个jar包时,在windows系统中要以英文分号分隔,在linux系统中要使用英文冒号隔开,jar包最后面要指定要执行的主体类。
这种方式写起来虽然麻烦,但是可以在系统中创建.bat批处理文件,在当前目录下创建一个run.bat文件,在run.bat文件中输入上面的命令保存,在以后需要用的时候,直接双击即可.

使用maven plugin运行
使用maven插件方式和第一种java编码方式类似,都是和项目绑定在一起的,当需要引用其他类时,需要给maven插件添加依赖,否则会找不到类.
在pom.xml中添加如下配置
<plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.3</version>
            <configuration>
                <configurationFile>
                    ${basedir}/src/main/resources/generator/generatorConfig.xml
                </configurationFile>
                <overwrite>true</overwrite>
                <verbose>true</verbose>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.38</version>
                </dependency>
                <dependency>
                    <groupId>tk.mybatis</groupId>
                    <artifactId>simple</artifactId>
                    <version>0.0.1-snapshot</version>
                </dependency>
            </dependencies>
        </plugin>
configuration标签中的配置类似于命令行中的参数,通过配置名称即可理解。
这个配置中特殊的地方在于插件中的dependencies配置,在generatorConfig.xml配置文件中,没有通过classPathEntry方式配置jdbc驱动,这里通过添加依赖将驱动添加到MBG的classpath中,另外还添加了当前项目的依赖,这样一来,若在当前项目中定制了MBG的某个实现,配置后可以直接找到,需要特别注意的是,当前项目必须执行过mvn install,否则会找不到当前项目的依赖。

在配置好插件之后,可以执行如下maven命令
mvn -mybatis-generator:generate
如果用eclipse中执行命令时,可以在pom.xml文件上单击鼠标右键,选择run as中的maven build选项,将name改为simple-mbg,然后再goals中输入mybatis-generator:generate,可以选择skip test,最后点击run执行即可。

使用eclipse插件运行
MBG针对eclipse提供了相应得插件,可以更好得生成代码。eclipse插件得最大好处就是,这是MBG中唯一一种支持代码合并得运行方式,在前面得几种运行方式中,生成得代码注释中都有一个@mbggenerated标记,这个标记得含义是,被标记的字段或方法是自动生成的,重新生成时会被覆盖,没有这个标记的代码不是自动生成的,不应该被覆盖,但是前面三种方式在生成代码的时候,这个标记没有任何作用,不管有没有这个标记都会被覆盖,即自己在生成后的代码中添加任何内容都会被覆盖。这就导致增加字段或方法后,若需要重新生成,就必须自己比对文件把加入的代码恢复,使用起来很不方便。MBG的eclipse插件支持这个标记,因此该插件有很大优势。

在MBG的发布页面中下载插件,此处使用如下版本。
mybatis-generator-eclipse-site-1.3.3.201606241937.zip
下载后,在eclipse中选择菜单help中的install new software,打开如下窗口。
点击add按钮,在弹出的窗口中选择archive,选择下载完成的MBG插件,输入name mbg后,点击OK.
在下拉列表中选择全部的mybatis generator,点击next,一步步完成安装。安装完成后重启eclipse.
打开之前在src/main/resources下面创建generator/generatorConfig.xml文件,对这个文件做一些简单修改。
eclipse插件的运行方式有点特殊,jdbc驱动需要通过classPathEntry进行配置,其他定制的类只要在当前项目或者当前项目的classpath中即可使用。
在配置文件中增加classPathEntry配置,指定mysql驱动的位置,然后再context中添加一个javaFileEncoding的property标签配置,指定生成代码的编码方式为UTF-8,修改的部分配置如下:

除此之外,在和targetProject有关的相对路径中需要增加当前项目的项目名称,将src/main/java改为simple/src/main/java,将src/main/resources改为simple/src/main/resources.
完成上述配置后,在配置文件中单击鼠标右键选择如下图所示:

@mbggenerated标记
在默认的注释生成器中,生成的实体类,mapper接口,mapper xml文件中都有这个标记,使用eclipse插件的时候,不要手动删除这些注释中的这个标记,这样当重新生成表的相关代码时,这些代码都会被自动合并。
当需要在自动生成的代码中添加自己的代码时,不要在自己添加的内容中增加@mbggenerated标记,这样就可以保证在重新生成时不会覆盖之前所做的改动,这个优点在给实体类增加字段,给Mapper接口添加方法,给Mapper xml文件添加方法时非常有用,尤其在初期表改动较频繁时特别有用。

example介绍
在MBG的context中将targetRuntime配置为MyBatis3时,MBG会生成和example相关的对象和方法。
新建一个针对country表相关的exampleMBG的配置文件。新增的配置文件generatorConfig-config.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>
    <classPathEntry location="F:/mysql/mysql-connector-java-5.1.38.jar"/>
    
    <context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
        <property name="javaFileEncoding" value="UTF-8"/>
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" 
                        connectionURL="jdbc:mysql://localhost:3306/mybatis"
                        userId="root"
                        password="123456">
        </jdbcConnection>
        <javaModelGenerator targetPackage="tk.mybatis.simple.model" 
                            targetProject="simple/src/main/java">
            <property name="trimStrings" value="true"/>                
        </javaModelGenerator>
        <sqlMapGenerator  targetPackage="tk.mybatis.simple.mapper" 
                         targetProject="simple/src/main/resources"/>
        <javaClientGenerator type="XMLMAPPER" 
                             targetPackage="tk.mybatis.simple.mapper" 
                             targetProject="simple/src/main/java"/>    
        <table tableName="country">
            <generatedKey column="id" sqlStatement="MySql"/>
        </table>                                  
    </context>
</generatorConfiguration>
这个配置是针对eclipse插件进行的,如果使用其他方式,请进行修改,生成代码后,可以发现CountryMapper接口中增加了大量的基础方法,CountryMapper.xml中也增加了相应的SQL.
@Test
    public void testExample(){
        SqlSession sqlSession = getSqlSession();
        try{
            CountryMapper countryMapper = sqlSession.getMapper(CountryMapper.class);
            CountryExample example = new CountryExample();
            example.setOrderByClause("id desc,country_name asc");
            example.setDistinct(True);
            CountryExample.Criteria criteria = example.createCriteria();
            criteria.andIdGreatThanOrEqualTo(1);
            criteria.andIdLessThan(4);
            criteria.addCountryCodeLike("%U%");
            CountryExample.Criteria or = example.or();
            or.addCountryNameEqualTo("中国");
            List<Country> list = countryMapper.selectByExample(example);
        }finally{
            sqlSession.close();
        }
    }
除了selectByExample,与UPDATE相关的有两个方法,分别为updateByExample和updateByExampleSelective,这两个方法的区别是,当对象属性为空的时候,第一个方法会将值更新为null,第二个方法不会更新值为null的字段。
 

Tags:MyBatis   持久层   代码生成器

很赞哦! ()

文章评论

    共有条评论来说两句吧...

    用户名:

    验证码:

本站推荐

站点信息

  • 网站名称:JavaStudy
  • 建站时间:2019-1-14
  • 网站程序:帝国CMS7.5
  • 文章统计242篇文章
  • 标签管理标签云
  • 统计数据百度统计
  • 微信公众号:扫描二维码,关注我们