简介
Mybatis Generator (MBG) 是 Mybatis 官方提供的代码生成器,通过它可以在项目中自动生成简单的 CRUD 方法,甚至“无所不能”的高级条件查询(MyBatis3DynamicSql,有了它根本不需要 Mybatis Plus),让我们避免了进行数据库交互时需要手动创建对象和配置 Mybatis 映射等基础工作。
另外,MBG 有很好地扩展性,它提供了大量的接口和插件用来给我们自定义生成的代码应该是什么样子,例如我们可以自定义注释、代码格式化、添加 toString 方法等。本文将讲解如何使用这些接口。
本文内容大致如下,由于篇幅较长,可选择阅读:
- 如何使用 MBG 生成代码;
- 详解 MBG 的配置,将配置使用自定义注释生成器、实体类中添加 toString/equals/hashCode方法等。
- MyBatis3DynamicSql 风格(无 XML) API 的使用。
通过本文的学习,你将能够通过简单改造 MBG 来生成自己想要的代码,另外,我们也将认识强大的 MyBatis3DynamicSql 风格(它提供的条件类使用 Lambda 解耦,全注解,支持单表查询、多表查询、分页、排序、分组等等)。
关于 MBG 生成代码的风格
MBG 支持生成不同风格、不同语言的代码,例如,MBG 能够生成 Java 或 Kotlin 代码。另外,MBG 支持生成旧版的 MyBatis3 风格(我们常用的 xml 配置属于 MyBatis3 风格,官方认为这种风格已经过时),也支持新版的 MyBatis3DynamicSql 的风格(MyBatis3DynamicSql 风格为官方推荐)。几种风格的对比如下:
代码风格 | 描述 |
---|---|
MyBatis3DynamicSql | 默认风格,官方推荐 Java代码 全注解,不生成 XML 文件生成的高级条件查询灵活性较大,使用 lambda 表达式避免条件对象渗透到上一层 一个表生成一个实体类 ![]() |
MyBatis3Kotlin | Kotlin 代码,本文不涉及 |
MyBatis3 | 早期风格 Java代码能够生成 MyBatis3 兼容的 xml 或 全注解生成的高级条件查询灵活性较小,条件类渗透到上一层,而且 sql 和代码耦合度较高 一个表除了生成基本类,可能还会生成主键类和BLOB类(如果指定的话) ![]() |
MyBatis3Simple | MyBatis3 的简易版 Java代码能够生成 MyBatis3 兼容的 xml 或 全注解不生成 “by example” 或 “selective” 的方法 一个表生成一个实体类 ![]() |
由于 MyBatis3 风格生成的 Example 类存在的问题,实际项目中建议使用 MyBatis3Simple 风格或官方推荐的 MyBatis3DynamicSql 风格。
关于 MBG 文件覆盖的问题
当我们在迭代开发环境中使用 MBG,需要注意文件覆盖的问题,默认情况下,文件覆盖规则如下:
-
如果 XML 已经存在,MBG 会采用文件合并的方式。
它不会修改你自定义的节点,但是会更新原来生成的 CRUD 节点(如果表发生变化)。文件合并有个前提,就是原来生成的 CRUD 节点必须包含 @mbg.generated 的默认注释。否则,当再次运行 MBG 时,它将无法识别哪些是它生成过的节点,于是会出现下图的情况,即 CRUD 节点被重复插入。
![https://img2020.cnblogs.com/blog/1731892/202005/1731892-20200502235440091-1666766703.png)
- 如果 Java 或 Kotlin 文件已经存在,MBG 可以覆盖现有文件或使用其他唯一名称保存新生成的文件,这取决于你如何配置
<overwrite>false</overwrite>
。
那么,下面开始详细介绍如何使用 MBG。
项目环境的说明
工程环境
JDK:1.8.0_231(要求 JDK8 及以上)
maven:3.6.1
IDE:Spring Tool Suites4 for Eclipse 4.12
mysql:5.7.28
数据库脚本
具体的 sql 脚本也提供好了(脚本路径)。
maven配置
pom.xml配置
MBG 支持使用Java 代码、maven 插件、Eclipse 插件等方式运行,本文使用 maven 插件方式,所以需要在 build/plugins 节点引入 MBG 插件,并加入其它依赖项,例如 mybatis、mysql 驱动等。另外,因为本文也需要用到 Java 程序来运行 MBG(当使用自定义类时),所以把插件的依赖项从 build/plugins/plugin 节点中单独取出来。
<dependencies>
<!-- mybatis-generator -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- dynamic-sql 用于测试MyBatis3DynamicSql生成的代码-->
<dependency>
<groupId>org.mybatis.dynamic-sql</groupId>
<artifactId>mybatis-dynamic-sql</artifactId>
<version>1.1.4</version>
</dependency>
<!-- jdbc驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<type>jar</type>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<phase>package</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<verbose>true</verbose>
<contexts>default</contexts>
<overwrite>false</overwrite>
<configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
<includeCompileDependencies>true</includeCompileDependencies>
</configuration>
</plugin>
</plugins>
</build>
插件参数详解
plugin/configuration 节点可以配置影响 MBG 行为的参数,如下:
参数 | 表达式 | 类型 | 描述 |
---|---|---|---|
configurationFile | ${mybatis.generator.configurationFile} | java.io.File | 配置文件路径。 默认为${basedir}/src/main/resources/generatorConfig.xml |
contexts | ${mybatis.generator.contexts} | java.lang.String | 指定使用配置文件中的哪个context 多个用逗号隔开 |
jdbcDriver | ${mybatis.generator.jdbcDriver} | java.lang.String | JDBC 驱动 |
jdbcPassword | ${mybatis.generator.jdbcPassword} | java.lang.String | JDBC 密码 |
jdbcURL | ${mybatis.generator.jdbcURL} | java.lang.String | JDBC URL |
jdbcUserId | ${mybatis.generator.jdbcUserId} | java.lang.String | JDBC 用户名 |
outp |