最近在写需求的过程中接触到许多的分页,但是对于不同情况下会有不同的分页方法选择,由于目前使用得比较多的是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 则适合于大数据量分页且不要求总数查询的情况。