如何将 myBatis(iBatis) 结果作为 Iterable 获取。(如果行非常大)

use*_*838 3 java database jdbc mybatis

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

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

因此,我想使用 myBatis 获取 ResultSet 或 Iterable<MyObject> 类型的结果。

告诉我任何解决方案。

Rom*_*val 5

从mybatis 3.4.1开始,你可以返回CursorIterable可以这样使用(在结果是有序的情况下,Cursor详细信息请参见上面的API java doc):

MyEntityMapper.java

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

MapperClient.java

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