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

MyBatis分页的原理和分页插件的原理是什么

1、mybatis的分页
MyBtis本身不提供自动化分页,MyBatis 原生分页的本质,就是通过在 SQL 语句中直接使用数据库特定的分页关键字(如 LIMIT, ROWNUM)来实现的。这是一种物理分页,即数据库只返回查询结果中的一部分数据。
2、分页插件的原理
最著名的就是PageHelper,以这个来说
核心思想: 在 MyBatis 执行 SQL 语句之前,由插件“拦截”下来,对原 SQL 进行“改造”,自动添加上分页子句,并同时执行一条计数 SQL。
步骤一:PageHelper.startPage(1, 10)

插件会将一个 Page 对象(包含页码、页大小等信息)存储到当前线程的 ThreadLocal 变量中。ThreadLocal 保证了每个线程的分页参数互不干扰,这在Web应用中至关重要(每个请求是一个独立线程)。

步骤二:执行查询 userMapper.selectAllUsers()

MyBatis 开始执行这条查询语句。

当执行到创建 Statement 的时候,分页插件的拦截器会生效。

拦截器从当前线程的 ThreadLocal 中获取到之前设置的 Page 对象。如果存在,则说明这个查询需要分页。

步骤三:SQL 改造与执行

Dialect(数据库方言): 插件会根据配置的数据库类型(如 MySQL, Oracle)选择对应的“方言”实现。

改造数据查询 SQL: 拦截器会把你写的原始 SQL(SELECT * FROM user)拼接上分页子句。例如,对于 MySQL,会改造成:

SELECT * FROM user LIMIT 0, 10
执行计数 SQL: 为了得到总记录数,插件还会自动生成一条对应的 COUNT 查询语句并执行。例如:

SELECT COUNT(0) FROM user
插件会把这个总数设置回 Page 对象。

步骤四:清理 ThreadLocal

查询执行完毕后,插件会自动清理掉 ThreadLocal 中的分页参数,避免影响后续的无分页查询。这就是为什么要求 PageHelper.startPage() 后必须紧跟查询语句的原因。

步骤五:返回结果

最终,userList 拿到的已经是分页后的结果(只有10条数据)。

用 PageInfo 包装这个 List 后,你可以轻松地从 pageInfo 中获取总记录数、总页数、当前页、是否有下一页等所有分页信息。

http://www.rkmt.cn/news/10531.html

相关文章:

  • 旋转图像-leetcode
  • 哪些ERP系统值得长期使用?2025年最新盘点来了!
  • 2025年9月23日 - 20243867孙堃2405
  • 软件工程学习日志2025.9.23
  • 07-django+DRF项目中统一json返回格式 - 详解
  • 软工第二次作业——个人项目
  • AT_arc181_d [ARC181D] Prefix Bubble Sort
  • 【MySQL】使用C/C++链接mysql数据库 - 指南
  • day002
  • 【51单片机】【protues仿真】基于51单片机密码锁系统 - 详解
  • cv-css 快捷方式,将指定节点的计算样式获取下拉 获取tailwind网页样式成原生样式
  • # Shell 文本处理三剑客:awk、sed 与常用小器具详解
  • matter 协议解析;
  • nRF54LM20A GRTC
  • 2025年10款最佳生产力提效chrome插件推荐,亲测有用
  • 发表第一篇文章,谈谈对软件工程的理解
  • nRF54LM20A 芯片分析;
  • 第二天
  • Win10服务器远程连接断开后.bat脚本进程中断的全面解决高效的方案
  • 软件测试员的核心技能:一文掌握等价类划分与边界值分析
  • 9/23
  • NUMERICAL RESULT (2025/09/23)
  • 数组入门:从零基础到排序算法 - 教程
  • Optuna v4.5新特性深度解析:GPSampler实现约束多目标优化
  • 题解:P4769 [NOI2018] 冒泡排序
  • 详细介绍:内网后渗透攻击--域控制器安全(1)
  • 20250923
  • java面试笔试题大汇总 ~很全面收藏 - 详解
  • 0基础读CCFA(TPDS)论文—面向多 GPU 平台机器学习训练的通用性能建模
  • GO学习记录九——数据库触发器的运用+redis缓存策略