Java右耳菌-邓小白的Java架构师的修炼之路

Spring Boot 中的分页

2022-04-30  本文已影响0人  右耳菌

一、Pageable 分页

  1. 什么是Pageable分页
    Pageable分页是Spring Data JPA默认提供的分页功能,直接继承JpaRepository就获得了该分页功能


    分页功能
  2. 分页模型


    分页模型
  • 获取元素总数
  • 获取总页数
  • 获取当前页数
  • 获取当前页的内容
  • 是否有上一页、上一页
  • 是否有下一页、下一页的内容
  • 首页、尾页的内容
  1. 官网
  1. 例子
数据库表
#
# 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 */;

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 +
                '}';
    }
}
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> {

}
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 分页

  1. MyBatis 分页插件 PageHelper


    image.png
  1. 例子 集成到SpringBoot项目
<!--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>
#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());
方法 含义
PageInfo.list 结果集
PageInfo.pageNum 当前页码
PageInfo.pageSize 当前页面显示的数据条目
PageInfo.pages 总页数
Pagelnfo.total 数据的总条目数
PageInfo.prePage 上一页
PageInfo.nextPage 下一页
PageInfo.isFirstPage 是否为第一页
PageInfo.isLastPage 是否为最后一页
PageInfo.hasPreviousPage 是否有上一页
PageHelper.hasNextPage 是否有下一页

三、Pageable与PageHelper的区别

1、JPA自带的分页方式,不需要添加额外的支持及配置;
2、页数是从0开始,从size-1为止;
3、单表、简单的多表操作分页排序使用它方便快捷;

1、第三方插件,需要添加对应的依赖以及进行相关配置;
2、页数是从1开始,从size为止;
3、只支持Mybatis(由于PageHelper是根据离他最近的一个sql执行,而jpa刚好是自动生成sql,所以PageHelper最好用mybaties。如果必须用就jpa的话需要引入entitymanager+Query查询)
4、复杂的查询使用PageHelper可以让你更加方便;


更多知识,请点击关注查看我的主页信息哦~

上一篇 下一篇

猜你喜欢

热点阅读