当前位置: 首页 > news >正文

MyBatis分页:PageHelper

MyBatis分页:PageHelper

📖 前言:为什么需要分页?

在处理大量数据时,一次性从数据库查询并返回所有结果是不可行的,这会带来巨大的性能和内存开销。分页是解决这一问题的标准方案。而PageHelper是一个极其流行的MyBatis物理分页插件,它能以“非侵入式”的方式,让我们无需在SQL中编写LIMIT子句,即可轻松实现分页。

🎯 什么是PageHelper?

PageHelper是一个MyBatis插件,它通过AOP拦截即将执行的SQL查询。当你发起一个分页请求时,它会自动为你追加对应数据库方言的分页语句(如MySQL的LIMIT),从而实现物理分页。其最大的优点是你只需编写最纯粹的业务查询SQL,将分页逻辑与业务逻辑完全解耦。

🔧 Spring Boot集成

1. 添加依赖

pom.xml中引入官方的starter依赖:

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>2.1.0</version> </dependency>
2. 关于配置 (application.yml )

在很多情况下,由于starter强大的自动检测能力(例如,它可以根据JDBC URL自动识别数据库类型),PageHelper可以零配置工作,但强烈建议进行显式配置

为什么推荐配置?

  • 稳定性:明确指定helper-dialect可以避免因JDBC URL不规范导致的方言识别失败。
  • 功能开启:可以方便地开启reasonable(分页参数合理化)等高级功能。
  • 清晰性:配置即文档,让项目配置一目了然。

推荐配置 (application.yml)

pagehelper:helper-dialect: mysql         # 明确指定数据库方言reasonable: true              # 开启分页参数合理化

🚀 核心用法:两种主流风格 (Page vs PageInfo)

PageHelper的核心魅力在于其简洁的调用方式。主要有两种风格,一种是使用PageInfo全家桶,另一种是像您展示的那样,使用Page对象手动封装。

1:使用 PageInfo (便捷的一站式方案)

这是官方最推荐的用法,它将所有分页信息封装在一个PageInfo对象中,非常方便。

流程:

  1. PageHelper.startPage(pageNum, pageSize);
  2. List<T> list = yourMapper.select(...);
  3. PageInfo<T> pageInfo = new PageInfo<>(list);
  4. pageInfo对象返回给前端。
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic PageInfo<User> findUsersByPage(int pageNum, int pageSize) {// 1. 开启分页PageHelper.startPage(pageNum, pageSize);// 2. 执行查询 (这是一个普通的、不带分页的查询)List<User> userList = userMapper.findAll();// 3. 将查询结果封装到PageInfo对象中PageInfo<User> pageInfo = new PageInfo<>(userList);return pageInfo;}
}
核心属性与方法

PageInfo是PageHelper返回的核心对象,它包含了丰富的分页信息,可以直接序列化为JSON返回给前端。

属性类型说明
pageNumint当前页码
pageSizeint每页数量
sizeint当前页的数量
totallong总记录数
pagesint总页数
listList<T>当前页的数据列表
prePageint上一页页码
nextPageint下一页页码
isFirstPageboolean是否为第一页
isLastPageboolean是否为最后一页
hasPreviousPageboolean是否有上一页
hasNextPageboolean是否有下一页

优点PageInfo对象包含了总页数、总条数、是否有上一页/下一页等所有前端分页组件需要的信息,一步到位。

2:强转为 Page<T>

这种方式同样非常流行,它提供了更高的自定义灵活性。

工作原理:当PageHelper.startPage()被调用后,PageHelper会确保紧跟其后的MyBatis查询返回的List对象,其实际类型是com.github.pagehelper.PagePage类继承自ArrayList,但额外包含了分页信息(如总条数total)。

// 1. 开启分页
PageHelper.startPage(1, 10);// 2. mapper.list() 表面上返回的是 List<Emp>,
//    但其在运行时的真实类型是 Page<Emp>
List<Emp> empList = empMapper.list();// 3. 因此,可以安全地进行强制类型转换
Page<Emp> page = (Page<Emp>) empList;
使用场景

Page<T> 主要用于需要高度自定义返回格式的场景。开发者通过将其强转后,可以精确地提取出 totallist 数据,然后封装进自己项目规定的 PageBeanResultVO 等DTO(数据传输对象)中,完全掌控API的响应结构。

优点:返回给前端的JSON结构完全由您自己定义,可以做到最精简,不受PageInfo固定结构的限制。

核心属性与方法

Page<T> 对象提供了获取分页所需的最基本、最核心的数据:

方法名返回类型说明
getTotal()long获取总记录数
getResult()List<T>获取当前页的数据列表 (等同于对象本身)
getPages()int获取总页数
getPageNum()int获取当前页码
getPageSize()int获取每页显示数量
getStartRow()long获取当前页的起始行号 (从1开始)
getEndRow()long获取当前页的结束行号

在这里插入图片描述


文章转载自:

http://crC89nV2.Lthtp.cn
http://GYhc4CB6.Lthtp.cn
http://akn9AgjB.Lthtp.cn
http://BZdwncXa.Lthtp.cn
http://aZK8lNuk.Lthtp.cn
http://mRzPZ0p8.Lthtp.cn
http://8dCWixCx.Lthtp.cn
http://6f8bp8Nk.Lthtp.cn
http://MatcgxTy.Lthtp.cn
http://tN7nA1kA.Lthtp.cn
http://bH5V4CkI.Lthtp.cn
http://9Moq2xzU.Lthtp.cn
http://IwFvn1oq.Lthtp.cn
http://ucWzAN5n.Lthtp.cn
http://Wmelk5hI.Lthtp.cn
http://FmSrk6k5.Lthtp.cn
http://zMdDcB8z.Lthtp.cn
http://5nGONSoZ.Lthtp.cn
http://H8NKfmZE.Lthtp.cn
http://KLHrWm1h.Lthtp.cn
http://ZL4KnHxT.Lthtp.cn
http://vw8QYGtf.Lthtp.cn
http://GW7dnlUD.Lthtp.cn
http://SgId1FBT.Lthtp.cn
http://NwnJUR0K.Lthtp.cn
http://oXIFWU5A.Lthtp.cn
http://FsGOe24B.Lthtp.cn
http://4GTGNnX3.Lthtp.cn
http://U1f5SPdw.Lthtp.cn
http://78VaDdyc.Lthtp.cn
http://www.dtcms.com/a/387836.html

相关文章:

  • 基于python BERT的新闻文本分类与用户行为预测的分析与应用
  • MFC实战:OBJ模型加载与3D渲染指南
  • FAQ:珠海网络推广哪家好?GEO优化能带来哪些优势?
  • (论文速读)CLR-GAN: 通过一致的潜在表征和重建提高gan的稳定性和质量
  • MFC_Static
  • TDengine IDMP 基本功能——数据可视化(3. 饼图)
  • Spring基础创建
  • 智能的非数学本质
  • CNB迁移和UI定制
  • 基于OpenTelemetry与Jaeger的分布式追踪原理深度解析与实践指南
  • EasyDSS视频直播RTMP推流技术如何实现多机型的无人机视频统一直播
  • 智能扫地机器人方案开发,基于32位MCU
  • 【STM32 CubeMX + Keil】DAC 输出0~3.3V间任意电压
  • git submodule命令详解
  • HTTP/2.0是什么?
  • 深度学习基础:从线性回归到 Softmax 回归的完整梳理
  • 深度学习之线性回归与 Softmax 回归
  • 线性回归与 Softmax 回归
  • 源雀 Scrm开源:企微防截屏
  • [APItest-Karate] HttpRequestBuilder | HttpClient发送请求
  • 线性回归与 Softmax 回归:从基础模型到深度学习入门
  • 【Leetcode hot 100】105.从前序与中序遍历序列构造二叉树
  • 机器视觉在PCB制造中的检测应用
  • 服务器ssh端口放开,仍然无法登录
  • 【0基础3ds Max】命令面板详解
  • LeetCode 381 - O(1) 时间插入、删除和获取随机元素(允许重复)
  • [新启航]深孔加工尺寸精度检测方法 - 激光频率梳 3D 轮廓测量
  • MySQL 进阶:多表联合查询与数据备份恢复
  • 【LeetCode每日一题】:移除链表元素
  • 工业大数据时代时序数据库选型指南:为何Apache IoTDB成为首选?