PageHelper分页使用详解

发布时间:2023-05-17

一、PageHelper分页使用避免的坑

  1. PageHelper使用时,最好将它放在查询语句的前面,如果放在查询语句后面可能会出现分页后查询出来的数据不正确的问题。
  2. 尽量避免在PageHelper的配置文件(pagehelper.properties或者mybatis-config.xml)中配置dialect属性,最好是在代码中设置dialect属性,因为在不同的环境下可能需要设置不同的dialect属性。
  3. 在分页查询的时候,一定要传入Page对象;同时,在select语句中,需要使用Page对象的startPage方法开始分页,结尾处使用PageHelper.endPage()方法。

二、PageHelper分页怎么用

在使用PageHelper进行分页操作的时候,需要在查询语句前面添加startPage方法,用来指定当前页码以及每页显示的记录数。同时,在查询之后需要添加endPage方法,以便正确地释放资源。 下面是分页查询的示例:

public PageInfo<User> getUserList(int pageNum, int pageSize) {
    // 开始分页
    PageHelper.startPage(pageNum, pageSize);
    List<User> userList = userDao.getUserList();
    // 结束分页
    PageHelper.endPage();
    return new PageInfo<>(userList);
}

三、PageHelper分页使用第二个SQL分页

在特殊情况下,可能需要使用第二个SQL语句进行分页操作,这种情况下,我们可以通过PageHelper提供的静态方法localPage来实现第二个SQL语句的分页。

public PageInfo<User> getUserList(int pageNum, int pageSize) {
    int offset = (pageNum - 1) * pageSize;
    String sql = "select * from user limit ?,?";
    List<User> userList = SqlHelper.executeForListSql(sql, offset, pageSize);
    // 简单的使用localPage就能实现第二个sql语句的分页
    PageHelper.localPage(offset, pageSize);
    return new PageInfo<>(userList);
}

四、PageHelper分页使用SQL查不出数据

在使用PageHelper进行分页操作时,如果查询的总记录数为0,则会出现Page对象的total属性为0的情况。

public PageInfo<User> getUserList(int pageNum, int pageSize) {
    // 这是一种错误的做法
    if (userDao.getUserList().size() == 0) {
        return new PageInfo<>(null);
    }
    // 开启分页
    PageHelper.startPage(pageNum, pageSize);
    List<User> userList = userDao.getUserList();
    // 结束分页
    PageHelper.endPage();
    return new PageInfo<>(userList);
}

这种情况下,应该抛出异常或者返回null,不能直接返回PageInfo对象,因为此时的PageInfo对象的total属性为0。

public PageInfo<User> getUserList(int pageNum, int pageSize) {
    if (userDao.getUserList().size() == 0) {
        throw new RuntimeException("查询数据为空!");
    }
    // 开启分页
    PageHelper.startPage(pageNum, pageSize);
    List<User> userList = userDao.getUserList();
    // 结束分页
    PageHelper.endPage();
    return new PageInfo<>(userList);
}

五、PageHelper分页条

PageHelper提供了默认的分页条,我们也可以自定义分页条的样式。

<!-- 在body中加入以下代码,指定分页条的样式 -->
<style>
    .pagination>li>a, .pagination>li>span {
        position: relative;
        float: left;
        padding: 6px 12px;
        margin-left: -1px;
        line-height: 1.42857143;
        text-decoration: none;
        background-color: #fff;
        border: 1px solid #ddd;
    }
</style>
<!-- 在jsp页面使用以下代码生成分页条 -->
<div style="text-align:center">
    <ul class="pagination">
        <li>«</li>
        <li>»</li>
        <li><span>&nbsp;&nbsp;<%=pager.getPageNum()%>&nbsp;/&nbsp;<%=pager.getPages()%>&nbsp;&nbsp;</span></li>
    </ul>
</div>

六、PageHelper分页实现

在使用PageHelper分页时,我们需要做以下几个步骤:

  1. 更改pom.xml文件,添加PageHelper和MyBatis的依赖。
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.2.0</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>
  1. 在SpringBoot的配置文件中添加以下配置:
# 配置PageHelper插件
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
pagehelper.autoRuntimeDialect=true
  1. 在MyBatis的配置文件mybatis-config.xml中配置PageHelper插件:
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 使用下面这个属性值可以不通过设置 dialect 属性来自动获取 dialect -->
        <property name="autoRuntimeDialect" value="true" />
    </plugin>
</plugins>
  1. 在Java代码中使用PageHelper进行分页查询:
public PageInfo<User> getUserList(int pageNum, int pageSize) {
    // 开始分页
    PageHelper.startPage(pageNum, pageSize);
    List<User> userList = userDao.getUserList();
    // 结束分页
    PageHelper.endPage();
    return new PageInfo<>(userList);
}

通过以上几个步骤,我们就可以使用PageHelper进行分页操作了。