Spring Boot 中的分页
2022-04-30 本文已影响0人
右耳菌
一、Pageable 分页
-
什么是Pageable分页
Pageable分页是Spring Data JPA默认提供的分页功能,直接继承JpaRepository就获得了该分页功能
分页功能 -
分页模型
分页模型
- 获取元素总数
- 获取总页数
- 获取当前页数
- 获取当前页的内容
- 是否有上一页、上一页
- 是否有下一页、下一页的内容
- 首页、尾页的内容
- 官网
- 例子
- 假设有以下数据库和类
#
# Structure for table "emp"
#
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`EMPNO` int(4) NOT NULL,
`ENAME` varchar(10) DEFAULT NULL,
`JOB` varchar(9) DEFAULT NULL,
`MGR` int(4) DEFAULT NULL,
`SAL` int(7) DEFAULT NULL,
`COMM` int(7) DEFAULT NULL,
`DEPTNO` int(2) DEFAULT NULL,
PRIMARY KEY (`EMPNO`),
KEY `DEPTNO` (`DEPTNO`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
#
# Data for table "emp"
#
/*!40000 ALTER TABLE `emp` DISABLE KEYS */;
INSERT INTO `emp` VALUES (7369,'SMITH','CLERK',7902,800,NULL,20),(7499,'ALLEN','SALESMAN',7698,1600,300,30),(7521,'WARD','SALESMAN',7698,1250,500,30),(7566,'JONES','MANAGER',7839,2975,NULL,20),(7654,'MARTIN','SALESMAN',7698,1250,1400,30),(7698,'BLAKE','MANAGER',7839,2850,NULL,30),(7782,'CLARK','MANAGER',7839,2450,NULL,10),(7788,'SCOTT','ANALYST',7566,3000,NULL,20),(7839,'KING','PRESIDENT',NULL,5000,NULL,10),(7844,'TURNER','SALESMAN',7698,1500,0,30),(7876,'ADAMS','CLERK',7788,1100,NULL,20),(7900,'JAMES','CLERK',7698,950,NULL,30),(7902,'FORD','ANALYST',7566,3000,NULL,20),(7934,'MILLER','CLERK',7782,1300,NULL,10);
/*!40000 ALTER TABLE `emp` ENABLE KEYS */;
- Emp
package cn.lazyfennec.springdatajpademo2.entity;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.util.Objects;
/**
* @Author: Neco
* @Description:
* @Date: create in 2022/4/30 21:51
*/
@Entity
public class Emp {
private int empno;
private String ename;
private String job;
private Integer mgr;
private Integer sal;
private Integer comm;
private Integer deptno;
@Id
@Column(name = "EMPNO")
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
@Basic
@Column(name = "ENAME")
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
@Basic
@Column(name = "JOB")
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
@Basic
@Column(name = "MGR")
public Integer getMgr() {
return mgr;
}
public void setMgr(Integer mgr) {
this.mgr = mgr;
}
@Basic
@Column(name = "SAL")
public Integer getSal() {
return sal;
}
public void setSal(Integer sal) {
this.sal = sal;
}
@Basic
@Column(name = "COMM")
public Integer getComm() {
return comm;
}
public void setComm(Integer comm) {
this.comm = comm;
}
@Basic
@Column(name = "DEPTNO")
public Integer getDeptno() {
return deptno;
}
public void setDeptno(Integer deptno) {
this.deptno = deptno;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Emp emp = (Emp) o;
return empno == emp.empno &&
Objects.equals(ename, emp.ename) &&
Objects.equals(job, emp.job) &&
Objects.equals(mgr, emp.mgr) &&
Objects.equals(sal, emp.sal) &&
Objects.equals(comm, emp.comm) &&
Objects.equals(deptno, emp.deptno);
}
@Override
public int hashCode() {
return Objects.hash(empno, ename, job, mgr, sal, comm, deptno);
}
@Override
public String toString() {
return "Emp{" +
"empno=" + empno +
", ename='" + ename + '\'' +
", job='" + job + '\'' +
", mgr=" + mgr +
", sal=" + sal +
", comm=" + comm +
", deptno=" + deptno +
'}';
}
}
- 创建Repository
package cn.lazyfennec.springdatajpademo2.repository;
import cn.lazyfennec.springdatajpademo2.entity.Emp;
import org.springframework.data.jpa.repository.JpaRepository;
public interface EmpRepository extends JpaRepository<Emp, Integer> {
}
- 创建EmpController
package cn.lazyfennec.springdatajpademo2.controller;
import cn.lazyfennec.springdatajpademo2.entity.Emp;
import cn.lazyfennec.springdatajpademo2.repository.EmpRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @Author: Neco
* @Description:
* @Date: create in 2022/4/30 21:57
*/
@RestController
public class EmpController {
@Resource
private EmpRepository empRepository;
@GetMapping("/emp/findAll")
public Object findAll(@RequestParam(defaultValue = "0", value = "pageNo") Integer pageNo,
@RequestParam(defaultValue = "5", value = "pageSize") Integer pageSize) {
Pageable pageable = PageRequest.of(pageNo, pageSize, Sort.Direction.DESC, "sal");
Page<Emp> pages = empRepository.findAll(pageable);
// 当前页数
System.out.println("当前页数:" + pages.getNumber());
// 总页数
System.out.println("总页数:" + pages.getTotalPages());
// 查询出来的所有数据
System.out.println("查询出来的所有数据:" + pages.getContent());
// 是否有上一页
System.out.println("是否有上一页:" + pages.hasPrevious());
// 是否有下一页
System.out.println("是否有下一页:" + pages.hasNext());
// 当前页的上一页
System.out.println("当前页的上一页:" + (pages.hasPrevious() ? pages.previousPageable().getPageNumber() : pages.getNumber()));
// 当前页的下一页
System.out.println("当前页的下一页:" + (pages.hasNext() ? pages.nextPageable().getPageNumber() : pages.getNumber()));
return pages;
}
}
- 测试访问返回结果
当前页数:0
总页数:3
查询出来的所有数据:[Emp{empno=7369, ename='SMITH', job='CLERK', mgr=7902, sal=800, comm=null, deptno=20}, Emp{empno=7499, ename='ALLEN', job='SALESMAN', mgr=7698, sal=1600, comm=300, deptno=30}, Emp{empno=7521, ename='WARD', job='SALESMAN', mgr=7698, sal=1250, comm=500, deptno=30}, Emp{empno=7566, ename='JONES', job='MANAGER', mgr=7839, sal=2975, comm=null, deptno=20}, Emp{empno=7654, ename='MARTIN', job='SALESMAN', mgr=7698, sal=1250, comm=1400, deptno=30}]
是否有上一页:false
是否有下一页:true
当前页的上一页:0
当前页的下一页:1
测试访问返回结果
二、PageHelper 分页
-
MyBatis 分页插件 PageHelper
image.png
- 参考网址
- 例子 集成到SpringBoot项目
- 参考网址 https://github.com/abel533/MyBatis-Spring-Boot
- pom.xml 引入依赖
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!--pagehelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
- application.properties 配置 PageHelper
#pagehelper
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
- 使用例子
- 例子1
//获取第1页,10条内容,默认查询总数count PageHelper.startPage(1, 10); //紧跟着的第一个select方法会被分页 List<User> list = userMapper.selectIf(1); assertEquals(2, list.get(0).getId()); assertEquals(10, list.size()); //分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E> assertEquals(182, ((Page) list).getTotal());
- 例子2
//request: url?pageNum=1&pageSize=10 //支持 ServletRequest,Map,POJO 对象,需要配合 params 参数 PageHelper.startPage(request); //紧跟着的第一个select方法会被分页 List<User> list = userMapper.selectIf(1); //后面的不会被分页,除非再次调用PageHelper.startPage List<User> list2 = userMapper.selectIf(null); //list1 assertEquals(2, list.get(0).getId()); assertEquals(10, list.size()); //分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>, //或者使用PageInfo类(下面的例子有介绍) assertEquals(182, ((Page) list).getTotal()); //list2 assertEquals(1, list2.get(0).getId()); assertEquals(182, list2.size());
- 例子3
//获取第1页,10条内容,默认查询总数count PageHelper.startPage(1, 10); List<User> list = userMapper.selectAll(); //用PageInfo对结果进行包装 PageInfo page = new PageInfo(list); //测试PageInfo全部属性 //PageInfo包含了非常全面的分页属性 assertEquals(1, page.getPageNum()); assertEquals(10, page.getPageSize()); assertEquals(1, page.getStartRow()); assertEquals(10, page.getEndRow()); assertEquals(183, page.getTotal()); assertEquals(19, page.getPages()); assertEquals(1, page.getFirstPage()); assertEquals(8, page.getLastPage()); assertEquals(true, page.isFirstPage()); assertEquals(false, page.isLastPage()); assertEquals(false, page.isHasPreviousPage()); assertEquals(true, page.isHasNextPage());
- PageHelper方法意义
方法 | 含义 |
---|---|
PageInfo.list | 结果集 |
PageInfo.pageNum | 当前页码 |
PageInfo.pageSize | 当前页面显示的数据条目 |
PageInfo.pages | 总页数 |
Pagelnfo.total | 数据的总条目数 |
PageInfo.prePage | 上一页 |
PageInfo.nextPage | 下一页 |
PageInfo.isFirstPage | 是否为第一页 |
PageInfo.isLastPage | 是否为最后一页 |
PageInfo.hasPreviousPage | 是否有上一页 |
PageHelper.hasNextPage | 是否有下一页 |
三、Pageable与PageHelper的区别
- Pageable
1、JPA自带的分页方式,不需要添加额外的支持及配置;
2、页数是从0开始,从size-1为止;
3、单表、简单的多表操作分页排序使用它方便快捷;
- PageHelper
1、第三方插件,需要添加对应的依赖以及进行相关配置;
2、页数是从1开始,从size为止;
3、只支持Mybatis(由于PageHelper是根据离他最近的一个sql执行,而jpa刚好是自动生成sql,所以PageHelper最好用mybaties。如果必须用就jpa的话需要引入entitymanager+Query查询)
4、复杂的查询使用PageHelper可以让你更加方便;
更多知识,请点击关注查看我的主页信息哦~