skipRows方法是mybatis用来跳过前面多少行,也就是它支持你在查询的时候可以跳过前面的多少数据,还是先来看下怎么使用,再看下到底出了问题
使用
public static void main(String[] args) throws Exception{
//获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = FactoryUtils.sqlSessionFactory();
//打开SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql语句,RowBounds跳过前面100行
List<User> userList = sqlSession.selectList("com.zxc.study.test.mapper.UserMapper.selectUser", 1, new RowBounds(100, RowBounds.NO_ROW_LIMIT));
//操作返回结构
System.out.println(userList);
}
}
使用还是比较简单的,就是跳过你指定的多少行,默认可以不传就是不会跳过,我们一般也很少用这个
跳过代码
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#skipRows
private void skipRows(ResultSet rs, RowBounds rowBounds) throws SQLException {
if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {
if (rowBounds.getOffset() != RowBounds.NO_ROW_OFFSET) {
rs.absolute(rowBounds.getOffset());
}
} else {
for (int i = 0; i < rowBounds.getOffset(); i++) {
rs.next();
// System.out.println("第" + i + "次结果为" + rs.next());
}
}
}
可以看到处理逻辑并不难,注释的代码是我返回的
可能存在的问题?
打印语句 System.out.println("第" + i + "次结果为" + rs.next()); 这个放出来的时候,会发现一个问题,当数据库只有一行数据,但是要跳过100行的时候,这个时候整个循环还是会一直去调用方法的
问题是当跳过1行数据以后调用rs.next()方法就返回false了,第一次是返回true,那么是不是可以在返回false的时候就直接跳出循环了,不用再去循环调用了,因为数据不可能中间有嵌套问题吧?
只是对rs.next()这个api不是很了解,而且也不知道数据有没有可能出现断层的情况,不过这个问题有可能是可以跳过的
以下的图就更好说明这个问题了