今天调试app 接口的时候 发现服务端分页出现问题,特此记录一下查看解决问题过程。
- 分页插件Git 地址:https://gitee.com/free/Mybatis_PageHelper
- 出现的问题:没有那么多数据,但是获取重复数据。通过下一页数据仍然获取之前的数据。
- 源码分析:
首先进入到分页插件拦截器一步一步查看源码,关键点在于这里setTotal
当你分页的数据 超过总数据,正常我们写sql 是返回空,但是通过插件返回的是前面的数据。通过setTotal 发现 pageSize 大于0 但是pages = (int) (total / pageSize + ((total % pageSize == 0) ? 0 : 1)); 算出后覆盖我们之前的当前页参数。导致查出的数据依然是前面的数据。
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;
}
//分页合理化,针对不合理的页码自动处理
if ((reasonable != null && reasonable) && pageNum > pages) {
pageNum = pages;
calculateStartAndEndRow();
}
}
@Override
public boolean afterCount(long count, Object parameterObject, RowBounds rowBounds) {
Page page = getLocalPage();
page.setTotal(count);
if (rowBounds instanceof PageRowBounds) {
((PageRowBounds) rowBounds).setTotal(count);
}
//pageSize < 0 的时候,不执行分页查询
//pageSize = 0 的时候,还需要执行后续查询,但是不会分页
if (page.getPageSize() < 0) {
return false;
}
return count > 0;
}
@Override
public String getPageSql(String sql, Page page, CacheKey pageKey) {
StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);
sqlBuilder.append(sql);
if (page.getStartRow() == 0) {
sqlBuilder.append(" LIMIT ? ");
} else {
sqlBuilder.append(" LIMIT ?, ? ");
}
pageKey.update(page.getPageSize());
return sqlBuilder.toString();
}
- 解决方案
在app 端 加载下一页的时候 比较total 和 pageSizepageNo
如果 pageSizepageNo < total 继续请求。否则停止加载。