使用 PageHelper 在 Spring Boot 项目中实现分页查询
目录
- 前言
- 1. 项目环境配置
- 1.1 添加 PageHelper 依赖
- 1.2 数据库和 MyBatis 配置
- 2. 统一的分页响应类
- 3. 使用 PageHelper 实现分页查询
- 3.1 Service 层分页查询实现
- 3.2 PageHelper 分页注意事项
- 4. 控制层调用示例
- 5. 常见问题与解决方案
- 5.1 `java.util.ArrayList cannot be cast to com.github.pagehelper.Page`
- 5.2 分页参数未生效,返回全部数据
- 结语
前言
在 Web 应用开发中,分页查询是非常常见的需求,特别是在涉及大量数据的应用场景中,通过分页可以减少数据加载压力,提升系统性能。然而,手动实现分页查询需要编写繁琐的 SQL 语句和逻辑代码,容易出现错误。为了简化分页实现,我们可以借助 PageHelper 这一优秀的分页插件,它能够无缝整合进 Spring Boot 项目,快速实现分页功能。本文将详细介绍如何在 Spring Boot 中整合 PageHelper,并通过示例演示如何进行分页查询。

1. 项目环境配置
1.1 添加 PageHelper 依赖
首先,在 Spring Boot 项目中的 pom.xml 文件中添加 PageHelper 的依赖项。本文使用 pagehelper-spring-boot-starter 作为依赖包,该依赖能够自动配置 PageHelper,减少手动配置的复杂性。以下是 Maven 依赖的示例:
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version>
</dependency>
添加依赖后,PageHelper 将会自动被 Spring Boot 扫描并加载到上下文中,无需额外配置。此处的 1.4.6 版本适用于 Spring Boot 2.0+ 版本,如果使用其他版本的 Spring Boot,确保选择兼容的 PageHelper 版本。
1.2 数据库和 MyBatis 配置
在 application.yml 中,完成数据库的基本配置,并确认已经集成了 MyBatis。以下是一个基础的数据库配置示例:
spring:datasource:url: jdbc:mysql://localhost:3306/testdbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Drivermybatis:mapper-locations: classpath:mapper/*.xml
2. 统一的分页响应类
为了方便返回分页数据并使返回结果具有一致性,可以定义一个统一的分页响应类。例如,定义一个 PageResponse<T> 类,该类包含总页数、总条数、当前页数据等信息。
public class PageResponse<T> {private long total; // 总记录数private int pages; // 总页数private List<T> data; // 当前页数据public PageResponse(long total, int pages, List<T> data) {this.total = total;this.pages = pages;this.data = data;}// Getters and Setters
}
在实际使用中,通过 PageHelper 查询得到的 PageInfo 对象中包含分页信息,可以将其数据提取并填充到 PageResponse 中,以统一格式返回。
3. 使用 PageHelper 实现分页查询
在配置好依赖和基础环境后,接下来在 Service 层中使用 PageHelper 实现分页查询。假设有一个 UserService 用于处理用户数据查询,可以按以下步骤实现分页功能。
3.1 Service 层分页查询实现
PageHelper 的分页逻辑非常简单,只需在查询方法中通过 PageHelper.startPage(pageNum, pageSize) 设置分页参数,接着调用查询方法,即可获得分页结果。以下示例展示了 UserService 的实现:
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public PageResponse<User> getUsers(int pageNum, int pageSize) {PageHelper.startPage(pageNum, pageSize); // 设置分页参数List<User> userList = userMapper.selectAll(); // 执行查询PageInfo<User> pageInfo = new PageInfo<>(userList); // 使用PageInfo包装分页结果// 使用PageResponse返回统一分页格式return new PageResponse<>(pageInfo.getTotal(), pageInfo.getPages(), pageInfo.getList());}
}
在 getUsers() 方法中,首先通过 PageHelper.startPage() 设置分页参数,随后调用 selectAll() 执行数据库查询。PageHelper 会拦截该查询并自动添加分页 SQL,返回的 userList 为分页结果,然后用 PageInfo 包装查询结果。
3.2 PageHelper 分页注意事项
- startPage 方法的调用位置:
PageHelper.startPage(pageNum, pageSize)必须在查询方法之前调用,否则分页信息将不会生效。 - 自动分页结果类型:
selectAll()返回的userList实际上是Page类型的List,Page实现了List接口,因此可以正常操作。但直接强制转换为Page可能会导致错误,正确的方式是将结果用PageInfo包装。 - 版本兼容性问题:如果使用
PageHelper版本与 Spring Boot 不兼容,可能会导致分页信息不正确。确保选择正确的版本,如PageHelper 1.4.6与Spring Boot 2.0+兼容性良好。
4. 控制层调用示例
在控制器层调用 UserService 的 getUsers() 方法,并将 PageResponse 数据返回给前端。以下是一个简单的控制层示例:
@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/page")public ResponseEntity<PageResponse<User>> getUsers(@RequestParam int pageNum, @RequestParam int pageSize) {PageResponse<User> pageResponse = userService.getUsers(pageNum, pageSize);return ResponseEntity.ok(pageResponse);}
}
通过 @GetMapping("/page") 实现分页查询接口,前端可以通过传递 pageNum 和 pageSize 参数来控制分页查询的页码和每页数量。
5. 常见问题与解决方案
5.1 java.util.ArrayList cannot be cast to com.github.pagehelper.Page
出现此异常的原因通常是因为尝试将 ArrayList 强制转换为 Page 类型。实际上,分页查询返回的 List 是 Page 的实例,但我们不应该直接进行类型转换,而是通过 PageInfo 进行包装,这样可以避免强制转换带来的问题。
5.2 分页参数未生效,返回全部数据
如果 PageHelper 无法获取正确的分页参数,导致返回所有数据,可能是以下原因之一:
- 版本兼容性问题:确保
PageHelper和Spring Boot的版本兼容。推荐PageHelper 1.4.6版本与Spring Boot 2.0+。 - 调用顺序问题:
PageHelper.startPage()必须在查询数据库之前调用,否则分页不会生效。
通过确认上述设置,基本可以解决分页参数未生效的问题。
结语
在 Spring Boot 项目中整合 PageHelper 可以大大简化分页查询的实现。本文详细介绍了 PageHelper 的配置方法、Service 层分页查询的实现步骤,以及常见问题的解决方法。通过 PageHelper,我们可以方便地对数据库数据进行分页处理,提升系统的查询效率和用户体验。希望本文内容能为大家在实际开发中带来帮助。
相关文章:
使用 PageHelper 在 Spring Boot 项目中实现分页查询
目录 前言1. 项目环境配置1.1 添加 PageHelper 依赖1.2 数据库和 MyBatis 配置 2. 统一的分页响应类3. 使用 PageHelper 实现分页查询3.1 Service 层分页查询实现3.2 PageHelper 分页注意事项 4. 控制层调用示例5. 常见问题与解决方案5.1 java.util.ArrayList cannot be cast t…...
深度学习-张量相关
一. 张量的创建 张量简介 张量是pytorch的基本数据结构 张量,英文为Tensor,是机器学习的基本构建模块,是以数字方式表示数据的形式。 例如,图像可以表示为形状为 [3, 224, 224] 的张量,这意味着 [colour_channels, h…...
电脑提示xinput1_3.dll丢失怎么解决,分享6种有效的解决方法
xinput1_3.dll 是一个动态链接库(DLL)文件,它在Windows操作系统中扮演着重要的角色,特别是在处理游戏控制器和其他输入设备的交互方面。这个文件是Microsoft DirectX软件包的一部分,DirectX是微软公司开发的一个多媒体…...
【计网】数据链路层笔记
【计网】数据链路层 数据链路层概述 数据链路层在网络体系结构中所处的地位 链路、数据链路和帧 链路(Link)是指从一个节点到相邻节点的一段物理线路(有线或无线),而中间没有任何其他的交换节点。 数据链路(Data Link)是基于链路的。当在一条链路上传送数据时&a…...
蓝牙FTP 协议详解及 Android 实现
文章目录 前言一、什么是蓝牙 FTP 协议?二、FTP 的工作流程1.蓝牙设备初始化2. 设备发现与配对3. 建立OBEX FTP 连接4. 文件传输文件上传(通过OBEX PUT命令)文件下载(通过OBEX GET命令) 5. 关闭OBEX会话 三、进阶应用与…...
【前端】Svelte:动画效果
在现代前端开发中,动画效果可以大大提升用户体验,使应用更生动、易用。Svelte 提供了灵活的动画 API,让开发者能够快速实现从简单过渡到复杂动画的各种效果。本文将系统性地介绍 Svelte 的动画功能,并通过多个示例演示如何创建动感…...
2024系统架构师--论基于架构的软件设计方法(ABSD)及应用(论文范文)
题目: 基于架构的软件设计(Architecture-Based Software Design,ABSD)方法以构成软件架构的商业、质量和功能需求等要素来驱动整个软件开发过程。ABSD是一个自顶向下,递归细化的软件开发方法,它以软件系统功能的分解为基础,通过选择架构风格实现质量和商业需求,并强调在架…...
ORU 的 Open RAN 管理平面 (M 平面)
[TOC](ORU 的 Open RAN 管理平面 (M 平面)) ORU 的 Open RAN 管理平面 (M 平面) https://www.techplayon.com/open-ran-management-plane-m-plane-for-open-radio-unit/ ORU M 平面 在 ORAN 中,设置参数的 O-RU 管理功能是通过 M-Plane 完成的。管理功能包括 O-…...
软件缺陷等级评定综述
1. 前言 正确评估软件缺陷等级,在项目的生命周期中有着重要的作用: 指导缺陷修复的优先级和资源分配 在软件开发和维护过程中,资源(包括人力、时间和资金)是有限的。通过明确缺陷的危险等级,可以帮助团队合…...
Nuxt.js 应用中的 schema:extend事件钩子详解
title: Nuxt.js 应用中的 schema:extend事件钩子详解 date: 2024/11/10 updated: 2024/11/10 author: cmdragon excerpt: schema:extend 钩子使开发者能够扩展默认数据模式,为特定业务需求添加自定义字段和验证。 categories: 前端开发tags: Nuxt钩子数据扩展自定义验证应…...
自然语言处理在客户服务中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 自然语言处理在客户服务中的应用 自然语言处理在客户服务中的应用 自然语言处理在客户服务中的应用 引言 自然语言处理概述 定义…...
OpenCoder:首个完全开源的顶级代码大模型,训练秘籍全公开!| LLM×MapReduce,无需训练就超越GPT-4!
大模型领域的发展日新月异,每天都有许多有趣的论文值得深入品读。下面是本期觉得比较有意思的论文: 1、OpenCoder:首个完全开源的顶级代码大模型,训练秘籍全公开!2、超长文本处理新突破!LLMMapReduce&…...
springboot静态资源映射不生效问题
最近有个同事问我,静态资源映射不生效的问题,很正常我想不就是配置下资源路径就可以了吗?类似配置如下代码 Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addResourceHandlers(ResourceHandlerR…...
通过 SSH 隧道将本地端口转发到远程主机
由于服务器防火墙,只开放了22端口,想要通过5901访问服务器上的远程桌面,可以通过下面的方式进行隧道转发。 一、示例命令 这条代码的作用是通过 SSH 创建一个 本地端口转发,将你本地的端口(5901)通过加密的 SSH 隧道连接到远程服务器上的端口(5901)。这种方式通常用于在…...
【北京迅为】itop-3588开发板摄像头使用手册Android12 双摄方案
本章节对应资料在网盘资料“iTOP-3588 开发板\02_【iTOP-RK3588 开发板】开发资料 \07_Android 系统开发配套资料\08_Android12 摄像头使用配套资料”目录下下载。 2.1 Android12 前摄后摄 网盘中默认的 Android12 源码支持四个摄像头单独打开,本小节我们来修改源码…...
初见Linux:基础开发工具
前言: 这篇文章我们将讲述Linux的基本开发工具,以及讨论Linux的生态圈,最后再了解vim开发工具。 Yum: YUM(Yellowdog Updater Modified)是一个在Linux系统中用于管理软件包的工具,特别是在基于…...
微服务架构面试内容整理-分布式配置管理-Nacos Config
Nacos Config 是 Nacos 提供的一个配置管理功能,专门用于动态管理应用的配置。在微服务架构中,Nacos Config 允许开发者集中管理和动态更新各个服务的配置,从而提升系统的灵活性和可维护性。以下是 Nacos Config 的主要特点、工作原理和使用场景: 主要特点 1. 动态配置管理…...
React官网生成Recat项目的区别
1. Next.js 特点: 页面级路由:使用文件系统路由,基于 /pages 文件夹的结构自动创建 URL 路径。渲染模式:支持三种渲染模式:静态生成 (SSG)、服务器端渲染 (SSR) 和客户端渲染 (CSR),并允许根据页面的具体需…...
网络安全---安全见闻
网络安全—安全见闻 拓宽视野不仅能够丰富我们的知识体系,也是自我提升和深造学习的重要途径!!! Web程序(网站) web站点、app都属于Web程序 二进制程序 与逆向分析挂钩 驱动程序 驱动程序也属于软件,以Windows系统…...
在 CSS 中,gap 是 布局容器(flex 或 grid)的属性。它用于设置容器内子元素之间的间距。
在 CSS 中,gap 是 布局容器(flex 或 grid)的属性。它用于设置容器内子元素之间的间距。以下是 gap 属性在不同布局中的应用: 1. 在 CSS Grid 布局中 gap 定义了网格行和列之间的间距。可以分别使用 row-gap 和 column-gap 设置行…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
