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插件

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简单介绍
  1. Example类中有一个静态类Criterion,这个类继承了BaseCriteria,这个类有一个List<Criterion>属性,这个集合就定义了where的各种条件。
  2. 那就很简单了,我们只需要去定义Criterion即可,然后往集合里塞Criterion。
  3. Example类提供了两个方法来创建Criterion,分别是createCriteria()or(),区别在于前者只能定义一个条件或者只写and语句,而后者可以定义多个条件并用or语句连接。
  4. 官方强烈推荐 我们用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编写。

如果大家还有其他疑问欢迎再评论区留言。

五、杂谈

还是那句话,看来看去不如自己动手去写一写,实践太重要了。   我是程序员麦克,感谢你的支持,会持续分享开发干货!

相关推荐
程序猿(雷霆之王)5 小时前
MySQL——复合查询
数据库·mysql
莫陌尛.5 小时前
SSM(Spring+SpringMVC+Mybatis)整合
java·spring·mybatis
Zhsh-76 小时前
centos配置ES和MYSQL自动备份
mysql·elasticsearch·centos
2301_797604246 小时前
d41:MyBatisPlus入门,注解,配置,条件构造器,自定义SQL,IService
sql·mybatis
色空大师6 小时前
【mybatisPlus详解】
java·mybatis·mybatisplus
尘下吹霜7 小时前
【鉴权架构】SpringBoot + Sa-Token + MyBatis + MySQL + Redis 实现用户鉴权、角色管理、权限管理
spring boot·mysql·mybatis
weixin_441455267 小时前
Mysql MVCC
数据库·mysql
奥尔特星云大使8 小时前
MySQL快速构建主从(基于GTID)
数据库·mysql·主从复制
小园子的小菜8 小时前
MySQL ORDER BY 深度解析:索引排序规则与关键配置参数阈值
数据库·mysql