使用分页插件的后悔药


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

因此归纳三种场景

  1. 需要count 需要 limit
  2. 需要limit 不需要 count
  3. 不需要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 此时将不分页!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值