本文主要讲述
SpringBoot
集成PageHelper
分页插件的具体步骤和分页常规用法。
项目环境:
- SpringBoot 2.0.6.RELEASE
- jdk1.8
添加依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.1</version>
<!--
使用 springboot2 整合 pagehelper-spring-boot-starter 必须排除一下依赖
因为pagehelper-spring-boot-starter也已经在pom依赖了mybatis与mybatis-spring
所以会与 mybatis-plus-boot-starter 中的 mybatis 与 mybatis-spring 发生冲突
-->
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</exclusion>
</exclusions>
</dependency>
这里有个坑,我之前直接导入的依赖是pagehelper
依赖(如下),在与mybatis-plus
集成时,虽然不报错但是分页没有成功。换成pagehelper-spring-boot-starter
依赖就可以了。但是mybatis-plus
自带的分页和pagehelper
分页也可能发生冲突。需要排除下冲突依赖。
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.4</version>
</dependency>
分页参数配置
application.yml配置
以下只配置了常用的几个参数,官方文档提供了很多参数,想要具体了解请详读官网。
# 分页配置参数
pagehelper:
# 默认值false,当值为true时,pageSize=0或者RowBounds.limit=0查询全部结果(相当于没有执行分页查询,但是返回结果仍然是Page类型)
page-size-zero: true
# 分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。也可以指定分页插件使用哪种方言。
helper-dialect: mysql
# 分页合理化参数,默认值为false。当值为true时,pageNum<=0 时会查询第一页,pageNum>pages(超过总数时),会查询最后一页。默认false时,直接根据参数进行查询。
reasonable: true
# 支持通过Mapper接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。
support-methods-arguments: true
# 为了支持 startPage(Object params) 方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值,可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值
params: count=countSql
实现分页
在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage
静态方法即可实现分页。
/**
* 用户分页列表
* @param pageNum 当前页数
* @param pageSize 每页条数
* @return 分页结果
*/
@GetMapping("/page")
public Object page(@RequestParam int pageNum,@RequestParam int pageSize){
//分页
PageHelper.startPage(pageNum, pageSize);
//紧跟着的第一个select方法会被分页
List<User> users = userService.getUserList();
//封装分页结果
PageInfo<User> pageInfos = new PageInfo<>(users);
return pageInfos;
}
返回结果:
{
"total": 8,
"list": [
{
"userId": 2,
"userName": "阿彪呢",
"userAge": 25
},
{
"userId": 3,
"userName": "阿军",
"userAge": 25
},
{
"userId": 4,
"userName": "阿龙",
"userAge": 28
},
{
"userId": 5,
"userName": "保先",
"userAge": 26
},
{
"userId": 6,
"userName": "阿静",
"userAge": 4
}
],
"pageNum": 1,
"pageSize": 5,
"size": 5,
"startRow": 1,
"endRow": 5,
"pages": 2,
"prePage": 0,
"nextPage": 2,
"isFirstPage": true,
"isLastPage": false,
"hasPreviousPage": false,
"hasNextPage": true,
"navigatePages": 8,
"navigatepageNums": [
1,
2
],
"navigateFirstPage": 1,
"navigateLastPage": 2
}
分页结果参数说明:
pageNum:当前页
pageSize:每页的数量
size:当前页的数量
startRow:当前页面第一个元素在数据库中的行号
endRow:当前页面最后一个元素在数据库中的行号
pages:总页数
prePage:上一页
nextPage:下一页
isFirstPage:是否为第一页
isLastPage:是否为最后一页
hasPreviousPage:是否有上一页
hasNextPage:是否有下一页
navigatePages:导航页码数
navigatepageNums:所有导航页号
navigateFirstPage:导航条上的第一页
navigateLastPage:导航条上的最后一页
total:总记录数
list:分页结果集
注意: 紧跟在PageHelper.startPage
方法后的第一个MyBatis 查询方法才会被进行分页。
进阶用法
实际上很多业务场景中,我们需要同时实现分页接口与对应不分页的接口。
代码如下:
doSelectPage
方法返回Page
对象,doSelectPageInfo
方法返回PageInfo
对象。省去了前文单独封装分页结果的过程。
/**
* 用户分页列表
* @param pageNum 页码
* @param pageSize 每页条数
* @return 分页结果
*/
@GetMapping("/page")
public Object page(@RequestParam int pageNum,@RequestParam int pageSize){
//jdk8 lambda用法
PageInfo<User> pageInfos = PageHelper.startPage(pageNum, pageSize).doSelectPageInfo(() -> list());
return pageInfos;
}
/**
* 用户列表
* @return 用户列表
*/
@GetMapping("/list")
public Object list(){
return userService.getUserList();
}
至此,SpringBoot集成PageHelper就完成了。
更多的用法与细节,请参考官网:PageHelper官网文档
(完)
纸上得来终觉浅,绝知此事要躬行。