1.RowBounds——逻辑分页
RowBounds中传入的limit分页参数,是在sql执行完后,把所有数据加载到内存中,然后再进行的逻辑分页,并不是sql执行前将limit拼接到where条件后面。
2.PageHelper——物理分页
PageHelper是MyBatis中的一个插件,其内部实现了一个PageInterceptor的拦截器。Mybatis启动后会加载这个拦截器到拦截器链中。
在我们使用PageHelper的过程中,首先会先使用PageHelper.startPage这样的语句在当前线程上下文中设置一个ThreadLocal变量;然后,会再利用PageInterceptor这个分页拦截器拦截,从ThreadLocal中拿到分页的信息,判断如果有分页信息就去拼装分页的SQL语句(limit等语句)进行分页查询;最后,会最终把在ThreadLocal变量中的东西清除掉。
PageHelper使用ThreadLocal本地线程变量保存了分页参数信息,分页参数和本地线程是绑定的。我们要保证PageHelper调用startPage后紧跟 MyBatis 查询方法,这是安全的。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。