MyBatis-Plus 实现流式查询

836 阅读1分钟

我们在完成工作中会遇到大数据量的查询,比如大量数据的导出,我们直接用list() 方法去查询的话, 会很慢很卡,因为框架耗费大量的时间和内存去把数据库查询的大量数据封装成我们想要的实体类,在这个过程中很可能使我们的项目报内存溢出 OOM(out of memory) 的异常,所以这个时候我们可以采用myBatis-plus/myBatis 流式查询。

什么是流式查询?

流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果。流式查询的好处是能够降低内存使用。

流式查询的用处?

当查询出来的数据量特别大时,数据库驱动把加载到的数据全部加载到内存里,就有可能会导致内存溢出(OOM)。 当数据库数据过大,普通查询:

MyBatis-plus实现流式查询

定义Mapper

 @Select("select * from users t ${ew.customSqlSegment}")
 @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)
 @ResultType(User.class)
 void getOrgWithBigData(@Param(Constants.WRAPPER) QueryWrapper<User> wrapper, ResultHandler<User> handler);
​
  • ResultSetType.FORWARD_ONLY 表示游标只向前滚动
  • fetchSize 每次获取数据量

注意: 返回类型必须为void ,因为在handler里处理数据,所以这个hander 也是必须的

service

QueryWrapper<User> wrapper = new QueryWrapper<User>();
//wrapper.eq("id",1);
userMapper.getOrgWithBigData(wrapper,resultContext -> {
​
User orgData = resultContext.getResultObject();
    //这边循环调用就可以实现业务了
    System.out.println(orgData);
});