tofacebook.com -专业IT技术社区(指牛堂) MyBatis中ResultHandler的使用 - 指牛堂-专业IT技术平台
429°

MyBatis中ResultHandler的使用

背景   

  有一种场景,导出文件500万条数据,如果直接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(&quot;ok&quot;);
}

}

注意

  sql查询接口的返回值,类型为void。

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

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

已有 0 条评论

    我有话说: