title: 使用分页插件的后悔药 tags:
- 分页
- mybatis
- pagehelper
- count
- Mybatis-PageHelper categories: mybatis date: 2017-12-18 10:10:37
背景
虽然大家都在使用分页,但是某些场景下我们仍然会有不分页的需求,比如某些基础表等等
分页插件使用的是github.com/pagehelper/…
实现
关于分页的第一页众说纷纭,有人是从0开始有人从1开始。在此我们规定从1开始。
这样和PageHelper保持一致 正常做分页的逻辑时:查询count 根据count是否大于0查询 记录
当我们不需要分页的情况下 ,通常我们也不需要知道数据有多少条【即count】
那么其实sql语句不需要count
因此归纳三种场景
- 需要count 需要 limit
- 需要limit 不需要 count
- 不需要count 不需要 limit
需要count 不需要limit的场景很少【因为不limit的时候size就是count数 自然不需要再做一遍查询】
需要count 需要 limit
这个是最正常的需求 我们不需要做任何特殊配置 只需要记住pageIndex从1开始【我们会自动纠错将0重新修改成1】
需要limit 不需要 count
这种需求也很常见 比如在移动端的情况下 通常只有下拉操作移动端分页探索
那么完全不需要count数据即可 此时设置so的参数enableCount=false即可
我们会将该参数传入到pageHeler分页插件中
Page<Object> page = PageHelper.startPage(so.getCurrentPage(), so.getPageSize(), so.isEnableCount());
复制代码
不需要count 不需要 limit
这个是执行原有逻辑 那么我们可以考虑传递特殊参数进入分页插件
分页插件考虑了此种场景 。首先enableCount要传递成false这样就不会执行count
分页插件提供了pageSizeZero参数来进行控制
public Page getPage(Object parameterObject, RowBounds rowBounds) {
Page page = getLocalPage();
if (page == null || page.isOrderByOnly()) {
Page oldPage = page;
//这种情况下,page.isOrderByOnly()必然为true,所以不用写到条件中
if ((rowBounds == null || rowBounds == RowBounds.DEFAULT) && page != null) {
return oldPage;
}
if (rowBounds != RowBounds.DEFAULT) {
if (offsetAsPageNum) {
page = new Page(rowBounds.getOffset(), rowBounds.getLimit(), rowBoundsWithCount);
} else {
page = new Page(new int[]{rowBounds.getOffset(), rowBounds.getLimit()}, rowBoundsWithCount);
//offsetAsPageNum=false的时候,由于PageNum问题,不能使用reasonable,这里会强制为false
page.setReasonable(false);
}
} else {
try {
page = getPageFromObject(parameterObject);
} catch (Exception e) {
return null;
}
}
if (oldPage != null) {
page.setOrderBy(oldPage.getOrderBy());
}
setLocalPage(page);
}
//分页合理化
if (page.getReasonable() == null) {
page.setReasonable(reasonable);
}
//当设置为true的时候,如果pagesize设置为0(或RowBounds的limit=0),就不执行分页,返回全部结果
if (page.getPageSizeZero() == null) {
page.setPageSizeZero(pageSizeZero);
}
return page;
}
复制代码
当pageSizeZero为true就不执行分页了
private Page(int pageNum, int pageSize, boolean count, Boolean reasonable) {
super(0);
if (pageNum == 1 && pageSize == Integer.MAX_VALUE) {
pageSizeZero = true;
pageSize = 0;
}
this.pageNum = pageNum;
this.pageSize = pageSize;
this.count = count;
calculateStartAndEndRow();
setReasonable(reasonable);
}
复制代码
当
pageNum == 1 && pageSize == Integer.MAX_VALUE 时 此时会将pageSizeZero设置为true 那么自然也会执行不分页操作。
复制代码
使用
前端当使用so进行序列化是如果选择enableCount=false 此时将不会执行count
如果pageNum位1 并且pageSize为Integer.MAX_VALUE 此时将不分页!