1.介绍

mysql-mybatis-pagination是一个基于MySQL方言 “SQL_CALC_FOUND_ROWS & FOUND_ROWS()” 的轻量级分页组件。
项目github地址:mysql-mybatis-pagination

2.使用方法

  1. 追加Maven依赖。依赖加载后,对于SpringBoot项目,启动时会自动装配组件,无需其他配置。
    1
    2
    3
    4
    5
    <dependency>
    <groupId>io.github.flashvayne</groupId>
    <artifactId>mysql-mybatis-pagination</artifactId>
    <version>1.0.1</version>
    </dependency>
  2. 代码中
    使用Page.start(pageNum,pageSize)声明开始分页,接下来的查询将会自动分页;
    使用Page.end(users)结束分页并将查询结果包装成PageInfo对象。
    1
    2
    3
    4
    Page.start(pageNum,pageSize);
    List<User> users = userMapper.select();
    PageInfo pageInfo = Page.end(users);
    logger.info("pageInfo: {}", pageInfo);
  • PageInfo定义如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Data
    public class PageInfo {
    //页码
    private int page;

    //每页记录数
    private int size;

    //总记录数
    private Long total;

    //当页列表
    private Object list;
    }

3.Demo示例

rbac-demo项目中使用mysql-mybatis-pagination组件分页查询学生信息,可参考使用。

1
2
3
4
5
6
7
8
9
// DemoController:
@RbacAuthorization
@GetMapping("/student/list")
public ResponseModel studentList(@RequestParam Integer pageNum, @RequestParam Integer pageSize,
String name, Integer age) {
//开始分页
Page.start(pageNum, pageSize);
return ResponseModel.success(demoService.listStudent(name, age));
}
1
2
3
4
5
6
// DemoServiceImpl:
@Override
public PageInfo studentList(String name, Integer age) {
//返回分页后的查询结果
return Page.end(demoMapper.selectStudent(name,age));
}

4.注意事项:

  1. Page.start()的声明在整个线程内均有效。
    因此在Controller中调用Page.start(),然后在Service中调用Page.end()生成PageInfo也是可以的。

  2. 分页从Page.start()开始,到Page.end()结束,只在二者之间有效。
    Page.end()执行后的查询不会再次分页,除非再次调用Page.start()开始新的分页流程。

  3. 被分页的查询,如需排序可直接在原SQL语句末使用order by即可。

    1
    2
    3
    4
    5
    6
    7
    8
    select id,name,age from student
    <where>
    <if test="name != null and name != ''">
    and name like concat('%',#{name},'%')
    </if>
    </where>
    <!--按照年龄排序-->
    order by age

5.对比及优势

  • 其他常用的分页组件有MybatisPageHelper等,分页原理为先执行原SQL+limit语句,再执行select count(*) from xxx where xxx语句。一共执行了两次,进行了两次数据的筛选和过滤。
  • 本组件则直接使用MySQL方言 “SQL_CALC_FOUND_ROWS & FOUND_ROWS()” ,只需进行一次数据的筛选和过滤。
    (FOUND_ROWS()函数用于统计limit之前查找到的行数)
  • 因此,对于执行的SQL语句,若对数据的筛选过滤占用了大部分的时间,那么本组件的性能会明显高于MybatisPageHelper等组件。经实测,部分场景下,可缩短一半的执行时间。