MyBatisMyBatis Generator配置
Posted Fantastic_Clouds
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatisMyBatis Generator配置相关的知识,希望对你有一定的参考价值。
在Mapper XML用法中,对于大多数单表操作来说,所用到的方法都很规范且类似。因此,MyBatis提供了代码生成器:MyBatis Generator(MBG)。
MBG通过丰富的配置可以生成不同类型的代码,代码包含了数据库对应的实体类、Mapper接口类、Mapper XML文件和Example对象,这些代码文件中几乎包含了全部的单表操作方法,使用MBG可以极大程度上方便我们使用MyBatis,还可以减少很多重复操作。
官方文档地址:http://mybatis.org/generator/。
一、XML配置详解
1、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">
文件头中的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:该参数可以指定扩展org.mybatis.generator.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="org.mybatis.generator.api.dom.DefaultJavaFormatter"/> <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
假设有一个表名为user info,如果直接查询表名,会提示错误。在mysql中,需要使用反单引号"`"作为分隔符才能避免数据库错误。
2、plugin标签
该标签用来定义一个插件,用于扩展或修改MBG生成的代码。该插件将按在配置中配置的顺序执行,MBG默认插件包含缓存插件、序列化插件、RowBounds插件、ToString插件等。
3、commentGenerator标签
该标签用来配置如何生成注释信息,有一个可选属性type,可以指定用户的实现类,该类需要实现org.mybatis.generator.api.CommentGenerator接口,而且必有一个默认空的构造方法。
type属性接收默认的特殊值DEFAULT,使用默认的实现类org.mybatis.genertor.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="com.mysql.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映射生成器(Mapper.xml文件)的属性。如果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
- ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件。
- MIXEDMAPPER:XML和注解的混合形式,上面这种情况中的SQL Provider注解方法会被XML方法替代。
- XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
- MyBatis3Simple
- ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件。
- 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只能为false,生成的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 "-//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=""> </jdbcConnection> <javaModelGenerator targetPackage="test.mosql" targetProject="src\\main\\java"> <property name="trimStrings" value="true"/> </javaModelGenerator> <sqlMapGenerator targetPackage="test.xml" 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项目的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/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>1.0-SNAPSHOT</version> </dependency> </dependencies> </plugin>
在Maven插件中找到mybatis-generator:generator,双击运行即可。
以上内容整理自《MyBatis从入门到精通》
以上是关于MyBatisMyBatis Generator配置的主要内容,如果未能解决你的问题,请参考以下文章