MyBatis Generator让你优雅的写SQL
一、开发痛点
实际开发中,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插件
<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 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方法 详情参考:https://mybatis.org/generator/configreference/table.html
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 代码示例
// 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编写。
如果大家还有其他疑问欢迎再评论区留言。
五、杂谈
还是那句话,看来看去不如自己动手去写一写,实践太重要了。对于有疑惑的地方强烈推荐官方文档!
我是程序员麦克,感谢你的支持,会持续分享开发干货!
#技术专栏##MyBatis##MySQL#