一、开发痛点
实际开发中,95%以上的实时查询场景均为单表查询(数据库往往是瓶颈,连表查询一旦SQL写的烂可能带来高耗时甚至打崩数据库),那单表查询每次我们都得去写个Mapper接口,再写个XML(SQL还可能写错)等等,虽然不难但是这并不优雅,是在做重复工作。
那能不能省去这些事,提供一个接口给我,我查什么东西实现这个接口逻辑就行了。还真有,MyBatis Generator解决了这个问题。
二、MyBatis Generator介绍
MyBatis Generator (MBG) 是一个为 MyBatis 生成代码的工具。它可以为所有版本的 MyBatis 生成代码。MBG 对大量简单的数据库操作(如单表CRUD)有极大的帮助。但是对于联接查询或存储过程,还是需要手动编写 SQL 和对象。
1、官方文档
MyBatis Generator官方文档
MyBatis Generator源码仓库
三、SDK接入文档
Java SDK
1、引入Maven插件
xml
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.2</version>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
</plugin>
configurationFile:配置文件的相对路径
2、编写配置文件
配置文件定义了数据库连接信息、目标文件生成路径等,配置详解见下文
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//MyBatis Generator//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="MySQL" targetRuntime="MyBatis3">
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/my_database"
userId="root"
password="password">
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>
<table tableName="user" domainObjectName="User">
<generatedKey column="id" sqlStatement="MySQL" identity="true"/>
</table>
</context>
</generatorConfiguration>
2.1 配置参数详解
- generatorConfiguration:这是 MBG 配置文件的根元素
- context:定义了生成代码所需的数据库连接、目标路径以及生成策略。 id: context 的唯一标识。 targetRuntime: 指定要生成的目标代码类型(默认MyBatis3)
- jdbcConnection:配置项用于设置数据库连接信息
- javaModelGenerator:用于指定生成的 Java实体类(即Pojo)的存放目录和包名 targetPackage: 生成的 Java 模型类的包名。 targetProject: 生成的 Java 文件存放的路径。 enableSubPackages: 是否启用子包(设置为 true 会按实体类的不同层级生成子包)
- sqlMapGenerator:配置生成的 MyBatis的XML映射文件目录和包名 targetPackage: 生成的 SQL 映射文件的包名 targetProject: 生成的 SQL 映射文件存放的路径 enableSubPackages: 是否启用子包
- javaClientGenerator:生成 Mapper 接口类的目录和包名 type: 指定生成客户端的类型(XMLMAPPER表示生成XML映射器接口) targetPackage: 生成的 Java 客户端接口的包名 targetProject: 生成的 Java 客户端接口的存放路径
- table:定义数据库表 tableName: 要反向生成代码的数据库表名 domainObjectName: 生成的 Java 实体类的类名(通常是表名的驼峰命名) enableCountByExample: 是否启用生成 countByExample 方法 enableUpdateByExample: 是否启用生成 updateByExample 方法 columnOverride: 用于自定义表中某列的 Java 类型 eneratedKey:配置主键的生成策略,通常用于自增字段
- commentGenerator: suppressAllComments: 是否抑制所有注释。 addRemarkComments: 是否在生成的代码中添加数据库表字段的备注。
- enableXXX:用于后面生成Mapper的XXXByExample方法 详情参考:mybatis.org/generator/c...
3、运行插件
双击运行即可生成XML、Mapper、Pojo等文件
4、MBG生成的文件有哪些?(针对MyBatis3 or MyBatis3Simple)
我们刚刚的配置可以知道的有实体类、Mapper类和XML。但其实还会生成一个类,就是XXXExample类,这个类的作用是动态拼接SQL,官网描述如下:
4.1 实体类
实体类会生成四种: 1️⃣Primary Key Class:如果你的表是联合主键(即>2),才会生成该类。 2️⃣Record Class:这个是我们比较熟悉的,就是表字段对应的实体类。 3️⃣Record With BLOBs Class:如果你字段有Blob类型,会生成该类。 4️⃣Example Class:即模版类,用于动态拼SQL。
4.2 XML文件
这个比较常规,此处不详细解释,参考官网即可。
4.3 Mapper类
这个也很常规,会根据我们配置文件中配置的XXXByExample来生成对应的Mapper,对应的方法参考下图:
5、动态编写SQL执行
通过我们上述所说的Example Class,我们可以很容易的编写出Where语句。
5.1 Example Class简单介绍
- Example类中有一个静态类
Criterion
,这个类继承了BaseCriteria
,这个类有一个List<Criterion>
属性,这个集合就定义了where的各种条件。 - 那就很简单了,我们只需要去定义
Criterion
即可,然后往集合里塞Criterion。 - Example类提供了两个方法来创建
Criterion
,分别是createCriteria()
和or()
,区别在于前者只能定义一个条件或者只写and语句,而后者可以定义多个条件并用or语句连接。 - 官方强烈推荐 我们用
or()
来创建条件,因为or()
涵盖了createCriteria()
的使用。
建议大家边看源码,边看这个介绍,效果更好
5.2 代码示例
java
// Exmaple动态构造where条件
TestTableExample example = new TestTableExample();
example.or()
.andField1EqualTo(5)
.andField2IsNull();
example.or()
.andField3NotEqualTo(9)
.andField4IsNotNull();
List<Integer> field5Values = new ArrayList<Integer>();
field5Values.add(8);
field5Values.add(11);
field5Values.add(14);
field5Values.add(22);
example.or()
.andField5In(field5Values);
example.or()
.andField6Between(3, 7);
// 上面的代码在执行中会被转为下面的where语句:
where (field1 = 5 and field2 is null)
or (field3 <> 9 and field4 is not null)
or (field5 in (8, 11, 14, 22))
or (field6 between 3 and 7)
四、总结
相信通过这篇文章,大家对MyBatis Generator
竖起了大拇指,MBG大幅简化了我们的开发工作量,让我们优雅的完成SQL编写。
如果大家还有其他疑问欢迎再评论区留言。
五、杂谈
还是那句话,看来看去不如自己动手去写一写,实践太重要了。 我是程序员麦克,感谢你的支持,会持续分享开发干货!