PageHelper
使用总结:
在使用 PageHelper
进行分页处理时,紧接着 PageHelper.startPage()
方法调用的查询会被自动转化为分页查询,这是通过 PageHelper
的内部机制实现的。
使用的是github的PageHelper
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
内部工作原理
-
拦截器(Interceptor):
PageHelper
使用 MyBatis 的拦截器(Interceptor)API。当你调用PageHelper.startPage()
方法时,实际上是设置了一些线程局部(ThreadLocal)变量,这些变量包含了分页的相关参数(如页码和每页数量)。- 这些线程局部变量随后会被
PageHelper
提供的拦截器读取。此拦截器会拦截待执行的 SQL 查询。
-
SQL 修改:
- 在 SQL 执行之前,拦截器会根据分页参数修改原始 SQL,添加必要的 SQL 语句(如
LIMIT
和OFFSET
子句),以便只查询出指定页面上的数据。 - 这个过程对开发者来说是透明的,你不需要手动编写任何分页逻辑。
- 在 SQL 执行之前,拦截器会根据分页参数修改原始 SQL,添加必要的 SQL 语句(如
-
结果处理:
- 查询执行后,原始的结果集被封装在
Page
类的实例中,这个类提供了额外的分页信息,如总记录数和总页数等。 - 通过这种方式,调用
PageHelper.startPage()
后的第一个 MyBatis 查询自动转换为分页查询,并返回一个Page
对象。
- 查询执行后,原始的结果集被封装在
代码执行流程
这里是一个简化的流程说明,展示了从调用 PageHelper.startPage()
到获取分页结果的过程:
// Step 1: 调用 PageHelper.startPage
PageHelper.startPage(1, 10);
// Step 2: 执行查询 - 此查询被拦截器捕获
List<Employee> employees = employeeMapper.selectAll();
// Step 3: 处理返回的分页结果
Page<Employee> page = (Page<Employee>) employees; //此处,查询结果已经被自动转换成Page对象
System.out.println("总记录数: " + page.getTotal());
System.out.println("当前页面记录数: " + page.size());