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<E> 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); 调用了但是没有使用,就会放缓存里, 下次调用从缓存拿出来。