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

【Mybatis】分页插件及其原理

原理:

  1. 调用 mapper 接口的方法前,用 PageHelper 的静态方法 start 设置分页参数
  2. 分页参数会被存进 ThreadLocal 里面(这就是为什么要在调用 mapper 方法前设置参数的原因)。
  3. 调用 mapper 接口方法后,会在执行 sql 前进行拦截,拦截器检测出 ThreadLocal 中的分页参数,改写 sql 并添加分页条件。
  4. 新增一条 count(*)的 sql 语句执行
  5. 将结果封装成 Page 对象
  6. 后续可以利用 PageInfo 进行对 page 对象润色提供丰富的分页元数据
    包含以下关键信息:
    • total:总记录数
    • pages:总页数
    • pageNum:当前页码
    • pageSize:每页条数
    • list:当前页的数据列表
    • isFirstPage/isLastPage:是否为第一页 / 最后一页
    • hasPreviousPage/hasNextPage:是否有上一页 / 下一页

补充:为什么没有看见 mapper 接口的实现类:

是因为MyBatis 会在运行时通过 jdk 的动态代理自动生成接口的实现类

@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic PageInfo<User> findAll(int pageNum, int pageSize) {// 开始分页,pageNum是页码,pageSize是每页条数PageHelper.startPage(pageNum, pageSize);// 执行查询List<User> users = userMapper.findAll();// 封装分页结果return new PageInfo<>(users);}@Overridepublic PageInfo<User> findByCondition(String username, int pageNum, int pageSize) {// 开始分页PageHelper.startPage(pageNum, pageSize);// 执行带条件的查询List<User> users = userMapper.findByCondition(username);// 封装分页结果return new PageInfo<>(users);}
}

额外补充:

  1. users的特殊身份
    当调用PageHelper.startPage()后,MyBatis 执行查询返回的users集合,实际上是com.github.pagehelper.Page类型的实例(PageArrayList的子类)。
    这个Page对象内部已经包含了所有分页元数据:
    • 当前页码(pageNum
    • 每页条数(pageSize
    • 总记录数(total
    • 总页数(pages)等
  1. 也就是说,分页查询的所有关键信息已经提前存储在users对象中,并非PageInfo主动计算的。
  2. PageInfo的工作方式
    PageInfo的构造方法会对传入的users进行判断:
    • 如果是Page类型的集合,直接从中提取已有的分页元数据(pageNumtotal等)。
    • 基于这些元数据,自动计算出衍生信息:
      • isFirstPagepageNum == 1
      • isLastPagepageNum == pages
      • hasPreviousPagepageNum > 1
      • hasNextPagepageNum < pages
  1. 简单来说,PageInfo只是Page对象中已有的数据进行整理和封装,方便开发者使用,而不是重新计算分页信息。
  2. 元数据的来源
    这些分页元数据(总记录数、当前页码等)是怎么来的?
    • pageNumpageSize:来自PageHelper.startPage(pageNum, pageSize)的参数。
    • total(总记录数):PageHelper 拦截器会自动执行一条COUNT(*)语句查询得到。
    • pages(总页数):根据totalpageSize计算得出(pages = (total + pageSize - 1) / pageSize)。

这些数据会被 PageHelper 存入Page对象中,最终通过users集合传递给PageInfo

http://www.dtcms.com/a/298863.html

相关文章:

  • 蓝桥杯java算法例题
  • powershell 实现批量把文件夹下的bmp文件转换为jpg
  • 操作系统:设计与实现(Operating System Design Implementation)
  • deepseek本地部署,轻松实现编程自由
  • 小架构step系列25:错误码
  • 储粮温度预测新方案!FEBL模型用代码实现:LSTM+注意力+岭回归的完整流程
  • 【map计算】自定义map计算
  • KNN 算法进阶:从基础到优化的深度解析
  • GaussDB 数据库架构师修炼(九) 逻辑备份实操
  • 动态规划Day1学习心得
  • JavaWeb项目(纯Servlet+JSP+前端三大件)入门(从0开始)
  • JavaSE-图书信息管理系统
  • jwt 在net9.0中做身份认证
  • 2507C++,窗口勾挂事件
  • IPv6,你开始使用了吗?
  • MATLAB 设置默认启动路径为上次关闭路径的方法
  • Linux C : 指针
  • ZYNQ芯片,SPI驱动开发自学全解析个人笔记【FPGA】【赛灵思】
  • 您的需求已被采纳
  • 【51单片机简易红绿灯计数延时】2022-9-23
  • AIStarter平台亮点解析:从ComfyUI项目上架到一键运行的完整指南
  • I/O多路复用机制中触发机制详细解析
  • 数字化转型-AI落地金字塔法则
  • 【补题】Codeforces Round 735 (Div. 2) B. Cobb
  • 卡尔曼滤波器噪声方差设置对性能影响的仿真研究
  • 【LeetCode刷题指南】--有效的括号
  • K-近邻算法中的近似误差和估计误差
  • Win11批量部署神器winget
  • SQL基础⑯ | MySQL8新特性篇
  • JDK8保姆级安装教程