如何将 myBatis(iBatis) 结果作为 Iterable 获取。 (在非常大的行的情况下)

How to get myBatis(iBatis) result as Iterable. (in case of very large rows)

当使用myBatis 时,我应该从数据库中获取非常大的结果集并进行后续操作。 (例如 CSV 导出)

我在想,也担心如果return类型是List,所有returned数据都在我的内存中,会导致OutOfMemoryException。

所以,我想使用 myBatis 获得 ResultSet 或 Iterable 类型的结果。

告诉我任何解决方案。

你应该使用fetchSize(参考here)。根据每行的堆大小和数据大小,您可以 select 要从数据库中获取的结果集的数量。或者,由于基本上您使用的是将数据导出到 csv,因此您可以使用 spring 具有 mybatis 分页项 reader 的批处理。尽管此项 reader 中的缺点是在每一页之后都会触发一个请求以获取下一页,这会增加数据库的负载。如果您不担心负载,您可以继续使用分页项目 reader。或者有另一个简单的项目 reader 称为 JdbccursorItem reader

从mybatis 3.4.1开始可以return Cursor也就是Iterable可以这样使用(在结果是有序的情况下,见上文Cursor API java 文档获取详细信息):

MyEntityMapper.java

@Select({
      "SELECT *",
      "FROM my_entity",
      "ORDER BY id"
})
Cursor<MyEntity> getEntities();

MapperClient.java

MyEntityMapper mapper = session.getMapper(MyEntityMapper.class);
try (Cursor<MyEntity> entities = mapper.getEntities()) {
   for (MyEntity entity:entities) {
      // process one entity
   }
}