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

时间:2015-02-12 02:52:03

标签: java database jdbc mybatis

使用myBatis时,我应该从DB获得非常大的结果集并执行secuential操作。 (例如CSV导出)

我在想并担心如果返回类型为List,则所有返回的内存数据都将导致OutOfMemoryException。

所以,我希望将结果作为一种ResultSet或Iterable< MyObject>使用myBatis。

告诉我任何解决方案。

2 个答案:

答案 0 :(得分:2)

从mybatis 3.4.1开始,您可以返回Iterable Cursor并且可以像这样使用(在结果有序的情况下,请参阅上面的@Select({ "SELECT *", "FROM my_entity", "ORDER BY id" }) Cursor<MyEntity> getEntities(); API java doc了解详细信息):

MyEntityMapper.java

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

MapperClient.java

"use strict";

var FooService;

describe('The FooService', function () {
  beforeEach(function () {
    angular.mock.module('myApp');
  });

  beforeEach(angular.mock.inject(function (_FooService_) {
     FooService = _FooService_;
  }));

  it('should be able to return all bars', function() {
    let bars = FooService.getBars();
  });
});

答案 1 :(得分:0)

你应该使用fetchSize(参考here)。根据每行的堆大小和数据大小,您可以选择要从数据库中提取的结果集的数量。或者,因为基本上您使用数据导出到csv,您可以使用具有mybatis分页项目阅读器的spring批处理。虽然在每个页面之后为每个页面读取每个页面的请求被触发以获取下一页,这会增加数据库的负载。如果您不担心负载,可以继续使用分页项目阅读器。或者有一个简单的另一个项目阅读器叫做JdbccursorItem reader