PageHelper.offsetPage(PAGE_NUM, PAGE_SIZE)实际做的事情是在 ThreadLocal中设置了分页参数,之后在查询执行的时候,获取当线程中的分页参数,执行查询的时候通过拦截器在sql语句中添加分页参数,之后实现分页查询,查询结束后在 finally 语句中清除ThreadLocal中的查询参数
PageInterceptor
最核心的逻辑在 PageInterceptor 中,PageInterceptor 是一个拦截器。
Mybatis四个拦截机会
- Executor
- ParameterHandler
- ResultSetHandler
- StatementHandler
分页插件拦截的是 Executor ,也就是在sql执行的时候
Mybatis插件加载流程
- 读取配置文件到Congiguration实例
- 生成全局公用的 SqlSessionTemplate以SqlSessionFactory实例
- 获取接口的代理对象MapperProxy
- 执行增删改查方法
那么在configuration.newExecutor()方法会加载拦截链,也就是PageInterceptor。
注意
PageHelper方法使用了静态的ThreadLocal参数,分页参数和线程是绑定的。
只要你可以保证在PageHelper方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为PageHelper在finally代码段中自动清除了ThreadLocal存储的对象。
网友评论