谈谈分页

宋正兵 on 2020-10-27

现在需要实现一个分页查询的功能,从前端接受参数页码 pageNum 和每页大小 pageSize

原始的分页方式

根据页面只取一页数据,然后显示这一页,需要构造sql语句。

考虑到查询完成之后返回所需数据给前端的同时,还需要告诉前端当前数据片段处在整个数据表的什么位置等信息,所以提前定义一个类 CommonPage 用以告诉前端这些信息。

CommonPage类

泛型以适应多种类型的数据集合

1
2
3
4
5
6
7
8
9
10
11
12
public class CommonPage<T> {
// 当前页码
private int PageNum;
// 每页显示的条数
private int pageSize;
// 总页数
private int totalPage;
private Long total;
// 每页显示的数据集合
private List<T> list;
// setter、getter方法省略
}

分页查询

利用LIMIT限定查询结果的起始行,以及总行数,用法:

1
2
SELECT * FROM emp LIMIT 4, 3;
// 其中4表示从第5行开始,3表示一共查询3行,即5、6、7行记录

于是通过JDBC操作按照从前端得到的分页条件 pageNumpageSize 执行如下sql代码:

1
select * from tab_route where limit ? , ?

第一个参数是起始行 start = (pageNum-1)*pageSize ,第二个参数是 pageSize

查询完成后,将查询得到的List数据封装到CommonPage实例中返回,这样就能够实现分页查询。

分页插件—pagehelper

引入依赖

整合到SpringBoot中

1
2
3
4
5
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.10</version>
</dependency>

调用方法

使用PageHelper的静态方法startPage :
特点:

  1. 静态方法,传递两个参数(当前页码,每页查询条数)
  2. 使用pageHelper 分页的时候,不再关注分页语句,查询全部的语句
  3. 自动的对PageHelper.startPage 方法下的第一个sql 查询进行分页
1
2
3
PageHelper.startPage(1,5);
//紧跟着的第一个select 方法会被分页
List<Employee> list = empMapper.selectAll();

也就是说在Service层 PageHelper.startPage(1,5); 语句后一定是紧跟查询语句。

示例代码

Service层示例代码

1
2
3
4
5
6
public PageInfo findPage(int page,int pageSize){
PageHelper.startPage(page,pageSize);
List<Employee> List= empMapper.selectAll();
PageInfo pageInfo = new PageInfo(list);
return pageInfo;
}

返回的信息就是PageInfo对象,该类是插件里的类。

迎合开发需求

如果开发中有实际需求用不到PageInfo中那么多个属性,可以对上面定义的CommonPage类进行修改,如下:

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
public class CommonPage<T> {
// 当前页码
private int PageNum;
// 每页显示的条数
private int pageSize;
// 总页数
private int totalPage;
private Long total;
// 每页显示的数据集合
private List<T> list;

/**
* 将 PageHelper分页后的list转为分页信息
*/
public static <T> CommonPage<T> restPage(List<T> list) {
CommonPage<T> result = new CommonPage<T>();
// 这一步将list截取需要的那一段
PageInfo<T> pageInfo = new PageInfo<T>(list);
result.setTotalPage(pageInfo.getPages());
result.setPageNum(pageInfo.getPageNum());
result.setPageSize(pageInfo.getPageSize());
result.setTotal(pageInfo.getTotal());
result.setList(pageInfo.getList());
return result;
}
// setter、getter方法省略
}

示例代码:

Service层代码

1
2
3
4
5
6
public List<Employee> listBrand(int pageNum, int pageSize) {
// select * from emp limit (pageNum-1)*pageSize, pageSize
// 设置分页数据,该方法之后的第一个select方法会进行分页
PageHelper.startPage(pageNum, pageSize);
return empMapper.selectAll();
}

Controller层代码

1
2
3
4
5
6
7
@RequestMapping(value = "/list", method = RequestMethod.GET)
@ResponseBody
public CommonPage<Employee> listBrand( Integer pageNum, Integer pageSize) {
List<Employee> empList = pmsBrandService.listBrand(pageNum, pageSize);
// 在restPage()方法中生成PageInfo实例,并将需要的信息填充到CommonPage类中返回
return CommonPage.restPage(empList);
}