这两两天由于工作需要,对mybatis分页进行研究,现进行记录,主要从一下两个方面阐述。博主用的数据库是oracle,所以以下分页都是针对oracle的,mybatis版本是3.3.0
一.mybatis自带分页功能的效率与物理分页的效率对比
1.mybatis自带分页功能
通过查找资料,mybatis分页是逻辑分页,如果数据量大会造成内存溢出.mybatis自带分页实现如下
dao层代码
public List<WorkflowRecord> queryByMybatis(int startRow, int endRow) {
RowBounds rowBounds = new RowBounds(startRow,endRow);
System.out.println("rowBounds Offset:"+rowBounds.getOffset());
System.out.println("rowBounds Limit:"+rowBounds.getLimit());
WorkflowRecord workflowRecord=new WorkflowRecord();
return sqlSessionTemplate.selectList(QUERY_BY_MYBYTAIS,workflowRecord,rowBounds);
}
对应的sql为
<select id="queryByMybatis" resultMap="proRecResult">
select * from T_PROREC
</select>
其中RowBounds的源码为
红线部分为默认值 下文还会提到,RowBounds的两个属性offset,limit;
offset:从第n条开始取;limit:取多少条
2.物理分页
dao层代码
@Override
public List<WorkflowRecord> queryBySql(int startRow, int endRow) {
Map<String, Object> params =new HashMap<String, Object>();
params.put("startRow", new Integer(startRow));
params.put("endRow", new Integer(endRow));
return sqlSessionTemplate.selectList(QUERY_BY_SQL, params);
}
对应sql
<select id="queryBySql" resultMap="proRecResult">
select *
from (SELECT ROWNUM r, t1.*
from (
selec