Mybatis Generator 插件

2,316 阅读1分钟

Mybatis Generator 是 Mybatis 的一个插件(简称 MBG),这个插件可以根据数据表的表结构,逆向的为你自动生成数据库持久化对象(entiry)、数据库操作接口(dao)、以及映射文件 mapper,省去了编写重复代码的过程,提高程序员的开发效率。

一、集成 MBG 插件

1.1 引入 MBG 插件

首先需要在 Maven 的 pom 文件中引入 MBG 插件,如下所示:

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.6</version>
            <configuration>
                <!--指定MBG配置文件位置-->
                <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
                <!--允许生成的同名文件覆盖-->
                <overwrite>true</overwrite>
                <!--允许显示文件生成的具体过程-->
                <verbose>true</verbose>
            </configuration>
        </plugin>
    <plugins>    
</build>

MBG 插件的运行需要依赖于 generatorConfig.xml 配置文件,因此,在引入插件的时候需要指定 generatorConfig.xml 配置文件的位置,后续会详细讲解 generatorConfig.xml 配置文件。

1.2 添加数据库相关的依赖

MBG 需要连接数据库,获取数据表的表结构信息,因此,MBG 插件需要依赖数据库相关的驱动。

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.6</version>
            <configuration>
                <!--指定MBG配置文件位置-->
                <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
                <!--允许生成的同名文件覆盖-->
                <overwrite>true</overwrite>
                <!--允许显示文件生成的具体过程-->
                <verbose>true</verbose>
            </configuration>
            <dependencies>
                <!--数据库连接驱动-->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.16</version>
                </dependency>
                <!--为MBG添加lombok插件-->
                <dependency>
                    <groupId>com.softwareloop</groupId>
                    <artifactId>mybatis-generator-lombok-plugin</artifactId>
                    <version>1.0</version>
                </dependency>
            </dependencies>
        </plugin>
    <plugins>    
</build>

二、generatorConfig 配置文件

generatorConfig.xml 配置文件控制 MBG 插件自动生成代码的一系列规则,以及生成的 entity、dao、mapper 的存放路径。

2.1 根标签

<generatorConfiguration> 标签是 generatorConfig.xml 配置文件的根标签,所有配置内容都包含在<generatorConfiguration>标签下面。

实例:

<?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>
    <!--具体配置内容-->
</generatorConfiguration>

2.2 properties 标签

<properties>标签用来引入 SpringBoot 的配置文件,引入外部的配置文件后,就可以在当前的 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>
    <!--引入外部配置-->
    <properties>application.properties</properties>
    <!--具体配置内容-->
</generatorConfiguration>

2.3 context 标签

generatorConfig.xml 配置文件至少有1个<context> 标签,数据库的连接配置、代码的自动生成策略等等都需要放在<context>标签下面。

<context>标签有3个属性:

  • id:context 的唯一标识,可随便填写,只要保证多个 context 不重复即可
  • targetRuntime:代码生成器,默认为MyBatis3,常用的还有MyBatis3Simple,这个配置会影响 dao 和 mapper.xml 的生成
  • defaultModelType:控制数据库操作对象的生成策略,默认为 conditional,可选值:
    • hierarchical:如果数据表有主键,则会单独为主键生成一个主键实体类,如果数据表有BLOB类型的字段,则会单独生成一个包含所有BLOB字段的实体类,剩余的普通字段会在同一个实体类中。
    • conditional:与 hierarchical 类似,只不过如果数据表只有1个主键,则conditional不会为这个主键生成实体类,而是将其合并到普通字段实体类中。
    • flat:将数据表的所有字段放在一个实体类中,也就是说一个数据表对应一个实体类。

示例:

<?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>application.properties</properties>
    
    <context id="default" defaultModelType="flat" targetRuntime="MyBatis3">
    </context>
</generatorConfiguration>

<context> 允许包含多个<property>子标签,用来定义相关的属性,常见的属性如下所示:

  • autoDelimitKeywords:是否使用分隔符括住数据库的关键字(例如:mysql 中使用的反引号),默认为false
  • beginningDelimiter:分隔符的开始符号,默认为""
  • endingDelimiter:分隔符的结束符号,默认为""
  • javaFileEncoding:文件编码格式

示例:

<?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>application.properties</properties>
    
    <context id="default" defaultModelType="flat" targetRuntime="MyBatis3">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <property name="javaFileEncoding" value="UTF-8"/>
    </context>
</generatorConfiguration>

2.4 commentGenerator 标签

<commentGenerator> 标签用来控制在生成实体类中是否生成注释,一般情况下,我们会阻止注释的生成,这样生成的实体类就显得非常的干净简洁。

<commentGenerator> 标签允许包含多个<property>子标签,用来控制注释的生成,常见的属性如下所示:

  • suppressAllComments:是否阻止所有注释的生成,一般设置为true
  • suppressDate:是否阻止注释包含时间时间,一般设置为true
  • dateFormat:配合 suppressDate 使用,指注释中输出的定日期时间格式
  • addRemarkComments:是否输出数据表和列的 comment 信息

示例:

<?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>application.properties</properties>
    
    <context id="default" defaultModelType="flat" targetRuntime="MyBatis3">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <property name="javaFileEncoding" value="UTF-8"/>
        
        <!--阻止注释的生成-->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
    </context>
</generatorConfiguration>

2.5 javaTypeResolver 标签

<javaTypeResolver>标签用来设置 JDBC 类型与 Java 数据类型的映射关系,一般可以不用做任何配置,只需要使用它的默认映射关系即可,如果用户需要配置,也只能通过fourceBigDecimals 属性和useJSR310Types属性来配置 BigDecimal 和 时间日期类型的映射关系。

  • fourceBigDecimals:默认为false,如果为false,则将 JDBC 的BIGDECIMALNUMERIC类型映射为 Java 的Ingeter类型;如果为true,则将 JDBC 的BIGDECIMALNUMERIC类型映射为 Java 的java.math.BigDecimal类型

  • useJSR310Types:默认为false,如果为false,则将 JDBC 的所有时间日期类型映射为 Java 的java.util.Date类型;如果为true,则有如下的映射关系:

    JDBC 类型Java 类型
    DATEjava.time.LocalDate
    TIMEjava.time.LocalTime
    TIMESTAMPjava.time.LocalDateTime
    TIME_WITH_TIMEZONEjava.time.OffsetTime
    TIMESTAMP_WITH_TIMEZONEjava.time.OffsetDateTime

示例:

<?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>application.properties</properties>
    
    <context id="default" defaultModelType="flat" targetRuntime="MyBatis3">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <property name="javaFileEncoding" value="UTF-8"/>
        
        <!--阻止注释的生成-->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
        
        <!--类型映射-->
        <javaTypeResolver>
            <property name="fourceBigDecimals" value="true"/>
            <property name="useJSR310Types" value="true"/>
        </javaTypeResolver>
    </context>
</generatorConfiguration>

2.6 jdbcConnection 标签

<jdbcConnection> 标签用来配置数据库的连接信息,包含如下属性:

  • driverClass:指定数据库的连接驱动
  • connectionURL:数据库连接URL
  • userId:用户名
  • password:密码

示例:

(1) application.properties 外部配置

spring.datasource.dirverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/example?useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=admin
spring.datasource.password=admin

(2) 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>
    <!--引入外部配置-->
    <properties>application.properties</properties>
    
    <context id="default" defaultModelType="flat" targetRuntime="MyBatis3">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <property name="javaFileEncoding" value="UTF-8"/>
        
        <!--阻止注释的生成-->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
        
        <!--数据库连接配置-->
        <jdbcConnection dirverClass="${spring.datasource.driverClassName}"
                        connectionURL="${spring.datasource.url}"
                        userId="${spring.datasource.username}"
                        password="${spring.datasource.password}">
            <!--高版本的mysql-connector-java需要将nullCatalogMeansCurrent设置为true-->
            <property name="nullCatalogMeansCurrent" value="true"/>
        </jdbcConnection>
    </context>
</generatorConfiguration>

2.7 javaModelGenerator 标签

<javaModelGenerator> 标签用来配置实体类的代码生成行为,<javaModelGenerator> 标签有 targetPackagetargetProject两个属性,如下所示:

  • targetPackage:用来指定实体类的包名
  • targetProject:用来指定实体类的位置(相当于项目根目录)

<javaModelGenerator> 标签允许包含多个<property>子标签,用来控制实体类代码的生成策略,常用的<property>属性如下:

  • constructorBased:是否在实体类中生成一个构造函数,这个构造函数会包含所有的字段,默认为false,我们一般不需要这样的构造函数
  • enableSubPackages:是否允许子包,默认为false
  • immutable:实体类的字段属性是否为不可变的,默认为false,如果为true,则实体类中就不会生成 Setter 方法,所有字段通过 final 关键字修饰
  • trimStrings:Setter 方法中是否对字段进行一次 trim() 操作,默认为false

示例:

<?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>application.properties</properties>
    
    <context id="default" defaultModelType="flat" targetRuntime="MyBatis3">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <property name="javaFileEncoding" value="UTF-8"/>
        
        <!--阻止注释的生成-->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
        
        <!--数据库连接配置-->
        <jdbcConnection dirverClass="${spring.datasource.driverClassName}"
                        connectionURL="${spring.datasource.url}"
                        userId="${spring.datasource.username}"
                        password="${spring.datasource.password}">
        </jdbcConnection>
        
        <!--实体类自动生成配置-->
        <javaModelGenerator targetPackage="com.example.entity" targetProject="src/main/java">
            <property name="constructorBased" value="false"/>
            <property name="enableSubPackages" value="true"/>
            <property name="immutable" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
    </context>
</generatorConfiguration>

2.8 sqlMapGenerator 标签

<sqlMapGenerator> 标签用来配置 mapper.xml 文件的自动生成行为,<sqlMapGenerator> 标签同样有 targetPackagetargetProject两个属性,如下所示:

  • targetPackage:用来指定 mapper 的包名
  • targetProject:用来指定 mapper 文件的位置(相当于项目根目录)

<sqlMapGenerator> 标签同样允许包含<property>子标签,常用的<property>属性如下:

  • enableSubPackages:是否允许子包,默认为false

示例:

<?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>application.properties</properties>
    
    <context id="default" defaultModelType="flat" targetRuntime="MyBatis3">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <property name="javaFileEncoding" value="UTF-8"/>
        
        <!--阻止注释的生成-->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
        
        <!--数据库连接配置-->
        <jdbcConnection dirverClass="${spring.datasource.driverClassName}"
                        connectionURL="${spring.datasource.url}"
                        userId="${spring.datasource.username}"
                        password="${spring.datasource.password}">
        </jdbcConnection>
        
        <!--实体类自动生成配置-->
        <javaModelGenerator targetPackage="com.example.entity" targetProject="src/main/java">
            <property name="constructorBased" value="false"/>
            <property name="enableSubPackages" value="true"/>
            <property name="immutable" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        
        <!--mapper.xml文件的自动生成配置-->
        <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
    </context>
</generatorConfiguration>

2.9 javaClientGenerator 标签

<javaClientGEnerator> 标签用来配置 dao 层接口的自动生成行为,<javaClientGEnerator> 标签有typetargetPackagetargetProject3个属性,如下所示:

  • type:dao 层接口的生成策略,有如下可选值:
    • ANNOTATIONMAPPER:dao层接口采用纯注解的方式,代码生成的时候完全依赖于注解和SqlProviders,而不会生成.xml文件
    • XMLMAPPER:dao层接口需要有对应的xml文件生成,也就是采用xml的方式
    • MIXEDMAPPER:dao层接口简单的实现采用注解的方式,复杂的实现采用xml的方式
  • targetPackage:用来指定 mapper 的包名
  • targetProject:用来指定 mapper 文件的位置(相当于项目根目录)

<javaClientGEnerator> 标签同样允许包含<property>子标签,常用的<property>属性如下:

  • enableSubPackages:是否允许子包,默认为false

示例:

<?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>application.properties</properties>
    
    <context id="default" defaultModelType="flat" targetRuntime="MyBatis3">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <property name="javaFileEncoding" value="UTF-8"/>
        
        <!--阻止注释的生成-->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
        
        <!--数据库连接配置-->
        <jdbcConnection dirverClass="${spring.datasource.driverClassName}"
                        connectionURL="${spring.datasource.url}"
                        userId="${spring.datasource.username}"
                        password="${spring.datasource.password}">
        </jdbcConnection>
        
        <!--实体类自动生成配置-->
        <javaModelGenerator targetPackage="com.example.entity" targetProject="src/main/java">
            <property name="constructorBased" value="false"/>
            <property name="enableSubPackages" value="true"/>
            <property name="immutable" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        
        <!--mapper自动生成配置-->
        <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        
        <!--dao层接口自动生成配置-->
        <sqlMapGenerator type="XMLMAPPER" targetPackage="com.example.dao" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
    </context>
</generatorConfiguration>

2.10 table 标签

<table> 标签用来配置 MBG 插件自动生成代码所需要的数据表,<table>标签的属性非常多,下面列举几个常见的属性:

  • tableName:指定数据表,必选属性,如果对针对所有数据表自动生成代码,则可将值设为%
  • enableInsert:是否在 dao 接口层自动生成 insert() 方法签名,默认为true
  • enableSelectByPrimaryKey:是否自动生成selectByPrimaryKey()方法,默认为true
  • enableSelectByExample:是否自动生成selectByExample()方法,默认为true
  • enableUpdateByPrimaryKey:是否自动生成updateByPrimaryKey()方法,默认为true
  • enableUpdateByExample:是否自动生成updateByExample()方法,默认为true
  • enableDeleteByPrimaryKey:是否自动生成deleteByPrimaryKey()方法,默认为`tru
  • enableDeleteByExample:是否自动生成deleteByExample()方法,默认为true
  • enableCountByExample:是否自动生成countByExample()方法,默认为true

<generatedKey> 标签是<table> 标签的子标签,用来指定主键的生成规则,当使用了<generatedKey> 标签后,在xxmapper.xml中的insert语句中会添加<selectKey>标签。

<generatedKey> 标签的属性如下:

  • column:指定主键列,一般情况下为id
  • sqlStatement:指定主键的查询语句,如果值为MySql,则使用SELECT LAST_INSERT_ID() 语句来查询主键
  • type:指定<selectKey>标签的order属性,如果值为pre,则order属性值为BEFORE,如果值为post,则order属性值为AFTER
  • identity:当值为true时,selectKey标签的order属性为AFTER

示例:

<?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>application.properties</properties>
    
    <context id="default" defaultModelType="flat" targetRuntime="MyBatis3">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <property name="javaFileEncoding" value="UTF-8"/>
        
        <!--阻止注释的生成-->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
        
        <!--数据库连接配置-->
        <jdbcConnection dirverClass="${spring.datasource.driverClassName}"
                        connectionURL="${spring.datasource.url}"
                        userId="${spring.datasource.username}"
                        password="${spring.datasource.password}">
        </jdbcConnection>
        
        <!--实体类自动生成配置-->
        <javaModelGenerator targetPackage="com.example.entity" targetProject="src/main/java">
            <property name="constructorBased" value="false"/>
            <property name="enableSubPackages" value="true"/>
            <property name="immutable" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        
        <!--mapper自动生成配置-->
        <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        
        <!--dao层接口自动生成配置-->
        <sqlMapGenerator type="XMLMAPPER" targetPackage="com.example.dao" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        
        <!--指定数据表-->
        <table tableName="%">
            <generatedKey column="id" sqlStatement="MySql" identity="true"/>
        </table>
    </context>
</generatorConfiguration>

自此,整个generatorConfig.xml配置文件基本上讲解完毕。

参考文档