MyBatis(六)MyBatisGenerator配置
在Mapper XML⽤法中,对于⼤多数单表操作来说,所⽤到的⽅法都很规范且类似。因此,MyBatis提供了代码⽣成器:MyBatis Generator(MBG)。
MBG通过丰富的配置可以⽣成不同类型的代码,代码包含了数据库对应的实体类、Mapper接⼝类、Mapper XML⽂件和Example对象,这些代码⽂件中⼏乎包含了全部的单表操作⽅法,使⽤MBG可以极⼤程度上⽅便我们使⽤MyBatis,还可以减少很多重复操作。
⼀、XML配置详解
1、XML⽂件头
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC
"-////DTD MyBatis Generator Configuration 1.0//EN"
"/dtd/mybatis-generator-config_1_0.dtd">
⽂件头中的mybatis-generator-config_1_0.dtd⽤于定义该配置⽂件中所有标签和属性的⽤法和限制。
2、根节点
<generatorConfiguration>
<!-- 具体配置内容 -->
</generatorConfiguration>
在generatorConfiguration标签下有3个字标签:properties、classPathEntry、context。在配置这3个标签时,顺序必须和这⾥列举的顺序保持⼀致。
3、properties标签
properties标签⽤来指定⼀个需要在配置中解析使⽤的外部属性⽂件,最多配置1个,也可以不配置。引⼊属性⽂件后,可以在配置中使⽤${property}这种形式的引⽤,通过这种⽅式引⽤属性⽂件中的属性值,对于后⾯需要配置的JDBC信息会很有⽤。
properties标签包含resources和url两个属性,只能使⽤其中⼀个属性来指定,同时出现则会报错。
resources:指定classpath下的属性⽂件。
url:指定⽂件系统上的特定位置。
4、classPathEntry标签
classPathEntry标签最常⽤⽤法是通过属性location指定驱动的路径
5、context标签(重点)
context标签⽤于指定⽣成⼀组对象的环境,该标签⾄少配置1个,可以配置多个。
context标签只有⼀个必选属性id,⽤来唯⼀确定该标签,该id可以在运⾏MBG时使⽤。
其余可选属性如下:
defaultModelType:定义了MBG如何⽣成实体类,有以下可选值:
conditional:默认值,和hierarchical类似,如果⼀个表的主键只有⼀个字段,那么不会为该字段⽣成单独的实体类,⽽是会将该字段合并到基本实体类中。
flat:该模型只为每张表⽣成⼀个实体类。这个实体类包含表中的所有字段。
hierarchical:如果表有主键,那么会产⽣⼀个单独的主键实体类,如果该表还有BLOB字段,则会为表⽣成⼀个包含所有BLOB 字段的单独的实体类,然后为所有其他的字段另外⽣成⼀个单独的实体类。MBG会在所有⽣成的实体类之间维护⼀个继承关系。
targetRuntime:此属性⽤于指定⽣成的代码的运⾏时环境,⽀持以下可选值:
MyBatis3:默认值。
MyBatis3Simple:这种情况不会⽣成与Example相关的⽅法。
introspectedColumnImpl:该参数可以指定扩展ator.api.IntrospectedColumn类的实现类。
MBG其他标签基本上都是context的⼦标签,这些⼦标签(配置顺序严格按照列出顺序)包括:
property(0个或多个)
plugin(0个或多个)
commentGenerator(0个或1个)
jdbcConnection(1个)
javaTypeResolver(0个或1个)
javaModelGenerator(1个)
sqlMapGenerator(0个或1个)
javaClientGenerator(0个或1个)
table(1个或多个)
⼆、context⼦标签
1、property标签
该标签包含以下属性:
antoDelimitKeyWords:⾃动给关键字添加分隔符
beginningDelimiter:配置前置分隔符
endingDelimiter:配置后置分隔符
javaFileEncoding:设置要使⽤的Java⽂件的编码
javaFormatter:格式化Java代码
xmlFormatter:格式化xml代码
配置写法如下:
<property name="autoDelimitKeywords" value="true"/>
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<property name="javaFileEncoding" value="UTF-8"/>
<property name="javaFormatter" value="ator.api.dom.DefaultJavaFormatter"/>
<property name="xmlFormatter" value="ator.api.dom.DefaultXmlFormatter"/>
假设有⼀个表名为user info,如果直接查询表名,会提⽰错误。在MySQL中,需要使⽤反单引号"`"作为分隔符才能避免数据库错误。
2、plugin标签
该标签⽤来定义⼀个插件,⽤于扩展或修改MBG⽣成的代码。该插件将按在配置中配置的顺序执⾏,MBG默认插件包含缓存插件、序列化插件、RowBounds插件、ToString插件等。
3、commentGenerator标签
该标签⽤来配置如何⽣成注释信息,有⼀个可选属性type,可以指定⽤户的实现类,该类需要实现
type属性接收默认的特殊值DEFAULT,使⽤默认的实现类or.internal.DefaultCommentGenerator。
默认实现类中有3个可选属性,具体如下:
suppressAllComments:阻⽌⽣成注释,默认为false。
suppressDate:阻⽌⽣成的注释包含时间戳,默认为false。
addRemarkComments:注释是否添加数据库表的备注信息,默认为false。
如果默认控制⽣成的注释不满⾜要求,可以实现CommentGenerator,参考MBG中的DefaultCommentGenerator即可。然后,在type属性中配置⾃定义的注释⽣成类。
4、jdbcConnection标签
该标签⽤于指定MBG要连接的数据库信息。
两个必选属性:
driverClass:访问数据库的JDBC驱动程序的完全限定类名。
connectionURL:访问数据库的JDBC连接URL。
两个可选属性:
userId:访问数据库的⽤户ID。
password:访问数据库的密码。
此外,该标签还可以接受多个property⼦标签,这⾥配置的property标签值都会通过name属性反射赋值到JDBC驱动的属性中。
基本配置如下:
<jdbcConnection driverClass="sql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis"
userId="root"
password="admin">
<!-- 对Oracle数据库,需要配置remarksReporing属性才能使JDBC⽅式获取注释信息 -->
<property name="remarksReporing" value="true"/>
</jdbcConnection>
5、javaTypeResolver标签
该标签⽤来指定JDBC类型和Java类型如何转换,提供了⼀个可选的属性type并提供了默认实现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。
6、javaModelGenerator标签
该标签⽤来控制⽣成的实体类。
只有两个必选属性:
targetPackage:⽣成实体类存放的包名。
targetProject:指定⽬标项⽬路径,可以使⽤相对路径或绝对路径。
⽀持property⼦标签如下:
constructorBased:只对MyBatis3有效,如果为true使⽤构造⽅法⼊参,如果为false使⽤setter⽅式。默认为false。
enabledSubPackages:如果为true,MBG会根据catalog和scheme来⽣成⼦包。如果为false直接使⽤targetPackage属性。默认为false。
immutable:⽤来配置实体类属性是否可变。如果设置为true,那么constructorBased不管设置成什么,都会使⽤构造⽅法⼊参,并且不⽣成setter⽅法。如果为false,实体类属性就可以改变。默认为false。
rootClass:设置所有实体类的基类。如果设置,则需要使⽤类的全限定名称。并且,如果MBG能够加载rootClass,那么MBG不会覆盖和⽗类中完全匹配的属性。匹配规则如下:
属性名完全相同
属性类型相同
属性有getter⽅法
属性有setter⽅法
trimStrings:判断是否对数据库查询结果进⾏trim操作,默认为false。
7、sqlMapGenerator标签
该标签⽤于配置SQL映射⽣成器(l⽂件)的属性。如果targetRuntime设置为MyBatis3,则只有当javaClientGenerator配置需要XML时,该标签才必须配置1个。如果没有配置javaClientGenerator,则使⽤以下规则:
如果指定了⼀个sqlMapGenerator,那么MBG将只⽣成XML的SQL映射⽂件和实体类。
如果没有指定sqlMapGenerator,那么将只⽣成实体类。
两个必选属性:
targetPackage:⽣成SQL映射⽂件(XML⽂件)存放的包名。
targetProject:指定⽬标项⽬路径,可以使⽤相对路径或绝对路径。
⼀个可选属性:
enabledSubPackages:如果为true,MBG会根据catalog和scheme来⽣成⼦包;如果为false(默认),就会直接⽤targetPackage属性。
8、javaClientGenerator标签
该标签⽤于配置Java客户端⽣成器(Mapper接⼝)的属性,可选,最多配置1个。
三个必选属性:
type:⽤于选择客户端代码(Mapper接⼝)⽣成器,提供的预设代码⽣成器可按照targetRuntime分成两类:
MyBatis3
1. ANNOTATEDMAPPER:基于注解的Mapper接⼝,不会有对应的XML映射⽂件。
2. MIXEDMAPPER:XML和注解的混合形式,上⾯这种情况中的SQL Provider注解⽅法会被XML⽅法
替代。
3. XMLMAPPER:所有的⽅法都在XML中,接⼝调⽤依赖XML⽂件。
MyBatis3Simple
1. ANNOTATEDMAPPER:基于注解的Mapper接⼝,不会有对应的XML映射⽂件。
2. XMLMAPPER:所有的⽅法都在XML中,接⼝调⽤依赖XML⽂件。
targetPackage:⽣成Mapper接⼝存放的包名。
targetProject:指定⽬标项⽬路径,可以使⽤相对路径或绝对路径。
⼀个可选属性:
implementationPackage:指定Mapper接⼝实现类⽣成路径。
9、table标签
该标签配置需要通过内省数据数据库的表。
必选属性如下:
tableName:指定要⽣成的表名,可以使⽤SQL通配符匹配多个表,如果要⽣成全部表,可以配置为:<table tableName="%" />。
可选属性如下:
scheme:数据库的scheme,可以使⽤SQL通配符匹配。如果设置了该值,⽣成SQL的表名会变成scheme.tableName的形式。
catalog:数据库的catalog,如果设置了该值,⽣成SQL的表名会变成catalog.tableName的形式。
alias:如果指定,这个值会⽤在⽣成select查询SQL表的别名和列名上。
domainObjectName:⽣成对象的基本名称。如果没有指定,MBG会⾃动根据表名来⽣成名称。
enabledXXX:XXX代表多种SQL⽅法,该属性⽤来指定是否⽣成对应的XXX语句。
selectByPrimaryKeyQueryId / selectByExampleQueryId:DBA跟踪⼯具⽤到。
modelType:和context的defaultModelType含义⼀样,这⾥可以针对表进⾏配置,配置会覆盖context
的defaultModelType配置。
escapeWildcards:表⽰查询列是否对scheme或表名中的SQL通配符(_和%)进⾏转义。
delimitIdentifiers:是否给标识符增加分隔符。默认为false。当catalog、scheme或tableName中包含空⽩时,默认为true。
delimitAllColumns:是否对所有列添加分隔符。默认为false。
table标签包含property⼦标签如下:
constructorBased:和javaModelGenerator中的属性含义⼀样。
modelOnly:⽤于配置是否只⽣成实体类。如果设置为true,就不会有Mapper接⼝,同时还会覆盖属性中的enabledXXX⽅法,并且不会⽣成任何CRUD⽅法。如果设置了sqlMapGenerator,并且modelOnly为true,那么XML映射⽂件中只有实体对象的映射标签(resultMap)。
rootClass:和javaModelGenerator中的属性含义⼀样。
runtimeInterface:和javaClientGenerator中的属性含义⼀样。
runtimeScheme:运⾏时的scheme,当⽣成表和运⾏环境表的scheme不⼀样时,可以使⽤该属性进⾏配置。
runtimeTableName:运⾏时的tableName,当⽣成表和运⾏环境表的tableName不⼀样时,可以使⽤该属性进⾏配置。
selectAllOrderByClause:该属性值会追加到selectAll⽅法后的SQL中,直接与order by拼接后添加到SQL末尾。
useActualColumnNames:如果设置为true,那么MBG会使⽤从数据库元数据获取的列名作为⽣成的实体对象的属性。如果为false(默认),MBG将会尝试将返回的名称转为驼峰形式。可以通过columnOverride标签显⽰指定,此时将会忽略该属性。
userColumnIndexes:如果为true,MBG⽣成resultMap时会使⽤列的索引,⽽不是结果中列名的顺序。
useCompoundPropertyNames:如果为true,MBG⽣成属性名的时候会将列名和列备注连接起来。
除property⼦标签外,table还包含以下⼦标签:
① generatedKey标签(0个或1个)
该标签⽤来指定⾃动⽣成主键的属性(identity字段或者sequences序列)。如果指定这个标签,MBG将在⽣成insert的SQL映射⽂件中插⼊⼀个selectKey标签。
必选属性如下:
column:⽣成列的列名。
SQLStatement:返回新值的SQL语句。如果这是⼀个identity列,则可以使⽤其中⼀个预定义的特殊值,预定义值包括:
Cloudscape、DB2、DB2_MF、Derby、HSQLDB、Infomix、MySQL、SQL Server、SYBASE、JDBC(使⽤JDBC标准接⼝获取值,独⽴于数据库获取标识列中的值)。
可选属性如下:
identity:当设置为true,该列会被标记为identity列,并且selectKey标签会被插⼊在insert后⾯。当设置为false(默认),selectKey会被插⼊到insert之前。即使type属性指定为post,仍然需要将identity列设置为true,这会作为MBG从插⼊列表中删除该列的标识。
type:type=post且identity=true时,⽣成的selectKey中order=AFTER;当type=pre时,identity只能为f
alse,⽣成的selectKey中order=BEFORE。⾃动增长的列只有插⼊到数据库后才能得到ID,所以是AFTER;使⽤序列时,只有先获取序列之后才能插⼊数据库,所以是BEFORE。
② columnRenamingRule标签
该标签可以在⽣成之前对列进⾏重命名,例如⼀个表名包含CUST_BUSINESS、CUST_STREAT_ADDRESS、CUST_CITY、CUST_STATE,这些前缀可以通过如下⽅式定义重命名规则:
<columnRenamingRules searchString="^CUST_" replaceString=""/>
③ columnOverride标签
该标签⽤于将某些默认计算的属性值更改为指定的值。
必选属性:
column:表⽰要重写的列名。
可选属性:
property:要使⽤的java属性的名称。
javaType:列的属性值为完全限定的Java类型。
jdbcType:列的JDBC类型。
typeHandler:根据⽤户定义的需要⽤来处理列的类型处理器(MBG不会校验这个类型处理器是否存在或可⽤)。
delimitedColumnName:指定是否应在⽣成的SQL的列名称上增加分隔符。
④ ignoreColumn标签
该标签可以⽤来屏蔽不需要⽣成的列。
三、配置参考⽰例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-////DTD MyBatis Generator Configuration 1.0//EN"
"/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="MySqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">
java xml是什么<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="sql.jdbc.Driver"
connectionURL="jdbc://mysql://localhost:3306/mybatis"
userId="root"
password="">
</jdbcConnection>
<javaModelGenerator targetPackage="sql" targetProject="src\main\java">
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="l" targetProject="src\main\resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="src\main\java"/>
<table tableName="%">
<generatedKey column="id" sqlStatement="MySql"/>
</table>
</context>
</generatorConfiguration>
四、运⾏代码⽣成器
在MyBatis Simple项⽬的l中添加如下插件配置:
<plugin>
<groupId&ator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.3</version>
<configuration>
<configurationFile>
${basedir}/src/main/l
</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&batis</groupId>
<artifactId>simple</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论