PageHelper 可以在不用写分页语句的情况下完成物理分页的效果。
1、引入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
2、配置PageHelper相关配置
#pagehelper分页插件配置
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
#如果启用supportMethodsArguments参数,则pageHelper可以自动拦截请求参数中的pageNum,pageSize参数
#不启用supportMethodsArguments参数,则需使用PageHelper.startPage(pageNum,pageSize)方法调用
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
pagehelper.helperDialect 配置方言属性 可选值为oracle,mysql,mariadb,sqlite,hsqldb,postgresql,没有默认值,必须指定该属性
pagehelper.reasonable 分页合理化 如过开启了reasonable功能,并且用户传入的页数已经大于了总页数,则会将用户传入的pageNum修改为总页数pages。 默认值为false,需要设为true时生效。
pagehelper.params=count=countSql 如果请求参数 POJO或者Map中发现了countSql属性,就会作为count参数使用
pagehelper.supportMethodsArguments=true #如果启用supportMethodsArguments参数,则pageHelper可以自动拦截请求参数中的pageNum,pageSize参数 不启用supportMethodsArguments参数,则需使用PageHelper.startPage(pageNum,pageSize)方法调用
3、pageHelper 分页主要代码 为
PageHelper.startPage(pageNum,pageSize); 声明了该代码就能实现分页查询
源码:
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
Page<E> page = new Page(pageNum, pageSize, count);
page.setReasonable(reasonable);
page.setPageSizeZero(pageSizeZero);
Page<E> oldPage = getLocalPage();
if (oldPage != null && oldPage.isOrderByOnly()) {
page.setOrderBy(oldPage.getOrderBy());
}
setLocalPage(page);
return page;
}
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal();
public PageMethod() {
}
protected static void setLocalPage(Page page) {
LOCAL_PAGE.set(page);
}
public static <T> Page<T> getLocalPage() {
return (Page)LOCAL_PAGE.get();
}
其原理为将分页的参数 复制到 localPage 中,保存了当前分页线程的Page参数的变量,这样可以保证分页的时候,参数互不影响,接着利用了mybatis提供的拦截器,取得ThreadLocal的值,重新拼装分页SQL,完成分页。