MyBatis中ResultHandler的使用

背景   

  有一种场景,导出文件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。

  所以并没有接受这个返回值,不会产生大对象。

  只是在查询数据的过程中,处理了每一条数据,并没有保存数据在内存中。

 

 

 

 


posted @ 2019-11-05 21:37  ~~~~~~~~~~~~~  阅读(12269)  评论(0编辑  收藏  举报