前言
在后台管理系统中,列表查询一般不会一次性查出所有数据,而是分页展示。
比如员工列表、部门列表、班级列表、学生列表,都可能需要分页。分页不仅能提升页面加载速度,也能减少数据库查询压力。
这一篇我们来学习 Spring Boot + MyBatis 项目中常用的分页插件 PageHelper。
一、分页查询需要哪些参数?
分页查询一般需要两个参数:
page:当前页码
pageSize:每页显示多少条
比如:
GET /emps?page=1&pageSize=10
表示查询第 1 页,每页 10 条数据。
二、返回结果 PageBean 设计
分页接口一般不只返回数据列表,还要返回总记录数。
public class PageBean {
private Long total;
private List rows;
public PageBean(Long total, List rows) {
this.total = total;
this.rows = rows;
}
// getter、setter 省略
}
返回给前端的数据格式大概是:
{
"code": 1,
"msg": "success",
"data": {
"total": 100,
"rows": []
}
}
三、Controller 层实现
@GetMapping
public Result page(
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer pageSize,
String name) {
PageBean pageBean = empService.page(page, pageSize, name);
return Result.success(pageBean);
}
这里使用 @RequestParam(defaultValue = "1") 设置默认页码,避免前端不传参数时报错。
四、Service 层实现
@Override
public PageBean page(Integer page, Integer pageSize, String name) {
PageHelper.startPage(page, pageSize);
List<Emp> empList = empMapper.list(name);
Page<Emp> p = (Page<Emp>) empList;
return new PageBean(p.getTotal(), p.getResult());
}
这里最关键的是:
PageHelper.startPage(page, pageSize);
它必须写在查询语句之前。
五、Mapper 层实现
List<Emp> list(String name);
XML:
<select id="list" resultType="com.example.pojo.Emp">
select id, username, name, gender, phone
from emp
<where>
<if test="name != null and name != ''">
name like concat('%', #{name}, '%')
</if>
</where>
order by update_time desc
</select>
我们不需要手动写 limit,PageHelper 会自动帮我们拼接分页 SQL。
六、PageHelper 的执行流程
七、常见问题
1. startPage 为什么要写在查询前面?
因为 PageHelper 是通过拦截下一条 SQL 来实现分页的。
如果写在查询后面,分页就不会生效。
2. Mapper 里还需要写 limit 吗?
不需要。
使用 PageHelper 后,Mapper 中只写普通查询 SQL 即可。
3. 为什么要返回 total?
因为前端分页组件需要知道总记录数,才能计算总页数。
八、总结
分页查询是后台管理系统中非常常见的功能。PageHelper 的好处是可以让我们不用手动拼接 limit,只需要在查询前调用 PageHelper.startPage(),后面的查询就会自动分页。
开发时要记住一点:startPage 必须写在真正查询数据库的方法之前。






