SpringBoot实现分页的三种方式

一 自己封装Page对象实现

博客链接

二 使用sql实现分页

2.1 场景分析

  • 前段传递给给后台什么参数?
    • 当前页码currentPage
    • 每页显示条数pageSize
  • 后台给前端返回什么数据?
    • 当前页数据List
    • 总记录数totalCount

2.2 前段代码

html 复制代码
<template>
   <el-pagination
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      :current-page="currentPage"
      :page-sizes="[5, 10, 15, 20]"
      :page-size="5"
      layout="total, sizes, prev, pager, next, jumper"
      :total="totalCount">
    </el-pagination>
</template>
<script>
  export default {
    methods: {
      handleSizeChange(val) {
        //console.log(`每页 ${val} 条`);
        // 重新设置每页显示的条数
        this.pageSize = val;
        this.selectAll();
      },
      handleCurrentChange(val) {
        // console.log(`当前页: ${val}`);
        // 重新设置当前页码
        this.currentPage = val;
        this.selectAll();
      }
    },
    data() {
      return {
        // 当前页码
        currentPage: 1,
        // 总记录数
        totalCount: 100,
        // 每页显示条数
        pageSize: 5,
        //接收当前页数据集合
        tableData:[]
      };
    },
    methods:{
		// 分页查询
		selectAll(){
			axios({
				method:"get",
				url:'后端接口地址',
			}).then(response => {
				//设置表格数据
				this.tableData = response.data.rows;
				//设置总记录数
				this.totalCount = response.data.totalCount
			})
		}
	}
  }
</script>

2.3 后端代码

PageBean
java 复制代码
// 分页查询JavaBean
public class PageBean<T> {
    // 总记录数
    private int totalCount;
    // 当前页数据
    private List<T> rows;
    get,set...
}
mapper
java 复制代码
// 分页查询
@Select("select * from 表名 limit #{begin} , #{size}")
List<T> selectByPage(@Param("begin") int begin,@Param("size") int size);

// 查询总记录数
@Select("select count(*) from 表名")
int selectTotalCount();
service
java 复制代码
// 分页查询 currentPage:当前页码  pageSize:每页展示条数
PageBean<T> selectByPage(int currentPage,int pageSize);
impl
java 复制代码
@Override
public PageBean<T> selectByPage(int currentPage,int pageSize){
    // 计算开始索引
    int begin = (currentPage - 1) * pageSize;
    // 计算查询条目数
    int size = pageSize;
    // 查询当前页数据
    List<T> rows = mapper.selectByPage(begin,size);
    // 查询总记录数
    int totalCount = mapper.selectTotalCount();
    // 封装PageBean对象
    PageBean<T> pageBean = new PageBean<>();
    pageBean.setRows(rows);
    pageBean.setTotalCount(totalCount);

    return pageBean;
}
controller
java 复制代码
@GetMapping("/selectAll")
public AjaxResult getApproveDataRes(ImportDataGetDto importDataGetDto){
	//接收前段传递请求参数实体importDataGetDto
	int currentPage = importDataGetDto.getCurrentPage();
	int pageSize = importDataGetDto.getPageSize();
	PageBean<T> pageBean = mapper.selectByPage(currentPage,pageSize)
    return pageBean;
}

三 使用PageHelper插件

PageHelper官网

3.1 导入依赖

xml 复制代码
<dependencies>
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.2.3</version>
    </dependency>
</dependencies>

3.2 application.yml

yml 复制代码
pagehelper:
  # 设置方言,此处指定 MySQL 数据库
  helper-dialect: mysql
  # 是否启动合理化,默认是 false。
  # 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages(最大页数)会查询最后一页。
  # 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据
  reasonable: true
  # 是否支持接口参数来传递分页参数,默认false
  support-methods-arguments: true
  # 为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值
  params: count=countSql
  # 默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)
  page-size-zero: true

3.3 使用

java 复制代码
/**
* service实现类
* @param pageNumber    页码
* @param pageSize      每页显示数目
*/
public PageInfo<T> list(Integer pageNumber, Integer pageSize) { 
    // 设置分页
    PageHelper.startPage(pageNumber, pageSize);
 
    // 查询用户角色列表(需要分页的查询)
    List<T> list = userRoleService.queryList();
    PageInfo<T> pageInfo = new PageInfo<>(list);
 
    return pageInfo;
)

注意:PageHelper.startPage(页码, 每页显示数目); 这一句代码,必须放在需要分页的查询语句之前,否则会分页不生效

3.4 分页失效情况

分页设置与需要分页的查询之间存在其他查询,如下代码是一个错误示范,虽然在方法的开头设置了分页,但因为在【查询用户角色列表】之前,多查了一步【查询用户信息】,此时实际上分页针对的是【查询用户信息】进行分页,而并非对【查询用户角色列表】进行分页。

java 复制代码
public PageInfo<UserRole> list(Integer pageNumber, Integer pageSize, String userId) {
    // 设置分页
    PageHelper.startPage(pageNumber, pageSize);
 
    // 查询用户信息
    User user = userService.findById(userId);
 
    // 查询用户角色列表(需要分页的查询)
    List<UserRole> list = userRoleService.queryList();
    PageInfo<UserRole> pageInfo = new PageInfo<UserRole>(list);
 
    return pageInfo;
)

注意:startPage会寻找最近的一个查询方法执行分页

在需要分页的查询后才设置分页,如下代码是一个错误示范,在【查询用户角色列表】后才进行分页设置,因为已进行的所有数据的查询,所以此时再设置分页已无任何意义,自然会分页失效

java 复制代码
public PageInfo<UserRole> list(Integer pageNumber, Integer pageSize) {
    // 查询用户角色列表(需要分页的查询)
    List<UserRole> list = userRoleService.queryList();
 
    // 设置分页
    PageHelper.startPage(pageNumber, pageSize);
    PageInfo<UserRole> pageInfo = new PageInfo<UserRole>(list);
 
    return pageInfo;
)

3.5 返回参数说明

java 复制代码
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集重要,通过getList获取结果集
private List<T> list;

//前一页
private int prePage;
//下一页
private int nextPage;

//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
//导航条上的第一页
private int navigateFirstPage;
//导航条上的最后一页
private int navigateLastPage;

3.6 自定义返回参数

java 复制代码
//使用默认分页时
PageHelper.startPage(page, size);
List<DataBean> beans = mapper.selectByQuery(express);
return new PageInfo<>(beans);

根据上述代码可以发现,想要进行自定义分页的话,只需要重新定义一个PageInfo就可以了。保留当前页、每页数量、当前页数量、总记录数、总页数字段,其他参数全部干掉,拷贝下PageInfo,在实体目录下新建个PageBean,把PageInfo源码丢进去,删掉多余的参数就OK了

java 复制代码
public class PageBean<T> {
    private static final long serialVersionUID = 1L;
    //当前页
    private int pageNum;
    //每页的数量
    private int pageSize;
    //当前页的数量
    private int size;
    //总记录数
    private long total;
    //总页数
    private int pages;
    //结果集
    private List<T> list;
    get,set...
}

然后分页代码把PageInfo改成自己的PageBean

java 复制代码
PageHelper.startPage(page, size);
List<DataBean> beans = mapper.selectByQuery(express);
return new PageBean<>(beans);
相关推荐
aloha_78916 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
阑梦清川21 小时前
JavaEE进阶---第一个SprintBoot项目创建过程&&&我的感受
java·java-ee·springboot
A-bodgie1 天前
Spring 中的 Environment 对象
java·后端·spring·servlet·springboot
小布布的不1 天前
MyBatis 返回 Map 或 List<Map>时,时间类型数据,默认为LocalDateTime,响应给前端默认含有‘T‘字符
前端·mybatis·springboot
小沈同学呀1 天前
Mac M1 Docker创建Rocketmq集群并接入Springboot项目
macos·docker·java-rocketmq·springboot
东皋长歌2 天前
SpringBoot+ClickHouse集成
clickhouse·springboot
程序员徐师兄2 天前
基于 JavaWeb 的宠物商城系统(附源码,文档)
java·vue·springboot·宠物·宠物商城
果冻眼企鹅2 天前
常见用于从 HTTP 请求中提取数据的注解
springboot
你白勺男孩TT3 天前
Vue项目中点击按钮后浏览器屏幕变黑,再次点击恢复的解决方法
vue.js·vue·springboot
小云小白3 天前
springboot 传统应用程序,适配云原生改造
云原生·系统架构·k8s·springboot