背景
有一种场景,导出文件100万条数据,如果直接mybatis把整个数据查询到list中。
那么,就有一个问题,如果数据量大的话,就会导致大对象,内存溢出(OOM)。
这个时候我们就可以利用Mybatis中的ResultHandler来处理。
ResultHandler接口
ResultHandler接口只有一个方法handleResult,这个方法的作用是:
我们可以在这里添加处理每一条(sql查询返回的每一条数据)数据的逻辑。
public class MyExport implements ResultHandler { @Override public void handleResult(ResultContext resultContext) { Object resultObject = resultContext.getResultObject(); System.out.println(resultObject.toString()); // TODO 在这里将每一条数据写入文件 } }
void selectVideoList(ResultHandler<Video> resultHandler);
<select id="selectVideoList" resultType="com.pig.model.Video">
select * from video limit 10
</select>
test方法
@SpringBootTest(classes = HApplication.class) @RunWith(SpringRunner.class) public class MainTest { @Autowired private VideoMapper videoMapper; @Test public void test() { MyExport export = new MyExport(); videoMapper.selectVideoList(export); System.out.println("ok"); } }
注意
sql查询接口的返回值,类型为void。
所以并没有接受这个返回值,不会产生大对象。
只是在查询数据的过程中,处理了每一条数据,并没有保存数据在内存中。