Mybatis游标Cursor查询

通常对一张表中大量数据处理时由于数据量太大都要使用分页分批查询处理,否则数据量太大会导致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);
    });
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值