现在需要实现一个分页查询的功能,从前端接受参数页码 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; }
|
分页查询
利用LIMIT限定查询结果的起始行,以及总行数,用法:
1 2
| SELECT * FROM emp LIMIT 4, 3; // 其中4表示从第5行开始,3表示一共查询3行,即5、6、7行记录
|
于是通过JDBC操作按照从前端得到的分页条件 pageNum
和 pageSize
执行如下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 :
特点:
- 静态方法,传递两个参数(当前页码,每页查询条数)
- 使用pageHelper 分页的时候,不再关注分页语句,查询全部的语句
- 自动的对PageHelper.startPage 方法下的第一个sql 查询进行分页
1 2 3
| PageHelper.startPage(1,5);
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;
public static <T> CommonPage<T> restPage(List<T> list) { CommonPage<T> result = new CommonPage<T>(); 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; } }
|
示例代码:
Service层代码
1 2 3 4 5 6
| public List<Employee> listBrand(int pageNum, int pageSize) { 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); return CommonPage.restPage(empList); }
|