最近在写需求的过程中接触到许多的分页,但是对于不同情况下会有不同的分页方法选择,由于目前使用得比较多的是mybatis-plus里面的分页插件,因此通过本文详细了解一下pageHelper的使用。

分页最终都是在sql中通过limit完成,limit offset,pageSize

PageHelper.startPage

功能特点:

PageHelper.startPage 是 PageHelper 提供的最常用的分页方法。它通过拦截器的方式,在 SQL 查询前自动执行分页操作,生成分页的 SQL 语句,包括查询总数和查询指定页码的数据。并将分页查询的信息存储在 PageInfo 对象中,包括总记录数、总页数、当前页码等信息。

使用方法:

PageHelper.startPage(pageNum, pageSize); // 执行查询操作
List<User> userList= userMapper.selectUsers(); 
PageInfo<User> pageInfo = new PageInfo<>(userList);
优点:
  • 简单易用,使用起来方便快捷。
  • PageInfo 对象提供了丰富的分页信息,方便对分页结果进行操作和展示。
缺点:
  • 需要查询总数,可能在处理大数据量时影响查询性能。
  • 对于大数据量,如果只需要当前页数据而不关心总数,会浪费查询时间。

PageMethod.offsetPage

功能特点:

PageMethod.offsetPage 是 PageHelper 提供的另一种分页方式。它通过在查询方法中手动指定偏移量和每页条数来实现分页,不进行总数查询,因此适合处理大数据量的分页查询。

使用方法:

 PageMethod.offsetPage(offset, pageSize, false);
// 执行查询操作
List<User> userList = userMapper.selectUsers();
优点:

避免了查询总数,性能较好,适合于大数据量的分页查询。
灵活性较高,可以手动控制偏移量和每页条数。

缺点:

可能出现数据重复或丢失的情况,因为为了判断是否有下一页,会查询额外的一条记录。
使用上需要手动处理分页逻辑,不像 PageHelper.startPage 那样直观和方便。

PageMethod.offsetPage是否有下一页的优化:

当使用 PageMethod.offsetPage 方法进行分页查询时,通常会额外获取比当前页码所需的数据多一条(pageSize + 1)。这是为了判断是否存在下一页数据,因为如果获取的结果等于 pageSize + 1,则说明还有下一页数据存在。在此过程中,需要进行判断并处理是否有下一页数据以及获取当前页的数据。

下面是一个示例,演示了使用 PageMethod.offsetPage 方法进行分页查询后,判断是否存在下一页数据并获取当前页数据的处理方式:

PageMethod.offsetPage((pageNum - 1) * pageSize, pageSize + 1, false);
// 执行查询操作
List<User> userList = userMapper.selectUsers();

boolean hasNextPage = userList.size() > pageSize; // 判断是否有下一页数据

List<User> currentPageData;
if (hasNextPage) {
    // 如果存在下一页数据,需要去掉多余的那条数据
    currentPageData = userList.subList(0, pageSize);
} else {
    currentPageData = userList;
}

// 处理当前页数据
// ...

// 返回结果或其他操作
// ...

在这个例子中,首先使用 PageMethod.offsetPage 方法进行分页查询,查询结果存储在 userList 中。接着,根据 userList 的大小与预期的 pageSize 进行比较,判断是否有下一页数据,并根据情况截取获取当前页的数据。

如果 userList 的大小大于 pageSize,说明存在下一页数据,因此需要将多出来的那条数据去掉(subList(0, pageSize)),得到当前页的数据。否则,userList 的大小等于或小于 pageSize,表示没有下一页数据,直接将 userList 作为当前页数据即可。

最后,对当前页数据进行处理,比如展示、返回给前端或进行其他操作。这种方式可以处理 PageMethod.offsetPage 方法获取的分页数据,确保获取当前页数据的正确性,并判断是否有下一页数据。

选择使用哪种方式,需要根据具体场景需求和性能要求来决定。PageHelper.startPage
对于普通分页查询和对总数有要求的场景比较适用,而 PageMethod.offsetPage 则适合于大数据量分页且不要求总数查询的情况。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐