MyBatis(六)MyBatis Generator配置

Justagreenonion 2020-06-21

在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
    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只能为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(六)MyBatis Generator配置 

以上内容整理自《MyBatis从入门到精通》

相关推荐