智能家居
分页控件(MyBatis 分页方式及分页插件原理)

一、MyBatis 自身分页方式

  • RowBounds 逻辑分页基于org.apache.ibatis.session.RowBounds类实现,属于内存分页。它会先查询出所有符合条件的数据,再在内存中根据offset(起始行)和limit(每页条数)截取分页结果。缺点:数据量大时性能极差,因为会加载全量数据到内存。
  • 手动编写分页 SQL直接在 SQL 中嵌入数据库原生的分页语法(如 MySQL 的LIMIT、Oracle 的ROWNUM),属于物理分页。示例(MySQL):SELECt * FROM table LIMIT #{offset}, #{pageSize}。缺点:需要手动维护分页参数,SQL 可读性和复用性差。

二、分页插件(以 PageHelper 为例)的原理

分页插件基于MyBatis 拦截器(Interceptor)机制实现,核心流程如下:

  1. 拦截 SQL 执行
  2. 插件实现org.apache.ibatis.plugin.Interceptor接口,拦截Executor的query方法,在 SQL 执行前介入。
  3. 改写 SQL 语句
  4. 根据分页参数(页码、每页条数),自动为原始 SQL 添加分页关键字(如 MySQL 的LIMIT)。例如,将SELECt * FROM table改写为SELECt * FROM table LIMIT #{offset}, #{pageSize}。
  5. 线程安全的参数传递
  6. 分页参数通过ThreadLocal存储,保证多线程环境下参数的隔离性;执行完成后会清除 ThreadLocal 中的数据,避免内存泄漏。
  7. 结果封装
  8. 插件会将分页后的结果与分页信息(总条数、总页数等)封装到自定义的分页对象中,方便业务层使用。

这种方式实现了物理分页的自动化,无需手动编写分页 SQL,大幅提升了开发效率和 SQL 可读性。


顶一下()     踩一下()

热门推荐

发表评论
0评