pagehelper分页原理浅析

先看一下pagehelper的简单用法:

    com.github.pagehelper

    pagehelper-spring-boot-starter

    1.2.5 我使用的版本

依赖

首先要注册pagehelper:

@Bean

public PageHelpercreatePaeHelper(){

PageHelper page=new PageHelper();

  return page;

}

使用:

PageHelper.startPage(page, limit);

List list =customerSubMapper.findCustAndSubInfo(status, custid, subid, name, d1, d2);

PageInfo pageInfo =new PageInfo<>(list);

PageInfo的字段

在看到PageInfo的字段(总页数、第几页、是否第一页、是否最后一页等等)和PageInfo的用法时,我第一时间想到的是pagehelper不过是先把分页需要的参数放到page里,再进行全查,再把所有数据丢到PageInfo里进行分页,也没什么厉害的。不过当我debugger时,发现查询到的list数据只有一页的条数,我之前的想法是不对的。百度一下,网上说的是使用了mybatis的拦截器。

mybatis的拦截器

查询发现有个PageInterceptor的实现类,进去看看intercepter方法(拦截方法)

主要看这段代码,有一个注解很显眼://获取分页,跟进这个方法 dialect.getPageSql(ms, boundSql, parameter, rowBounds, pageKey);是接口Dialect的方法,看下实现类AbstractHelperDialect 

往sql语句里加了orderby从句,再看下重置方法:

是个抽象方法,再看看子类的是怎么实现的

MySqlDialect

因为我使用的是mysql,所以这里以mysql为例,实现类是MySqlDialect,可以看到分页是在这里加上的。

有一个疑问是为什么PageHelper.startPage方法要写在查询语句的前面

重载方法最全的一个,看下getLocalPage()方法,

可以看到pagehelper使用线程容器保存了分页的数据,在使用拦截器的时候查询线程容器里有没有分页数据,有就添加分页从句,没有就什么也不用做。

你可能感兴趣的:(pagehelper分页原理浅析)