使用 MyBatis-tk 和 pagehelper

1. 前言

spring-boot 集成 MyBatis小节 中,我们介绍了如何在 spring-boot 中集成 MyBatis,MyBatis 虽然灵活,但是对于业务开发还略显不够。tk.mapper 和 pagehelper 是国内开发者为 MyBatis 定制的两款业务增强库,tk.mapper 可以让开发者从基本的增删查改中解放,pagehelper 则提供了高度易用的分页功能。

有了它们,MyBatis 可谓是如虎添翼,本小节我们将介绍这两款库的使用。

TIPS: 提示,本小节建立在 spring-boot 集成 MyBatis小节 基础之上,如果你还没有阅读该小节,请务必阅读了解。

2. tk.mapper

2.1 简介

在 tk.mapper 项目的首页有关于它最精确的介绍。

通用 mapper 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及 example 相关的单表操作。通用 mapper 是为了解决 MyBatis 使用中 90% 的基本操作,使用它可以很方便的进行开发,可以节省开发人员大量的时间。

总结来说,tk.mapper 可以为 MyBatis 开发节省大量的时间,精简的 90% 的基本操作。

2.2 依赖

tk.mapper 的使用也十分简单,我们只需引入相应的 starter 即可。如下:

<dependency>
  <groupId>tk.mybatis</groupId>
  <artifactId>mapper-spring-boot-starter</artifactId>
  <version>2.1.5</version>
</dependency>

TIPS: 注意,引入了 mapper starter 后,虽然和 MyBatis 官方的 starter 没有冲突,但是官方的自动配置不会生效!

2.3 使用

简单地说,tk.mapper 会给普通的 mapper 做一些增强,让 mapper 具有基本的增删查改的能力。如下:

import tk.mybatis.mapper.common.BaseMapper;

@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
  @Select("SELECT * FROM imooc_user")
  List<User> getUsers();
}

UserMapper 是原有的 mapper,只需继承 tk.mapper 中的 BaseMapper 就完成的增强。

UserMapper 继承 BaseMapper 后就拥有了基础的增删查改功能,而无需写 SQL。BaseMapper 必须指定一个与 UserMapper 对应的模型类,即 User 类。

package com.imooc.mybatis.springbootmybatisexample.model;

import javax.persistence.Table;
import java.io.Serializable;

@Table(name = "imooc_user")
public class User implements Serializable {
  private Long id;
  private String username;
  private Integer age;
  private Integer score;
  // 省略 getter 和 setter 方法
}

数据表的名称为 imooc_user,这里我们通过 Table 注解来告诉 tk User 模型所对应的数据表。

mapper 增强后,我们还需要给 SpringbootMybatisExampleApplication 启动类添加上一个注解:

import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@MapperScan("com.imooc.mybatis.springbootmybatisexample.mapper")
public class SpringbootMybatisExampleApplication {
  public static void main(String[] args) {
    SpringApplication.run(SpringbootMybatisExampleApplication.class, args);
  }
}

MapperScan 是 tk 提供的一个 mapper 扫描注解,在注解中我们需要填入 mapper 所在的包路径,即 com.imooc.mybatis.springbootmybatisexample.mapper。

到此 UserMapper 增强已经完成了,我们尝试在 UserController 中使用。

@RestController
@RequestMapping("/user")
public class UserController {
  @Autowired
  private UserMapper userMapper;

  @GetMapping
  public List<User> getUsers() {
    // return userMapper.getUsers();
    return userMapper.selectAll();
  }
}

在这里,我们替换 getUsers 方法,而是使用了 selectAll 方法,selectAll 是 BaseMapper 提供的方法,也就是增强的方法,我们无需去为这个方法添加相应的 SQL,tk 会自动帮我们搭理好一切。

再次运行程序,并测试接口:

# curl 127.0.0.1:8080/user/
[{"id":1,"username":"peter","age":18,"score":100},{"id":2,"username":"pedro","age":24,"score":200},{"id":3,"username":"jerry","age":28,"score":500},{"id":4,"username":"mike","age":12,"score":300}]

我们得到了与之前一样的结果,可以看到在我们并未书写任何 SQL 的前提下, tk.mapper 自动帮我们生成了需要的 SQL 查询,这就是 tk.mapper 所带来的简化开发能力。

3. pagehelper

3.1 简介

pagehelper 是一个 方便好用的 MyBatis 分页插件,支持复杂的单表、多表分页,是目前 MyBatis 中使用最为广泛的插件之一。

3.2 依赖

和其它一样,pagehelper 也只需导入相应的启动器即可。

<dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper-spring-boot-starter</artifactId>
  <version>1.2.13</version>
</dependency>

3.3 使用

pagehelper 充分的简单易用,在 UserController 中只需添加一行代码即可。

import com.github.pagehelper.PageHelper;

@RestController
@RequestMapping("/user")
public class UserController {
  @Autowired
  private UserMapper userMapper;

  @GetMapping
  public List<User> getUsers() {
    PageHelper.startPage(1, 2);
    return userMapper.selectAll();
  }
}

PageHelper.startPage(1, 2)会自动拦截后面将要执行的 SQL,然后处理该 SQL 并添加分页参数。startPage 接收两个参数,第一个参数表示当前分页,第二个参数表示分页数目,如这里的 1,2 表示第一页且该页最多有两条记录。

运行程序,并测试接口:

# curl 127.0.0.1:8080/user/
[{"id":1,"username":"peter","age":18,"score":100},{"id":2,"username":"pedro","age":24,"score":200}]

与上面的结果相比,结果的数目只有两条,显然分页插件已经生效。

TIPS: 提示,pagehelper 的分页是从1开始的,而有些分页插件分页是从0开始的。

4. 小结

  • 有了 spring-boot 后,很多项目的开发都将变得简单,mapper 和 pagehelper 都只需添加一个依赖即可使用。

  • 本小节简单的介绍了 mapper 和 pagehelper,如果你想深入了解它们,可以阅读它们的文档:pagehelpermapper