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:将数据表的所有字段放在一个实体类中,也就是说一个数据表对应一个实体类。
- hierarchical:如果数据表有主键,则会单独为主键生成一个主键实体类,如果数据表有
示例:
<?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 的BIGDECIMAL
和NUMERIC
类型映射为 Java 的Ingeter
类型;如果为true
,则将 JDBC 的BIGDECIMAL
和NUMERIC
类型映射为 Java 的java.math.BigDecimal
类型 -
useJSR310Types:默认为
false
,如果为false
,则将 JDBC 的所有时间日期类型映射为 Java 的java.util.Date
类型;如果为true
,则有如下的映射关系:JDBC 类型 Java 类型 DATE java.time.LocalDate TIME java.time.LocalTime TIMESTAMP java.time.LocalDateTime TIME_WITH_TIMEZONE java.time.OffsetTime TIMESTAMP_WITH_TIMEZONE java.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>
标签有 targetPackage
和 targetProject
两个属性,如下所示:
- 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>
标签同样有 targetPackage
和 targetProject
两个属性,如下所示:
- 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>
标签有type
、 targetPackage
和 targetProject
3个属性,如下所示:
- type:dao 层接口的生成策略,有如下可选值:
- ANNOTATIONMAPPER:dao层接口采用纯注解的方式,代码生成的时候完全依赖于注解和
SqlProviders
,而不会生成.xml
文件 - XMLMAPPER:dao层接口需要有对应的
xml
文件生成,也就是采用xml
的方式 - MIXEDMAPPER:dao层接口简单的实现采用注解的方式,复杂的实现采用
xml
的方式
- ANNOTATIONMAPPER:dao层接口采用纯注解的方式,代码生成的时候完全依赖于注解和
- 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
配置文件基本上讲解完毕。