PageHelper 分页
1 简介
在开发过程中,我们经常会遇到分页的问题,我们可以手写一个分页,也可以使用分页框架。但为何要进行分页呢?
当数据量少的时候,我们可全量数据返回给客户端即可。然而,对于企业信息系统来说数据量不会限制在一个小范围内。如果不顾一切的 Select * from 某个表,再将返回的数据一古脑的扔给客户,客户岂能忍受成千上万足够让人眼花缭乱的表格式数据。
即使客户能忍受,当数据量内容过多而超过程序能承载的内存,也会造成数据丢失。因此接下来介绍一下分页框架 PageHelper 。
2 pom.xml
<!-- 分页 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.10</version>
</dependency>
3 TbUserController
package com.pky.hello.springboot.controller;
import com.github.pagehelper.PageInfo;
import com.pky.hello.springboot.commons.domain.TbUser;
import com.pky.hello.springboot.commons.dto.AbstractBaseResult;
import com.pky.hello.springboot.commons.service.TbUserService;
import com.pky.hello.springboot.controller.base.AbstractBaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 用户控制器
*/
@RestController
@RequestMapping(value = "tb_users")
public class TbUserController extends AbstractBaseController<TbUser> {
@Autowired
TbUserService tbUserService;
/**
* 获取所有用户
* @return
*/
@GetMapping(value = "all")
public AbstractBaseResult getAllTbUsers() {
List<TbUser> tbUsers = tbUserService.getAll();
// 有数据
if(tbUsers.size() > 0) {
return success(request.getRequestURI(),1,tbUsers.size(), tbUsers);
}
// 无数据
return success(request.getRequestURI());
}
/**
* 分页获取用户信息
* @param num 当前页
* @param size 一页总条数
* @return
*/
@GetMapping(value = "page/{num}/{size}")
public AbstractBaseResult page(@PathVariable int num, @PathVariable int size) {
PageInfo<TbUser> pageInfo = tbUserService.page(num, size);
return success(request.getRequestURI(), pageInfo.getNextPage(), pageInfo.getPages(), pageInfo.getList());
}
}
4 TbUserServiceImpl
package com.pky.hello.springboot.commons.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.pky.hello.springboot.commons.domain.TbUser;
import com.pky.hello.springboot.commons.mapper.TbUserMapper;
import com.pky.hello.springboot.commons.service.TbUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
/**
* 用户业务逻辑
*/
@Service
public class TbUserServiceImpl implements TbUserService {
@Autowired
TbUserMapper tbUserMapper;
/**
* 获取全部用户
* @return
*/
@Override
public List<TbUser> getAll() {
List<TbUser> tbUsers = tbUserMapper.selectAll();
return tbUsers;
}
/**
* 分页获取用户信息
* @param pageNum 当前页数
* @param pageSize 当前数据条数
* @return
*/
@Override
public PageInfo<TbUser> page(int pageNum, int pageSize) {
// 根据 “created” 字段倒序分页
PageHelper.startPage(pageNum, pageSize, "created desc");
PageInfo<TbUser> pageInfo = new PageInfo<>(tbUserMapper.selectAll());
return pageInfo;
}
}
5 测试
浏览器输入:http://localhost:8082/v1/hello_springboot/tb_users/page/1/3 , 会出现已经分好页的 JSON 响应数据,如下为第一页,每页有 3 条数据:
{
"links": {
"self": "/v1/hello_springboot/tb_users/page/1/3",
"next": "/v1/hello_springboot/tb_users/page/1/3?page=2",
"last": "/v1/hello_springboot/tb_users/page/1/3?page=8"
},
"data": [
{
"type": "TbUser",
"id": 73,
"attributes": {
"id": 73,
"username": "pky11",
"phone": "22",
"email": "1689988@qq.com",
"created": "2019-01-02T12:06:37.000+0000",
"updated": "2019-01-02T12:06:37.000+0000"
},
"links": {
"self": "/v1/hello_springboot/tb_users/page/1/3/73"
}
},
{
"type": "TbUser",
"id": 72,
"attributes": {
"id": 72,
"username": "pkya",
"phone": "13531021568",
"email": "wer@qq.com",
"created": "2018-12-11T04:13:25.000+0000",
"updated": "2018-12-11T04:13:25.000+0000"
},
"links": {
"self": "/v1/hello_springboot/tb_users/page/1/3/72"
}
},
{
"type": "TbUser",
"id": 71,
"attributes": {
"id": 71,
"username": "pky3",
"phone": "13531021145",
"email": "dasffw@qq.com",
"created": "2018-12-11T04:09:29.000+0000",
"updated": "2018-12-11T04:09:29.000+0000"
},
"links": {
"self": "/v1/hello_springboot/tb_users/page/1/3/71"
}
}
]
}
6 PageHelper 中 PageInfo 的成员属性
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//排序
private String orderBy;
//由于startRow和endRow不常用,这里说个具体的用法
//可以在页面中"显示startRow到endRow 共size条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List<T> list;
//第一页
private int firstPage;
//前一页
private int prePage;
//下一页
private int nextPage;
//最后一页
private int lastPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;