分页助手踩坑

分页助手原理

当调用 PageHelper.startPage(pageNum, pageSize) 方法时,PageHelper 会拦截接下来执行的 SQL 查询,并根据传入的 pageNum 和 pageSize 参数自动生成分页的 SQL 语句。

PageHelper 使用 ThreadLocal 来保存分页参数,确保线程安全。

在拦截到的 SQL 语句后面自动追加了分页的 SQL 片段,例如 MySQL 数据库中的 LIMIT 语句,用于限制查询结果的起始位置和数量。

执行分页查询后,PageHelper 会返回一个 Page 对象,其中包含了分页后的查询结果、总记录数、总页数等信息。

PageHelper 的分页原理可以简化分页查询的操作,避免手动编写分页 SQL 语句。通过集成 PageHelper,你只需要调用 PageHelper.startPage(pageNum, pageSize) 方法,并执行查询语句,就可以得到分页后的结果。

需要注意的是,PageHelper 是基于物理分页的实现,它会在查询时执行额外的统计总记录数的查询,可能会对性能产生一定影响。如果对性能要求较高,可以考虑使用其他分页解决方案或自行编写分页查询逻辑。

也就是说,分页助手是无法分页普通集合的,只能分页接下来拦截的SQL的查询结果,并且如果有多个SQL查询,只能拦截一个,所以在对普通集合进行分页或者有多个SQL查询时需要手动分页

以下是一个手动分页的示例:

 /*
     * 我的所有文章的评论
     * */
    @Override
    public PageInfo<comment> comment(Integer pageNum, int pageSize) {
        //获取用户信息
        Subject subject = SecurityUtils.getSubject();
        userDto user = (userDto) subject.getPrincipal();
    List&lt;comment&gt; picturesComment = commentMapper.picturesComment(Long.valueOf(user.getId()));//图片文章评论
    List&lt;comment&gt; strategyComment = commentMapper.strategyComment(Long.valueOf(user.getId()));//攻略文章评论
    List&lt;comment&gt; storyComment = commentMapper.storyComment(Long.valueOf(user.getId()));//广场文章评论
//将3个查询结果的集合合并为1个
List&amp;lt;comment&amp;gt; commentList = new ArrayList&amp;lt;&amp;gt;();
commentList.addAll(picturesComment);
commentList.addAll(strategyComment);
commentList.addAll(storyComment);

// 对合并出来的集合按照 update_time 属性降序排列 commentList.sort(Comparator.comparing(comment::getUpdateTime).reversed());

int total = commentList.size(); //数据总条数 int fromIndex = (pageNum - 1) * pageSize; //截止当前页码数的所有数据条数 int toIndex = Math.min(fromIndex + pageSize, total); //分页查询中的结束索引位置

List&amp;lt;comment&amp;gt; pagedCommentList = commentList.subList(fromIndex, toIndex); //调用subList进行分页

PageInfo&amp;lt;comment&amp;gt; pageInfo = new PageInfo&amp;lt;&amp;gt;(); pageInfo.setList(pagedCommentList); //存入合并出来的集合 pageInfo.setTotal(total); //存入数据总条数 pageInfo.setPageNum(pageNum); //存入当前页码数 pageInfo.setPageSize(pageSize); //存入一页有多少条数据

// 计算总页数 int totalPages = (int) Math.ceil((double) total / pageSize);

// 判断是否有上一页和下一页 boolean hasPreviousPage = pageNum &amp;gt; 1; boolean hasNextPage = pageNum &amp;lt; totalPages;

//将是否有上一页下一页的信息存入pageInfo对象中 pageInfo.setHasPreviousPage(hasPreviousPage); pageInfo.setHasNextPage(hasNextPage);

return pageInfo;

}

end
SpringBoot
MySQL
MyBatisPlus

评论区

暂无评论