前言
上一篇文章中我们说了下怎么去使用《通用Mapper》来实现对单表的增删改查功能,本篇我就带你学习下,如何使用PageHelper插件来实现对单表的分页功能,至此你就不需要再自己去写一大堆的mapper.xml代码去实现单表基础的功能了(其实我们绝大部分的业务都是基于单表操作的)。
实现目标
先来看一下我们约定的分页参数和响应结果的样子。
分页请求参数:
localhost:8080/zhuma-demo/users?pageNum=1&pageSize=5&orderBy=create_time desc
响应结果:
{
"code": 1,
"msg": "成功",
"data": {
"pageNum": 1,
"pageSize": 5,
"total": 12,
"pages": 3,
"list": [
{
"id": "0c13ec7a-0309-11e8-9139-94de80fdfd41",
"nickname": "小竹马11",
"gender": "MALE",
"type": "NORMAL",
"status": "ENABLED",
"createTime": 1517019792000,
"updateTime": 1517019792000
},
{
"id": "09c70b22-0309-11e8-9139-94de80fdfd41",
"nickname": "小竹马10",
"gender": "MALE",
"type": "NORMAL",
"status": "ENABLED",
"createTime": 1517019788000,
"updateTime": 1517019788000
},
//省略
]
}
}
备注
- 参数pageNum代表当前页号,pageSize代表一页的数量。
- 参数orderBy用来控制排序(由两部分组成:第一个值要排序的字段,第二个是排序方式),其实这个跟mysql的order by语句语法是一样的。
- 返回结果中total代表记录总数,pages代表总页数。
- 返回结果中list是数据列表,当没有查询到数据时,返回[],空数组。
我们先演示了下做该分页功能后最终要实现的目标或者说效果,下面就让我们一起学习下,该怎么完成上述的分页功能吧。
说说分页
通常设计分页接口参数,常用的有两种方式用两个参数两控制分页:
- pageNum和pageSize
- offect和limit
他们的换算关系式:offect = (pageNum - 1) * pageSize; limit=pageSize,所以两种参数方式都是OK也都是很好用的,那我们今天使用的就是pageNum和pageSize这种参数形式,分别代表当前页号和一页的数量,这种参数也更方便理解。然后我们在具体讲解怎么做通用分页。
实现思路
1. 首先引入jar包(使用pageHelper插件进行分页):
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version><!--使用前请获取最新版本-->
</dependency>
如果是spring boot项目,可以直接引入:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
Page-helper插件github地址:https://github.com/pagehelper/Mybatis-PageHelper/
2. 几个核心类
- PageQO:自定义类,用于统一封装查询参数,QO译为query object
- PageVO:自定义类,用于统一封装分页响应数据,VO译为view object
- PageHelper:分页插件提供,该helper类用于做核心分页功能
- Page:分页插件提供,helper返回值,也同时存在数据库查询出来的数据列表信息
3. 以分页查看用户功能为例
我们自己定义的PageQO类(统一查询参数):
package com.zhuma.demo.comm.model.qo;
import org.hibernate.validator.constraints.Range;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor