通常对一张表中大量数据处理时由于数据量太大都要使用分页分批查询处理,否则数据量太大会导致OOM等问题。
Cursor查询适用于这种场景下可以替代分页查询的方案,Cursor实现了Closeable和Iterable接口,我们可以通过迭代器来获取数据进行处理。
public interface Cursor<T> extends Closeable, Iterable<T> {
boolean isOpen();//用于在取数据之前判断 Cursor 对象是否是打开状态。只有当打开时 Cursor 才能取数据
boolean isConsumed();//判断查询结果是否全部取完
int getCurrentIndex();//返回已经获取了多少条数据
}
使用Cursor处理数据
Mapper方法:返回一个Cursor类型的包装对象
@Mapper
public interface RecordMapper{
@Select("select * from record")
Cursor<Record> getAllRecord();
}
业务实现类
注意要使用@Transactional注解来维持数据库连接,否则当recordMapper查询结束后数据库连接就会断开,Cursor就取不到数据了
@Transactional
public void doRecord() throws Exception {
Cursor<Foo> cursor = recordMapper.getAllRecord();
cursor.forEach(record-> {
System.out.println(record);
});
}