MyBatis本身有分页查询,但是并不是正真的分页查询,它是把数据查出来放在内存里面,你想要什么就给你什么。我们使用MyBatis实现分页查询的时候,是要实现真分页查询,就是要用sql语句来实现分页查询。
有两种翻页方式,一种是逻辑翻页(假分页),一种是物理翻页(真分页)。逻辑翻页的原理是把所有数据查出来,在内存中删选数据。物理翻页是真正的翻页,比如MySQL使用limit语句,Oracle使用ROWNUM语句,SQLServer使用top语句。
逻辑分页
MyBatis里面有一个逻辑分页对象RowBounds,里面主要有两个属性,offset 和limit (从第几条开始,查询多少条)。
我们可以在Mapper接口的方法上加上这个参数,不需要修改xml里面的 SQL语句。
public List selectBlogList(RowBounds rowBounds);
使用:MyBatis-standalone- MyBatisTest-testSelectByRowBounds ()
int start=10; // offset,从第几行开始查询
int pageSize = 5; // limit,查询多少条
RowBounds rb = new RowBounds(start, pageSize);
List list = mapper.selectBlogList(rb);
for(Blog b :list) {
System. out. println(b);
}
它的底层其实是对ResultSet的处理。它会舍弃掉前面offset条数据,然后再取剩下的数据的limit条。
// DefaultResultSetHandler.java
private void handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap resuItMap, ResultHandler<? > resuItHandler, RowBounds rowBounds, ResultMapping parentMapping) throws SQLException {
DefaultResultContext