RowBounds代码实现分页功能

首先我们了解一下物理分页和逻辑分页

物理分页:直接从数据库中拿出我们需要的数据,例如在Mysql中使用limit

逻辑分页:从数据库中拿出所有符合要求的数据,然后再从这些数据中拿到我们需要的分页数据

优缺点

物理分页每次都要访问数据库,逻辑分页只访问一次

物理分页占用内存少,逻辑分页相对较多

物理分页数据每次都是最新的,逻辑分页有可能滞后

我们再来看RowBounds,我们可以通过RowBounds对象来实现逻辑分页。

public List queryPushMessageByPage(RowBounds rowBounds);
wechatPushMessageDao.queryPushMessageByPage(new RowBounds(offset,limit));

RowBounds对象有2个属性,offset和limit。

offset:页码,第一页是1,

limit:页面多少条数据,比如一页12条

因此,取出来的数据就是:从第offset+1行开始,取limit行

Mybatis中使用RowBounds实现分页的大体思路:

先取出所有数据,然后游标移动到offset位置,循环取limit条数据,然后把剩下的数据舍弃。

private void handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler resultHandler, RowBounds rowBounds, ResultMapping parentMapping) throws SQLException {
        DefaultResultContext resultContext = new DefaultResultContext();
        this.skipRows(rsw.getResultSet(), rowBounds);  //游标跳到offset位置
        //取出limit条数据
        while(this.shouldProcessMoreRows(resultContext, rowBounds) && rsw.getResultSet().next()) {
            ResultMap discriminatedResultMap = this.resolveDiscriminatedResultMap(rsw.getResultSet(), resultMap, (String)null);
            Object rowValue = this.getRowValue(rsw, discriminatedResultMap);
            this.storeObject(resultHandler, resultContext, rowValue, parentMapping, rsw.getResultSet());
        }

    }
private void skipRows(ResultSet rs, RowBounds rowBounds) throws SQLException {
        if (rs.getType() != 1003) {
            if (rowBounds.getOffset() != 0) {
                rs.absolute(rowBounds.getOffset());
            }
        } else {     //从头开始移动游标,直至offset位置
            for(int i = 0; i < rowBounds.getOffset(); ++i) {
                rs.next();
            }
        }

    }

以上就是RowBounds代码实现分页功能的全文介绍,希望对您学习和使用数据库有所帮助.

猜你喜欢

转载自blog.csdn.net/bingguang1993/article/details/86638924