MyBatis + PageHelper 实现分页
MyBatis + PageHelper 实现分页¶
1️⃣ 关键依赖¶
分页的核心是 PageHelper,需要在 pom.xml
中引入:
2️⃣ 分页流程解析¶
PageHelper.startPage(page, pageSize)
会 拦截紧接着执行的 MyBatis 查询。- 它会在 SQL 上动态添加
LIMIT
或者数据库对应的分页语法,比如:
-
原理:
-
PageHelper 会在查询前创建一个 ThreadLocal 变量存放分页信息。
- 当 MyBatis 执行 SQL 时,PageHelper 的拦截器会读取这个信息,并修改 SQL。
clazzMapper.page(queryParam)
是你的 Mapper 查询方法。- 返回类型通常是
List<Clazz>
,但 PageHelper 会把它 包装成 Page 对象,Page 实现了 List,同时多了分页信息(总记录数、总页数等)。
PageResult
是你自定义的分页结果对象。page.getTotal()
→ 总记录数page.getResult()
→ 当前页的数据列表
最终返回给前端的 JSON 就是标准的分页结构:
3️⃣ 总结原理¶
- 调用
PageHelper.startPage()
设置分页参数(页码和每页大小)。 - 执行 Mapper 查询时,PageHelper 拦截 SQL,加上分页语法。
- 查询结果被 PageHelper 包装成
Page
对象,包含数据和分页信息。 - 封装成自定义
PageResult
返回前端。
💡 注意事项
startPage
必须在 Mapper 查询 之前调用。- Mapper 返回值可以是
List<T>
,PageHelper 会自动转换为Page<T>
。 - 如果你的查询涉及
count(*)
,PageHelper 会自动帮你统计总记录数。
Page类--List 的子类,又封装了分页信息¶
1️⃣ Page
的基本概念¶
Page<T>
实现了List<T>
接口,所以它本质上就是一个 列表,可以像普通 List 一样迭代、取值。-
除了存放数据,它还额外记录了 分页信息,包括:
-
总记录数
total
- 当前页码
pageNum
- 每页大小
pageSize
- 总页数
pages
- 当前页数据
result
(其实就是 List 自身)
2️⃣ Page 类结构(简化版)¶
实际 PageHelper 的 Page 类比这个更复杂,还支持排序、导航页码等。
3️⃣ 为什么 Page 可以直接用¶
因为 Page
继承自 ArrayList<T>
,所以:
就像操作普通 List 一样操作分页结果,同时还能获取总记录数:
4️⃣ Page 与 PageResult 的关系¶
通常我们不直接把 Page 返回给前端,而是封装成统一的分页对象:
这样前端 JSON 就标准化了:
💡 总结
Page
= List + 分页信息- MyBatis 查询结果被 PageHelper 包装成 Page
- Page 提供总数、页码等信息,方便后端封装分页结果