前文说了Spring Boot集成持久层框架Mybatis的过程,和使用mybatis进行对数据库进行CRUD的操作,然而当对多数据进行查询时就需要进行分页了,分页技术分为客户端分页和服务器端分页(数据库分页),客户端分页是前端的数据插件对返回的数据集进行分页(bootstrup table、qui table等),客户端分页会对数据库和客户端都造成一定的性能压力,所以一般都是进行服务器分页。今天我们在Spring Boot 中集成比较好用的分页插件pagehelper,很简单的就实现了数据页。
注意:pagehelper是需要配合着Mybatis的拦截器实现的
pagehelper分页插件简介
使用pagehelper插件可以很好的结合MyBatis进行分页查询,该分页插件支持任何复杂的单表、多表分页。目前支持如下数据库:
Oracle
Mysql
MariaDB
SQLite
Hsqldb
PostgreSQL
DB2
SqlServer(2005,2008)
Informix
H2
SqlServer2012
Derby
该插件是github上的开源项目,感兴趣的可以去看源码,该项目的github地址是:
https://github.com/pagehelper/Mybatis-PageHelper
https://github.com/pagehelper/pagehelper-spring-boot
引入pagehelper分页插件的依赖
使用该插件在pom文件引入依赖即可:
1 2 3 4 5
| <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.6</version> </dependency>
|
springboot中推荐使用启动器依赖
1 2 3 4 5
| <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version> </dependency>_
|
在mybaits配置对改插件的拦截器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
@Configuration public class MybatisConfig {
@Bean public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean(); sqlSessionFactory.setDataSource(dataSource()); sqlSessionFactory.setFailFast(true); PageHelper pageHelper = new PageHelper(); Properties properties = new Properties(); properties.setProperty("dialect", "mysql"); properties.setProperty("offsetAsPageNum", "true"); properties.setProperty("rowBoundsWithCount", "true"); properties.setProperty("pageSizeZero", "true"); properties.setProperty("reasonable", "true"); pageHelper.setProperties(properties); sqlSessionFactory.setPlugins(new Interceptor[]{pageHelper}); return sqlSessionFactory.getObject(); }
@Bean public DataSourceTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); }
@PostConstruct public void postConstruct() { } }
|
以上就实现了该插件了mybatis的集成(使用了mybatis的拦截器)
插件的使用方式
PageHelper只对紧跟着的第一个SQL语句起作用
统计总数
将SQL语句变为 select count(0) from xxx,只对简单SQL语句其效果,复杂SQL语句需要自己写
1 2
| Page<?> page = PageHelper.startPage(1,-1); long count = page.getTotal();
|
分页操作
A、只分页不统计(每次只执行分页语句)
1 2 3
| PageHelper.startPage(pageNum,pageSize);
List<?> pagelist = queryForList( xxx.class, "queryAll" , param);
|
B、分页并统计(每次执行2条语句,一条select count语句,一条分页语句)适用于查询分页时数据发生变动,需要将实时的变动信息反映到分页结果上
1 2 3 4
| Page<?> page = PageHelper.startPage(pageNum,pageSize,iscount);
List<?> pagelist = queryForList( xxx.class , "queryAll" , param); long count = page.getTotal();
|
使用PageHelper查全部(不分页)
1 2
| PageHelper.startPage(1,0); List<?> alllist = queryForList( xxx.class , "queryAll" , param);
|
PageHelper的其他API
1 2 3 4 5 6
| String orderBy = PageHelper.getOrderBy(); Page<?> page = PageHelper.startPage(Object params); Page<?> page = PageHelper.startPage(int pageNum, int pageSize); Page<?> page = PageHelper.startPage(int pageNum, int pageSize, boolean isCount); Page<?> page = PageHelper.startPage(pageNum, pageSize, orderBy); Page<?> page = PageHelper.startPage(pageNum, pageSize, isCount, isReasonable);
|
默认值
1 2 3 4 5 6 7 8 9 10
| private boolean offsetAsPageNum = false;
private boolean rowBoundsWithCount = false;
private boolean pageSizeZero = false;
private boolean reasonable = false;
private boolean supportMethodsArguments = false;
|
需要注意的问题
在使用该插件的时候不要使用最新的,本文使用的是4.1.6的版本,高版本在和mybaits的拦截器集成式会有问题。
注意:最新版本的已经不需要复杂的配置,只需要引入依赖包,然后直接使用即可,详情可见官网文档:https://pagehelper.github.io/
使用实例

这是最简单的应用,在查询日志列表的前面写上:
Page pager =PageHelper.startPage(page, limit);
传入page当前页,和limit每页数量即可自动分页,无需其他额外的配置,使用方便