PageHelper 地址:https://pagehelper.github.io/

Maven依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>最新版本</version>
</dependency>

或者直接用 二选一

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>

PageHelper配置类

import com.github.pagehelper.PageHelper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Properties;

@Configuration
public class PageHelperConfig {

    @Bean
    public PageHelper pageHelper() {
        PageHelper pageHelper = new PageHelper();
        Properties p = new Properties();
        p.setProperty("offsetAsPageNum", "true");
        p.setProperty("rowBoundsWithCount", "true"); // 将该参数设置为 true 后,offset会当成 pageNum 使用,limit 和 pageSize 含义相同。
        p.setProperty("reasonable", "true"); // reasonable 为 true,这时如果 pageNum<=0 会查询第一页,如果 pageNum>总页数 会查询最后一页。
        p.setProperty("dialect", "mysql"); // 配置mysql数据库
        pageHelper.setProperties(p);
        return pageHelper;
    }
}

PageHelper 用法主要就是:在serviceimpl 执行mapper前 加入 PageHelper.startPage(page, pageSize)。

说明:startPage是个静态方法,他的作用白话是:紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。但是要深入记忆的一点是:startPage()实现与ThreadLocal一样:是执行startPage()时,会记录线程信息,之后的此线程第一次Select会被执行分页。分页后,PageHelper会在其自己finally块执行clearPage()

PageHelper乱分页问题产生原因

List<User> list;
PageHelper.startPage(1, 10);
if(param1 != null){
    list = userMapper.selectIf(param1);
} else {
    list = new ArrayList<User>();
}

上文代码看似没啥问题,但是要记住PageHelper.startPage是线程级别的分页,一旦这个线程A出现异常,但是这个PageHelper没有对线程A执行PageHelper.clearPage();就会导致下个接口使用线程A时,出现各种各样的异常。所以最保险的情况就是

    PageHelper.startPage(1, 10);
    try{
        // todo 做业务查询
    } finally {
        PageHelper.clearPage();
    }

最后附上日常开发API

        PageHelper.clearPage(); // 清除此线程的下次查询的分页
        //PageHelper.startPage(page, pageSize,false); //通过PageInfo得到的total是-1
        //PageHelper.startPage(page, pageSize,true); 等价于 PageHelper.startPage(page, pageSize);
        PageHelper.startPage(page, pageSize); //此语句默认会有count计数 可通过PageInfo.getTotal(),得到查询的结果数。
        new PageInfo<>(xxxMapper.selectByAllWithCondition(obj));
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤