PageHelper 插件。下一页一直有数据 并且是最后的数据

PageHelper的使用

情况描述

本人数据库有3条数据,前端传值pageNum=1, pageSize=2,结果没有问题。心血来潮 pageNum填了10, pageSize填了2 ,可是还是有数据。
我想要的结果是下一页直接不给数据。
看了打印的sql语句给的是4 和2 。这边在家里,出现问题的东西在公司 就不截图了。
于是我就想,肯定跟pageNum有关系。利用ctrl+shift+g 一直到处找
于是在page类中找到了以下的代码:

   public void setTotal(long total) {
        this.total = total;
        if (total == -1) {
            pages = 1;
            return;
        }
        if (pageSize > 0) {
            pages = (int) (total / pageSize + ((total % pageSize == 0) ? 0 : 1));
        } else {
            pages = 0;
        }
        //分页合理化,针对不合理的页码自动处理
        //传入的pageNum 大于pages(pages代表实际数据库中所能分的最大页数)时, 就给参数设置为pages
        if ((reasonable != null && reasonable) && pageNum > pages) {
            pageNum = pages;
            calculateStartAndEndRow();
        }
    }
   public Page setReasonable(Boolean reasonable) {
        if (reasonable == null) {
            return this;
        }
        this.reasonable = reasonable;
        //分页合理化,针对不合理的页码自动处理
        //如果起始页码小于0 就赋初值 1
        if (this.reasonable && this.pageNum <= 0) {
            this.pageNum = 1;
            calculateStartAndEndRow();
        }
        return this;
    }

// 修改sql 部分
  if (page.getPageSize() > 0 &&
                    ((rowBounds == RowBounds.DEFAULT && page.getPageNum() > 0)
                            || rowBounds != RowBounds.DEFAULT)) {
                //将参数中的MappedStatement替换为新的qs
                page.setCountSignal(null);
                BoundSql boundSql = ms.getBoundSql(args[1]);
                args[1] = parser.setPageParameter(ms, args[1], boundSql, page);
                page.setCountSignal(Boolean.FALSE);
                //执行分页查询
                Object result = invocation.proceed();
                //得到处理结果
                page.addAll((List) result);
            }
        } finally {
            ((PageSqlSource)ms.getSqlSource()).removeParser();
        }

结论修改reasonable=false 就行 这样就不走那个判断了, pagehelper.reasonable=false. 但是reasonable默认为null, 即 不走那个循环的。如果出现了合理化数据,很大的可能是配置里面设置为true了

还有pageHelper 只对pageHelper.startPage()方法下面紧跟着的第一条语句分页。

最后一个注意的要点是(我忘了在哪里看到了,但是觉得没问题):

PageHelper.startPage(page,rows);
if( count>1){
mapper.select();
}

第一次count 给0 page 给1 rows 给6;无返回数据
第二次count 给3 page 给2 rows给8 有返回数据,但是分页按page 为1 rows为6 分页的。
问题就是当PageHelper.startPage(page,rows); 调用了但是没有使用,就会放缓存里, 下次调用从缓存拿出来。

你可能感兴趣的:(源码分析)