视频加载失败

JavaWeb Day03:Tlias 员工管理之分页查询

382 字
2 分钟
JavaWeb Day03:Tlias 员工管理之分页查询

代码结构#

层类/方法锚点
ControllerEmpController.page()@GetMapping 无路径=匹配 /emps;@RequestParam(defaultValue = "1") 给 page/pageSize 默认值,URL 不带参也能跑
ServiceEmpServiceImpl.page()两步查询:count() 总记录数 + list((page-1)*pageSize, pageSize) 当页数据
MapperEmpMapper.count() / list(start, pageSize)手写 LIMIT 物理分页:limit #{start},#{pageSize};left join dept 取 d.name deptName
POJOPageResult<T>泛型分页封装(total + rows),@Data/@AllArgsConstructor/@NoArgsConstructor
POJOEmp14 个字段;deptName 不在 emp 表,靠 left join + 驼峰映射填充

核心结论#

  1. 分页本质:数据库物理分页(LIMIT 截断返回),不是查全量再内存截断。偏移量 (page-1)*pageSize 是换算关键。
  2. PageResult 泛型的意义:PageResult<Emp> 让封装类复用于任何实体,换成 PageResult<Dept> 不用改封装类本身。
  3. left join 取部门名:员工表只存 dept_id,部门名通过 left join dept + d.name deptName 别名带回;map-underscore-to-camel-case 已开启,别名与属性名一致即可直接映射。
  4. @RequestParam(defaultValue):未传参数时使用默认值而不报 400,是分页接口的标配。

MyBatis 分页的几种实现#

手写 SQL 分页是把 limit #{start},#{pageSize} 直接写进映射语句,偏移量与每页条数由应用层算好传入。另一种做法是通过 MyBatis 拦截器配合动态代理,在 SQL 执行前拦截并重写语句,按数据库方言追加 limit 子句,PageHelper 采用的就是这种方式,例如把 select * from student 重写为 select t.* from (select * from student) t limit 0,10。还有基于 RowBounds 的结果集分页:先执行查询拿到完整结果集,再在内存中定位当页数据,数据量大时开销高。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
JavaWeb Day03:Tlias 员工管理之分页查询
https://ryuki.icu/posts/javaweb-day03/
作者
RK
发布于
2026-08-13
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
RK
Long may the sunshine
公告
Long may the sunshine
分类
标签
最新动态
站点天气
天气加载中…
站点统计
文章
27
分类
6
标签
59
总字数
39,139
篝火已燃
0 天
最后活动
0 天前
每日一签