1.概览
单表查询在业务开发中占比最大,是所有 CRUD Boy 的入门必备,所有人在 JavaBean 和 SQL 之间乐此不疲。而在我看来,该部分是最枯燥、最没有技术含量的“技能”。
1.1. 背景
公司规定,线上服务不允许使用 Join 语句,只能使用最简单的单表查询,开发人员成天在 输入参数、SQL执行、返回结果之间不停地折腾。
1.2. 目标
需要一个框架,可以灵活的定制简单的数据查询,但又不能过于灵活,需要对使用方式进行严格限制。
灵活定制,是为了快速开发,提升效率,降低bug;对使用进行限制,是为了将掌控权控制在开发,不会因为使用不当造成线上问题。因此,对框架有如下要求:
-
支持灵活的查询定义,无需手写 SQL;
-
支持常见的查询,包括过滤、排序、分页等;
-
支持扩展,应对个性化需求;
2. 快速入门
该框架依赖 MyBatis 的 selectByExample 特性。
2.1. 使用 MyBatis Generator,自动生成相关代码
首先,引入 MyBatis 相关依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
其次,在 maven 中增加 mybatis-generator-maven-plugin 插件:
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>com.itfsw</groupId>
<artifactId>mybatis-generator-plugin</artifactId>
<version>1.3.10</version>
</dependency>
</dependencies>
</plugin>
其中,mybatis-generator-plugin 提供 limit 分页支持。
新建 generatorConfig.xml,并指定LimitPlugin。
<!-- MySQL分页插件 -->
<plugin type="com.itfsw.mybatis.generator.plugins.LimitPlugin">
<!-- 通过配置startPage影响Example中的page方法开始分页的页码,默认分页从0开始 -->
<property name="startPage" value="0"/>
</plugin>
运行 generator 自动生成相关文件,包括 Mapper.xml、Mapper 接口、Entity 类 和 Example 查询类。其中,Example 类是该框架的关键。
具体操作,可参照mybatis-generator 官方文档,或 google 检索。
2.2. 添加 singlequery 支持
在 pom 中增加 singlequery 相关依赖:
<dependency>
<groupId>com.geekhalo.lego</groupId>
<artifactId>lego-starter-singlequery</artifactId>
<version>0.1.2-single_query-SNAPSHOT</version>
</dependency>
Starter 中的 MyBatisBasedSingleQueryConfiguration 将为我们完成全部配置。
2.3. 创建自己的 Repository 实现
创建 MyBatisUserSingleQueryService,继承自 AbstractReflectBasedExampleQueryRepository,具体如下:
@Repository
public class MyBatis