MySQL分页组件mysql-mybatis-pagination|Springboot|Mybatis
1.介绍
mysql-mybatis-pagination是一个基于MySQL方言 “SQL_CALC_FOUND_ROWS & FOUND_ROWS()” 的轻量级分页组件。
项目github地址:mysql-mybatis-pagination
2.使用方法
- 追加Maven依赖。依赖加载后,对于SpringBoot项目,启动时会自动装配组件,无需其他配置。
1
2
3
4
5<dependency>
<groupId>io.github.flashvayne</groupId>
<artifactId>mysql-mybatis-pagination</artifactId>
<version>1.0.1</version>
</dependency> - 代码中
使用Page.start(pageNum,pageSize)声明开始分页,接下来的查询将会自动分页;
使用Page.end(users)结束分页并将查询结果包装成PageInfo对象。1
2
3
4Page.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
public class PageInfo {
//页码
private int page;
//每页记录数
private int size;
//总记录数
private Long total;
//当页列表
private Object list;
}
3.Demo示例
rbac-demo项目中使用mysql-mybatis-pagination组件分页查询学生信息,可参考使用。
1 | // DemoController: |
1 | // DemoServiceImpl: |
4.注意事项:
Page.start()的声明在整个线程内均有效。
因此在Controller中调用Page.start(),然后在Service中调用Page.end()生成PageInfo也是可以的。分页从Page.start()开始,到Page.end()结束,只在二者之间有效。
Page.end()执行后的查询不会再次分页,除非再次调用Page.start()开始新的分页流程。被分页的查询,如需排序可直接在原SQL语句末使用order by即可。
1
2
3
4
5
6
7
8select 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等组件。经实测,部分场景下,可缩短一半的执行时间。
本分享所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Vayne的技术分享!