SpringBoot实现分页的三种方式

这篇具有很好参考价值的文章主要介绍了SpringBoot实现分页的三种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 自己封装Page对象实现

博客链接

二 使用sql实现分页

2.1 场景分析
  • 前段传递给给后台什么参数?
    • 当前页码currentPage
    • 每页显示条数pageSize
  • 后台给前端返回什么数据?
    • 当前页数据List
    • 总记录数totalCount
2.2 前段代码
<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
// 分页查询JavaBean
public class PageBean<T> {
    // 总记录数
    private int totalCount;
    // 当前页数据
    private List<T> rows;
    get,set...
}
mapper
// 分页查询
@Select("select * from 表名 limit #{begin} , #{size}")
List<T> selectByPage(@Param("begin") int begin,@Param("size") int size);

// 查询总记录数
@Select("select count(*) from 表名")
int selectTotalCount();
service
// 分页查询 currentPage:当前页码  pageSize:每页展示条数
PageBean<T> selectByPage(int currentPage,int pageSize);
impl
@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
@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 导入依赖
<dependencies>
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.2.3</version>
    </dependency>
</dependencies>
3.2 application.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 使用
/**
* 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 分页失效情况

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

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会寻找最近的一个查询方法执行分页

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

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 返回参数说明
//当前页
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 自定义返回参数
//使用默认分页时
PageHelper.startPage(page, size);
List<DataBean> beans = mapper.selectByQuery(express);
return new PageInfo<>(beans);

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

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

PageHelper.startPage(page, size);
List<DataBean> beans = mapper.selectByQuery(express);
return new PageBean<>(beans);

四 使用PagedListHolder类

PagedListHolderSpring Framework中的一个分页辅助类,用于对列表进行分页显示和管理。它可以将一个列表对象进行分页处理,并提供了一些方法,用于管理分页的相关信息。使用PagedListHolder可以方便地对列表进行分页处理,包括获取当前页的数据、切换到下一页或上一页、设置每页显示的记录数等操作。它还提供了一些其他的方法,如获取总页数、获取当前页码等。

代码演示
前端(ElmentUI分页组件)
<template>
   <el-pagination
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      :current-page="currentPage"
      :page-sizes="[5, 10, 15, 20]"
      :page-size="pageSize"
      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: 0,
        // 每页显示条数
        pageSize: 5,
        //接收当前页数据集合
        tableData:[]
      };
    },
    methods:{
    	 /*
    分页查询
    */
    handleSizeChange(val) {
        console.log(`每页 ${val}`);
        // 重新设置每页显示的条数
        this.pageSize = val;
        this.selectAll();
      	},
	    handleCurrentChange(val) {
	       console.log(`当前页: ${val}`);
	      // 重新设置当前页码
	      this.currentPage = val;
	      this.selectAll();
	    },
		// 分页查询
		selectAll(){
			axios({
				method:"get",
				url:'后端接口地址',
			}).then(response => {
				//设置表格数据
				this.tableData = response.data.rows;
				//设置总记录数
				this.totalCount = response.data.total
			})
		}
	}
  }
</script>
后端

dto实体

@Data
public class ApproveGetDto {
    ...
    // 当前页码
    private Integer currentPage;
    // 每页展示条数
    private Integer pageSize;
}

vo实体

@Data
public class ApproveGetRes<T> {
	...
    //分页查询:总记录数
    private Long total;
    //分页查询:当前页数据
    private T rows;
}

controller

 @GetMapping("/getApproveDataRes")
 public AjaxResult getApproveDataRes(ApproveGetDto approveGetDto ){
 	 // 通过前端传递参数调用service获取数据
     List<ApproveGetRes> approveGetRes= lsjsService.getApproveDataRes(approveGetDto);
     // 设置要进行分页处理的数据源
     PagedListHolder<ApproveGetRes> plh = new PagedListHolder<>(approveGetRes);
     // 设置每页显示的记录数
     plh.setPageSize(approveGetDto.getPageSize());
     // 设置当前显示的页码,0代表第一页
     plh.setPage(approveGetDto.getCurrentPage()-1);
     // 创建vo对象
     ApproveGetRes dataRes = new ApproveGetRes();
     // 设置vo对象的总条数
     dataRes.setTotal(Long.valueOf(approveDataRes.size()));
     // plh.getPageList():获取当前页的数据列表
     dataRes.setRows(plh.getPageList());
     return AjaxResult.success("返回成功", dataRes);
 }

方法解释文章来源地址https://www.toymoban.com/news/detail-688378.html

// 1. 设置要进行分页处理的源列表
List<ApproveGetRes> approveGetRes= lsjsService.getApproveDataRes(approveGetDto);
PagedListHolder<ApproveGetRes> pagedListHolder = new PagedListHolder<>(approveGetRes);
// 2. 设置每页显示的记录数
pagedListHolder.setPageSize(2);
// 3. 设置当前显示的页码
pagedListHolder.setPage(0);
// 4. 获取当前页的数据列表
List<String> currentPageData = pagedListHolder.getPageList();
// 5. 切换到下一页
pagedListHolder.nextPage();
// 6. 切换到上一页
pagedListHolder.previousPage();
// 7. 获取总页数
int totalPages = pagedListHolder.getPageCount();
// 8. 获取当前页码
int currentPage = pagedListHolder.getPage();
// 9. 判断当前页是否为第一页
boolean isFirstPage = pagedListHolder.isFirstPage();
// 10. 判断当前页是否为最后一页
boolean isLastPage = pagedListHolder.isLastPage();

到了这里,关于SpringBoot实现分页的三种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • SpringBoot获取Request请求的三种方式

    Request对象包含了请求的各种信息,比如请求方法、请求URL、请求参数、请求内容等等,这些信息可以供服务器进行处理和响应。那么在SpringBoot中,怎么才能获取到Request对象? 本文将介绍三种方法,并提示例参考。 一、直接在Controller方法参数上注入HttpServletRequest 这是最常用

    2024年02月04日
    浏览(11)
  • Springboot中使用线程池的三种方式

    前言 多线程是每个程序员的噩梦,用得好可以提升效率很爽,用得不好就是埋汰的火葬场。 这里不深入介绍,主要是讲解一些标准用法,熟读唐诗三百首,不会作诗也会吟。 这里就介绍一下springboot中的多线程的使用,使用线程连接池去异步执行业务方法。 由于代码中包含详

    2024年02月08日
    浏览(13)
  • SpringBoot获取HttpServletRequest、HttpServletResponse的三种方式

    SpringBoot获取HttpServletRequest、HttpServletResponse的三种方式

    仅仅适用在controller方法上。当Spring接收到HTTP请求时,会寻找一个合适的方法来处理该请求。如果该方法参数上标注了@RequestMapping或@Get、@Post等注解,Spring就会将HttpServletRequest对象注入到该参数中。 适用于所有的bean 通过调试可以看到,注入的Reques是一个代理类,而这个被代

    2024年02月19日
    浏览(9)
  • SpringBoot导出Word文档的三种方式

    SpringBoot导出Word文档的三种方式

    1、直接在Java代码里创建Word文档,设置格式样式等,然后导出。(略) 需要的见:https://blog.csdn.net/qq_42682745/article/details/120867432 2、富文本转换后的HTML下载为Word文档。相当于把HTML转为Word导出 3、使用模板技术导出。固定格式、可以写入不同数据 其他: springboot版本:2.7.11 导

    2024年02月02日
    浏览(9)
  • SpringBoot+MyBatis批量插入数据的三种方式

    最近导入表格数据时需要同时插入修改大量数据,研究了一下有三种实现方式 1、用for循环调用sql插入数据 这种方式插入大量数据时,效率非常底下,不推荐 2、利用mybatis的foreach来实现循环插入 这种方式插入大量数据时,好处是不用频繁访问数据库,一条sql搞定,效率比较

    2024年02月16日
    浏览(8)
  • idea社区版本创建springboot项目的三种方式

      文章目录 一、前言 一、方式1:spring 官方创建 springboot项目 1、打开在线的 spring initializr 2、选择项目的语言、版本、依赖等 3、 解压源码包,并使用IDEA打开 4、测试接口 二、方式2:社区idea安装Spring插件 1、添加插件 三、方式3:(麻烦)手动maven 创建springboot项目 一、前言

    2023年04月09日
    浏览(13)
  • Springboot接入OpenAi/Chat GPT的三种方式

    由于现在网上的相关教程并不多外加没有使用代理的demo,所以抛砖引玉,写了三种调用方式,分别是直接访问、非官方SDK访问、官方开源的SDK访问 1、导入pom文件(2023.3.30最新版本) 2、入参 这里的TalkDto 还可以入参maxToken,用于返回最大量的数据,官方计算token大小的方式:

    2023年04月19日
    浏览(10)
  • 【SpringBoot】读取application.yml配置中的三种方式

    applicaiton.yml BootValueApplicationTests.java 打印如下所示 注意的地方 当对应的值不存在时,系统会报错。我们可以给定一个默认值即可。 如下所示: 在这里,sys.noValue这个值是不存在的,我们可以给定一个默认值为123,当然,我们如果不指定默认值的,它的默认值为空字符串。 优

    2024年02月13日
    浏览(8)
  • 生产项目中基于springboot项目解决循环依赖的三种方式

    在生产项目中,可以使用Spring Boot框架来快速开发Spring应用程序。Spring Boot提供了一种方便的方式来创建独立的,基于Spring的应用程序,并且有着高度的自动化配置和开箱即用的特性。 可以使用@Lazy注解来控制Bean的延迟初始化,同时可以使用AOP切面编程来解决循环依赖问题。

    2024年02月11日
    浏览(8)
  • java篇-Springboot解决跨域问题的三种方式

    第一种:添加 @CrossOrigin 注解 在Controller层对应的方法上添加@CrossOrigin或者类上添加@CrossOrigin   第二种:添加CORS过滤器 新建配置类CorsConfig,创建 CorsFilter 过滤器,允许跨域  第三种:实现 WebMvcConfigurer ,重写 addCorsMappings 方法 全局配置有可能出现跨域失败的情况,改为过滤

    2024年04月23日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包