首先我们了解一下物理分页和逻辑分页
物理分页:直接从数据库中拿出我们需要的数据,例如在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代码实现分页功能的全文介绍,希望对您学习和使用数据库有所帮助.