1、MyBatis 分页原理
(1)
(2)使用插件:拦截器拼接分页sql进行物理分页(mysql-limit oracle-rownum)
PageHelper是MyBatis的一个插件,内部实现了一个PageInterceptor拦截器。Mybatis会加载这个拦截器到拦截器链中。在我们使用过程中先使用PageHelper.startPage这样的语句在当前线程上下文中设置一个ThreadLocal变量,再利用PageInterceptor这个分页拦截器拦截,从ThreadLocal中拿到分页的信息,如果有分页信息拼装分页SQL(limit语句等)进行分页查询,最后再把ThreadLocal中的东西清除掉。
详解:https://blog.csdn.net/fedorafrog/article/details/104412140
- 题外话:order by 和 limit rownum 并列的话:mysql 是先 order by 再 limit 的(不过插件拼接的话应该都是把 limit 放在外层的?而不是并列);oracle 是先 rownum 再 order by 的,所以想要先 order by 再 rownum 就要 select tmp.* (select....order by) as tmp where rownum<xxx
- PageInterceptor拦截器 实现了 ibatis 接口 org.apache.ibatis.plugin.Interceptor
- protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal();
- 通过 PageInterceptor 类上的 @Intercepts 注解可以看到拦截的是 Executor对象中的query(MappedStatement ms,Object o,RowBounds ob ResultHandler rh)这个方法。