使用 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 设置行…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
