关于pagehelper的几点
基本逻辑
startpage设置threadlocal里的page对象
检查是否需要跳过分页逻辑skip()方法,再检查是否进行count查询
进行总数查询(如果有_COUNT的sql则直接执行,没有就手动生成一个mapstatement),然后设置总数page.setTotal(count);
进行分页查询,查到的结果addall到page实例上
然后返回给mybatis,最后有个finally方法里清空threadlocal里的page对象
以上流程对应的PageHelper的数据库方言包装的流程:
- beforeCount : 是否需要查总数
- getCountSql : 生成count sql ,交由ExecutorUtil.executeAutoCount()执行
- afterCount : 设置page.setTotal(count)
- beforePage : ExecutorUtil.pageQuery()方法里,调用此方法判断是否需要分页查询
- getPageSql : ExecutorUtil.pageQuery()方法里,调用此方法生成page sql并执行得到结果list
- afterPage : 设置分页查询结果list, page.addAll(pageList),根据情况再次设置setTotal()
- afterAll : 目前无现
PageInterceptor dialect属性其实就是PageHelper,
intercept(Invocation invocation)内部逻辑
1、dialect就是pageHelper负责模板流程
2、Executor executor = (E