背景
有一種場景,導出文件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。
所以並沒有接受這個返回值,不會產生大對象。
只是在查詢數據的過程中,處理了每一條數據,並沒有保存數據在內存中。