Mybatis详解系列(五)--Mybatis Generator和全注解风格的MyBatis3DynamicSql
2020-05-03 12:55
1721 查看
# 简介
Mybatis Generator (MBG) 是 Mybatis 官方提供的代码生成器,通过它可以在项目中自动生成简单的 CRUD 方法,甚至**“无所不能”**的高级条件查询(**MyBatis3DynamicSql** ),让我们避免了进行数据库交互时需要手动创建对象和配置 Mybatis 映射等基础工作。
另外,MBG 有很好地扩展性,它提供了大量的接口和插件用来给我们自定义生成的代码应该是什么样子,例如我们可以自定义注释、代码格式化、添加 toString 方法等。本文将讲解如何使用这些接口。
本文内容大致如下,由于篇幅较长,可选择阅读:
1. 如何使用 MBG 生成代码;
2. 详解 MBG 的配置,将配置使用自定义注释生成器、实体类中添加 toString/equals/hashCode方法等。
3. 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,需要注意文件覆盖的问题,默认情况下,文件覆盖规则如下: 1. 如果 XML 已经存在,MBG 会采用文件合并的方式。 它不会修改你自定义的节点,但是会更新原来生成的 CRUD 节点(如果表发生变化)。**文件合并有个前提,就是原来生成的 CRUD 节点必须包含 @mbg.generated 的默认注释**。否则,当再次运行 MBG 时,它将无法识别哪些是它生成过的节点,于是会出现下图的情况,即 CRUD 节点被重复插入。 ![https://img2020.cnblogs.com/blog/1731892/202005/1731892-20200502235440091-1666766703.png) 2. 如果 Java 或 Kotlin 文件已经存在,MBG 可以覆盖现有文件或使用其他唯一名称保存新生成的文件,这取决于你如何配置`false`。 那么,下面开始详细介绍如何使用 MBG。 # 项目环境的说明 ## 工程环境 JDK:1.8.0_231(要求 JDK8 及以上) maven:3.6.1 IDE:Spring Tool Suites4 for Eclipse 4.12 mysql:5.7.28 ## 数据库脚本 具体的 sql 脚本也提供好了([脚本路径]( https://github.com/ZhangZiSheng001/mybatis-projects/sql))。 # maven配置 ## pom.xml配置 MBG 支持使用**Java 代码、maven 插件、Eclipse 插件等**方式运行,本文使用 maven 插件方式,所以需要在 build/plugins 节点引入 MBG 插件,并加入其它依赖项,例如 mybatis、mysql 驱动等。另外,因为本文也需要用到 Java 程序来运行 MBG(当使用自定义类时),所以把插件的依赖项从 build/plugins/plugin 节点中单独取出来。 ```xml org.mybatis.generator mybatis-generator-core 1.4.0 org.mybatis mybatis 3.5.4 org.mybatis.dynamic-sql mybatis-dynamic-sql 1.1.4 mysql mysql-connector-java 8.0.15 ch.qos.logback logback-core 1.2.3 jar ch.qos.logback logback-classic 1.2.3 jar org.mybatis.generator mybatis-generator-maven-plugin 1.4.0 Generate MyBatis Artifacts package generate true default false ${basedir}/src/main/resources/generatorConfig.xml true ``` ## 插件参数详解 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 用户名 | | outputDirectory | ${mybatis.generator.outputDirectory} | java.io.File | MBG 文件输出路径。只有在配置文件中配置targetProject="MAVEN"(区分大小写),才会使用这个路径。
默认为${project.build.directory}/generated-sources/mybatis-generator | | overwrite | ${mybatis.generator.overwrite} | boolean | 是否覆盖已经存在的同名Java文件。
如果为true,Java文件将被覆盖。 如果为false,MBG会将新生成唯一名称的Java文件(例如MyClass.java.1,MyClass.java.2)
默认为false | | sqlScript | ${mybatis.generator.sqlScript} | java.lang.String | 生成代码之前需要运行的SQL脚本路径。
如果指定,则必须提供jdbcDriver,jdbcURL、jdbcUserId、jdbcPassword。 | | tableNames | ${mybatis.generator.tableNames} | java.lang.String | 需要生成代码的表
多个用逗号隔开 | | verbose | ${mybatis.generator.verbose} | boolean | 是否打印日志
默认为false | | includeCompileDependencies | ${mybatis.generator.includeCompileDependencies} | boolean | 如果为true,则作用域为“ compile”,“ provided”和“ system”的依赖将添加到生成器的类路径中。
默认为false | | includeAllDependencies | ${mybatis.generator.includeAllDependencies} | boolean | 如果为true,则所有作用域的依赖将添加到生成器的类路径中。
默认为false | | skip | ${mybatis.generator.skip} | boolean | 项目启动时跳过 MBG。
默认false | # 代码生成规则配置 使用 maven 插件的方式不需要编写代码,只要将规则配置到 generatorConfig.xml 文件就行,配置内容主要为: 1. 如何连接到数据库 2. 生成什么对象,以及如何生成它们 3. 哪些表将用于对象生成 下面先给一个简单版的,后面再具体讲解这些参数的意义: ```xml
```
# 命令执行
## maven 插件的运行方式
maven build,输入`mybatis-generator:generate`,生成成功。
## Java程序的运行方式
通常情况下,我们都是使用 maven 插件的方式,但是,当我们在 MBG 中指定了自定义的实现,使用 maven 插件可能会报错,这个时候就需要通过 Java 程序的方式运行 MBG,具体方法如下:
```java
public static void main(String[] args) throws Exception {
// LogFactory.forceSlf4jLogging();
// System.setProperty("user.name", "zzs");
// 这个集合记录着生成、合并、覆盖文件的信息
List warnings = new ArrayList();
InputStream in = MybatisGenerator.class.getClassLoader().getResourceAsStream("generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(in);
// 不覆盖 Java 文件
boolean overwrite = false;
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
// 生成文件
myBatisGenerator.generate(null);
// 打印信息
warnings.forEach(System.err::println);
}
```
# 生成规则详解
generatorConfig.xml 的顶层结构如下:
- generatorConfiguration(配置)
- classPathEntry(JDBC驱动路径)
- properties(properties文件路径)
- context(生成对象的环境)
- property(Context作用域参数)
- jdbcConnection(JDBC连接)
- connectionFactory(JDBC连接工厂)
- commentGenerator(注释生成器)
- javaModelGenerator(实体对象生成器)
- javaClientGenerator(Mapper 接口或实现类生成器)
- sqlMapGenerator(xml 生成器)
- table(用于生成对象的表)
- javaTypeResolver(Java 类型处理器)
- plugin(插件)
下面选择部分节点展开分析:
## context*
` `节点用于指定生成一系列对象的环境。我们可以在配置文件中配置多个` `节点来实现从**不同数据源**或采用不同生成参数生成对象。
### 属性
这里最重要的属性是**targetRuntime**,它直接决定该环境下生成的代码风格,常用的风格为 MyBatis3DynamicSql 和 MyBatis3Simple。
| 属性 | 描述 |
| ---------------------- | ------------------------------------------------------------ |
| id | 用于唯一标识指定环境。必选属性 |
| defaultModelType | 指定实体对象的类型。包括三种:
**flat**:一个表生成一个实体类;
**conditional**:和 hierarchical 差不多,区别在于如果表只有一个主键,不会单独去生成一个主键类;
**hierarchical**:除了生成基本类,如果表中包含主键或 BLOB 列,都会单独再生成一个主键类或BLOB类
**默认为 conditional**,如果 targetRuntime 为 "MyBatis3Simple"、"MyBatis3DynamicSql"或"MyBatis3Kotlin",则该属性忽略 | | **targetRuntime** | 用于指定生成代码的风格。默认为 MyBatis3DynamicSql | | introspectedColumnImpl | 指定`org.mybatis.generator.api.IntrospectedColumn`实现类。该类可以看成是某一列的所有信息 | ### 子节点 ` `包含以下子节点: - `` (0..N) - `` (0..N) - `` (0 or 1) - `/` (1 Required) - `` (0 or 1) - `` (1 Required) - `` (0 or 1) - `` (0 or 1) - `` (1..N)
其中,``支持以下参数。其中,针对 mysql 数据库,可以将定界符修改为反单引号。如果想要使用自定义的代码格式或 XML 格式,可以配置自定义实现。
| 参数名 | Property Values |
| :------------------ | :----------------------------------------------------------- |
| autoDelimitKeywords | 如果数据库关键字被作为列名使用,MBG 是否需要对其进行定界。
```
另一个子节点` `也是相同的用法。
```xml
[/table]
```
#### ignoreColumnsByRegex/ignoreColumn
``和``节点用于告诉 MBG 生成代码时忽略某些列。使用方法如下。
```xml
```
## plugin*
``节点用于定义和配置插件。这个节点只有一个 type 属性,用于指定使用哪个插件,并通过子节点 property 来为这个插件设置参数。
如果自定义的话需要实现`org.mybatis.generator.api.Plugin`接口,并提供无参构造。MBG 为我们提供了许多好用的插件,如下:
| 插件 | 描述 |
| --------------------------------------------------------- | ------------------------------------------------------------ |
| org.mybatis.generator.plugins.SerializablePlugin | 用于在实体类中实现`java.io.Serializable`接口 |
| **org.mybatis.generator.plugins.ToStringPlugin** | 用于在实体类中添加 toString 方法 |
| **org.mybatis.generator.plugins.EqualsHashCodePlugin** | 用于在实体类中添加 equals 和 hashCode 方法。 |
| org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin | 用于指定不合并 XML 文件,这时 MBG 将 采用处理 Java 文件的方式来处理 XML 文件 |
| org.mybatis.generator.plugins.CachePlugin | 用于在 xml 文件中加入cache节点 |
| org.mybatis.generator.plugins.CaseInsensitiveLikePlugin | 用于在 Example 类中生成不区分大小写的Like |
| org.mybatis.generator.plugins.dsql.DisableDeletePlugin | 禁用 MyBatisDynamicSQLV2 风格的所有删除方法 |
| org.mybatis.generator.plugins.dsql.DisableInsertPlugin | 禁用 MyBatisDynamicSQLV2 风格的所有插入方法 |
| org.mybatis.generator.plugins.dsql.DisableUpdatePlugin | 禁用 MyBatisDynamicSQLV2 风格的所有更新方法 |
| org.mybatis.generator.plugins.FluentBuilderMethodsPlugin | 用于在实体类中添加`MyDomainClass withValue(Object v)`方法。通过它可以实现如下赋值方式:
`new Employee().withAddress("北京").withDeleted(false).withName("zzs001");` | | **org.mybatis.generator.plugins.MapperAnnotationPlugin** | 用于在 Mapper 接口中添加`@Mapper`接口 | | org.mybatis.generator.plugins.MapperConfigPlugin | 用于生成 Mybatis 的主配置文件 MapperConfig | | org.mybatis.generator.plugins.RenameExampleClassPlugin | 用于重命名 Example 类 | | org.mybatis.generator.plugins.RowBoundsPlugin | 用于在 Mapper 接口的 selectByExample 方法参数中加入 RowBounds 参数,用于支持分页 | | org.mybatis.generator.plugins.VirtualPrimaryKeyPlugin | 用于指定表的主键 | 插件的配置方式非常简单,如下: ```xml ``` 运行 Java 程序,可以看到实体类中生成类 toString 、hashCode 和 equals 方法。 以上,基本讲完 MBG 的使用方法,涉及到的内容可以满足实际使用需求。 # MyBatis3DynamicSql 风格 API 的使用 在研究 MBG 之前,其实我并没有听说过 MyBatis3DynamicSql 风格,因为项目里一直使用的是 Mybatis3Simple,网上也很少人提起。 Mybatis3Simple 可以生成简单的 CRUD,但是针对高级条件查询就无能为力了,实际项目中,我们有时必须手动地去编写高级查询的代码,当然,我们也可以自定义代码生成器来生成,但是这也只能针对单表,涉及到多表时,就不尽人意了。 MyBatis3DynamicSql 风格丢弃了 XML 文件,使用全注解形式并搭配几个条件辅助类,刚接触时,我还是比较抗拒,因为前面**MyBatis3 中也尝试过全注解和条件类,当遇到某些复杂场景时,还是需要 XML,而且生成器提供的条件类会渗透到服务层**。 直到开始使用 MyBatis3DynamicSql,我才发现它的强大。它可以做到: 1. **单表高级查询**。包括 Equal/NotEqual、Like/NotLike、In/NotIn、Between/NotBetween、IsNull/IsNotNull 等等,而且还可以判空设置条件。 2. **联表查询**。你可以像给单表一样给关联表设置条件。 3. **分组、排序、分页**。 4. **只返回你要的字段**。 下面这个例子,涉及到了关联查询、排序、分页,而 MyBatis3DynamicSql 都能帮我们处理,并且**它利用 Lambda表达式来解耦条件类**。 ```java @Test public void testSelect() { // 注意,当查询结果多于1时会报错 List lsit = baseMapper.select(c -> c.leftJoin(DepartmentDynamicSqlSupport.department) .on(departmentId, new EqualTo(DepartmentDynamicSqlSupport.id)) .where(name, isLikeWhenPresent("zzs%"), or(name, isLikeWhenPresent("zzf%"))) .and(status, isEqualTo((byte)1)) .and(address, isIn("北京", "广东")) .and(DepartmentDynamicSqlSupport.name, isEqualToWhenPresent("质控部")) .orderBy(gmtCreate.descending()) .limit(3) .offset(1) ); lsit.forEach(System.err::println); } ``` 我相信,MyBatis3DynamicSql 风格会被更多开发者使用,这里就不长篇大论的讲解如何使用它,因为它的 API 并不难操作。感兴趣的朋友可以移步到项目源码阅读:[测试例子](https://github.com/ZhangZiSheng001/mybatis-projects/tree/master/mybatis-generator/src/test/java/cn/zzs/mybatis/mapper) # 参考资料 [MyBatis Generator官方文档](http://mybatis.org/generator/index.html) > 相关源码请移步:[mybatis--generator](https://github.com/ZhangZiSheng001/mybatis-projects/tree/master/mybatis-generator) > 本文为原创文章,转载请附上原文出处链接:[https://www.cnblogs.com/ZhangZiSheng001/p/12820344.html](https://www.cnblogs.com/ZhangZiSheng001/p/12820344.html)
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,需要注意文件覆盖的问题,默认情况下,文件覆盖规则如下: 1. 如果 XML 已经存在,MBG 会采用文件合并的方式。 它不会修改你自定义的节点,但是会更新原来生成的 CRUD 节点(如果表发生变化)。**文件合并有个前提,就是原来生成的 CRUD 节点必须包含 @mbg.generated 的默认注释**。否则,当再次运行 MBG 时,它将无法识别哪些是它生成过的节点,于是会出现下图的情况,即 CRUD 节点被重复插入。 ![https://img2020.cnblogs.com/blog/1731892/202005/1731892-20200502235440091-1666766703.png) 2. 如果 Java 或 Kotlin 文件已经存在,MBG 可以覆盖现有文件或使用其他唯一名称保存新生成的文件,这取决于你如何配置`false`。 那么,下面开始详细介绍如何使用 MBG。 # 项目环境的说明 ## 工程环境 JDK:1.8.0_231(要求 JDK8 及以上) maven:3.6.1 IDE:Spring Tool Suites4 for Eclipse 4.12 mysql:5.7.28 ## 数据库脚本 具体的 sql 脚本也提供好了([脚本路径]( https://github.com/ZhangZiSheng001/mybatis-projects/sql))。 # maven配置 ## pom.xml配置 MBG 支持使用**Java 代码、maven 插件、Eclipse 插件等**方式运行,本文使用 maven 插件方式,所以需要在 build/plugins 节点引入 MBG 插件,并加入其它依赖项,例如 mybatis、mysql 驱动等。另外,因为本文也需要用到 Java 程序来运行 MBG(当使用自定义类时),所以把插件的依赖项从 build/plugins/plugin 节点中单独取出来。 ```xml org.mybatis.generator mybatis-generator-core 1.4.0 org.mybatis mybatis 3.5.4 org.mybatis.dynamic-sql mybatis-dynamic-sql 1.1.4 mysql mysql-connector-java 8.0.15 ch.qos.logback logback-core 1.2.3 jar ch.qos.logback logback-classic 1.2.3 jar org.mybatis.generator mybatis-generator-maven-plugin 1.4.0 Generate MyBatis Artifacts package generate true default false ${basedir}/src/main/resources/generatorConfig.xml true ``` ## 插件参数详解 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 用户名 | | outputDirectory | ${mybatis.generator.outputDirectory} | java.io.File | MBG 文件输出路径。只有在配置文件中配置targetProject="MAVEN"(区分大小写),才会使用这个路径。
默认为${project.build.directory}/generated-sources/mybatis-generator | | overwrite | ${mybatis.generator.overwrite} | boolean | 是否覆盖已经存在的同名Java文件。
如果为true,Java文件将被覆盖。 如果为false,MBG会将新生成唯一名称的Java文件(例如MyClass.java.1,MyClass.java.2)
默认为false | | sqlScript | ${mybatis.generator.sqlScript} | java.lang.String | 生成代码之前需要运行的SQL脚本路径。
如果指定,则必须提供jdbcDriver,jdbcURL、jdbcUserId、jdbcPassword。 | | tableNames | ${mybatis.generator.tableNames} | java.lang.String | 需要生成代码的表
多个用逗号隔开 | | verbose | ${mybatis.generator.verbose} | boolean | 是否打印日志
默认为false | | includeCompileDependencies | ${mybatis.generator.includeCompileDependencies} | boolean | 如果为true,则作用域为“ compile”,“ provided”和“ system”的依赖将添加到生成器的类路径中。
默认为false | | includeAllDependencies | ${mybatis.generator.includeAllDependencies} | boolean | 如果为true,则所有作用域的依赖将添加到生成器的类路径中。
默认为false | | skip | ${mybatis.generator.skip} | boolean | 项目启动时跳过 MBG。
默认false | # 代码生成规则配置 使用 maven 插件的方式不需要编写代码,只要将规则配置到 generatorConfig.xml 文件就行,配置内容主要为: 1. 如何连接到数据库 2. 生成什么对象,以及如何生成它们 3. 哪些表将用于对象生成 下面先给一个简单版的,后面再具体讲解这些参数的意义: ```xml
**flat**:一个表生成一个实体类;
**conditional**:和 hierarchical 差不多,区别在于如果表只有一个主键,不会单独去生成一个主键类;
**hierarchical**:除了生成基本类,如果表中包含主键或 BLOB 列,都会单独再生成一个主键类或BLOB类
**默认为 conditional**,如果 targetRuntime 为 "MyBatis3Simple"、"MyBatis3DynamicSql"或"MyBatis3Kotlin",则该属性忽略 | | **targetRuntime** | 用于指定生成代码的风格。默认为 MyBatis3DynamicSql | | introspectedColumnImpl | 指定`org.mybatis.generator.api.IntrospectedColumn`实现类。该类可以看成是某一列的所有信息 | ### 子节点 ` `包含以下子节点: - `` (0..N) - `` (0..N) - `` (0 or 1) - `/` (1 Required) - `` (0 or 1) - `` (1 Required) - `` (0 or 1) - `` (0 or 1) - `
`new Employee().withAddress("北京").withDeleted(false).withName("zzs001");` | | **org.mybatis.generator.plugins.MapperAnnotationPlugin** | 用于在 Mapper 接口中添加`@Mapper`接口 | | org.mybatis.generator.plugins.MapperConfigPlugin | 用于生成 Mybatis 的主配置文件 MapperConfig | | org.mybatis.generator.plugins.RenameExampleClassPlugin | 用于重命名 Example 类 | | org.mybatis.generator.plugins.RowBoundsPlugin | 用于在 Mapper 接口的 selectByExample 方法参数中加入 RowBounds 参数,用于支持分页 | | org.mybatis.generator.plugins.VirtualPrimaryKeyPlugin | 用于指定表的主键 | 插件的配置方式非常简单,如下: ```xml ``` 运行 Java 程序,可以看到实体类中生成类 toString 、hashCode 和 equals 方法。 以上,基本讲完 MBG 的使用方法,涉及到的内容可以满足实际使用需求。 # MyBatis3DynamicSql 风格 API 的使用 在研究 MBG 之前,其实我并没有听说过 MyBatis3DynamicSql 风格,因为项目里一直使用的是 Mybatis3Simple,网上也很少人提起。 Mybatis3Simple 可以生成简单的 CRUD,但是针对高级条件查询就无能为力了,实际项目中,我们有时必须手动地去编写高级查询的代码,当然,我们也可以自定义代码生成器来生成,但是这也只能针对单表,涉及到多表时,就不尽人意了。 MyBatis3DynamicSql 风格丢弃了 XML 文件,使用全注解形式并搭配几个条件辅助类,刚接触时,我还是比较抗拒,因为前面**MyBatis3 中也尝试过全注解和条件类,当遇到某些复杂场景时,还是需要 XML,而且生成器提供的条件类会渗透到服务层**。 直到开始使用 MyBatis3DynamicSql,我才发现它的强大。它可以做到: 1. **单表高级查询**。包括 Equal/NotEqual、Like/NotLike、In/NotIn、Between/NotBetween、IsNull/IsNotNull 等等,而且还可以判空设置条件。 2. **联表查询**。你可以像给单表一样给关联表设置条件。 3. **分组、排序、分页**。 4. **只返回你要的字段**。 下面这个例子,涉及到了关联查询、排序、分页,而 MyBatis3DynamicSql 都能帮我们处理,并且**它利用 Lambda表达式来解耦条件类**。 ```java @Test public void testSelect() { // 注意,当查询结果多于1时会报错 List lsit = baseMapper.select(c -> c.leftJoin(DepartmentDynamicSqlSupport.department) .on(departmentId, new EqualTo(DepartmentDynamicSqlSupport.id)) .where(name, isLikeWhenPresent("zzs%"), or(name, isLikeWhenPresent("zzf%"))) .and(status, isEqualTo((byte)1)) .and(address, isIn("北京", "广东")) .and(DepartmentDynamicSqlSupport.name, isEqualToWhenPresent("质控部")) .orderBy(gmtCreate.descending()) .limit(3) .offset(1) ); lsit.forEach(System.err::println); } ``` 我相信,MyBatis3DynamicSql 风格会被更多开发者使用,这里就不长篇大论的讲解如何使用它,因为它的 API 并不难操作。感兴趣的朋友可以移步到项目源码阅读:[测试例子](https://github.com/ZhangZiSheng001/mybatis-projects/tree/master/mybatis-generator/src/test/java/cn/zzs/mybatis/mapper) # 参考资料 [MyBatis Generator官方文档](http://mybatis.org/generator/index.html) > 相关源码请移步:[mybatis--generator](https://github.com/ZhangZiSheng001/mybatis-projects/tree/master/mybatis-generator) > 本文为原创文章,转载请附上原文出处链接:[https://www.cnblogs.com/ZhangZiSheng001/p/12820344.html](https://www.cnblogs.com/ZhangZiSheng001/p/12820344.html)
相关文章推荐
- Spring Boot中使用MyBatis注解配置详解
- lombok系列2:lombok注解详解
- mybatis注解详解
- mybatis学习笔记之mybatis注解配置详解
- mybatis注解详解
- mybatis注解详解
- 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)
- Spring Boot教程(三十九)使用MyBatis注解配置详解(2)
- mybatis 详解(三)------入门实例(基于注解)
- J2EE系列之MyBatis学习笔记(十一)-- 使用注解配置sql映射器
- MyBatis知识系列之六:使用注解实现mybatis
- 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)
- Spring Boot中使用MyBatis注解配置详解
- 深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)
- 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)
- mybatis注解详解
- mybatis注解详解
- mybatis 详解(三)------入门实例(基于注解)
- 深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)
- springboot系列十三 mybatis 注解和xml2种方式