使用Mybatis中的ResultHandler

1,440 阅读1分钟

有一种场景,导出文件100万条数据,如果直接mybatis把整个数据查询到list中,那么,就会有一个问题,如果数据量大的话,就会导致大对象,内存溢出(OOM),这个时候我们可以利用Mybatis中的ResultHandler来处理。

按照我们常有的逻辑:

查询所有用户:

在UserMapper.xml,当然了,常用的是分页查询,这里查询所有假设用在导出场景,并且建议不要用select *

<select id="getAllUser" resultType="component.pojo.User">
    select * from User
</select>

UserMapper.java

List<User> getAllUser();

UserService.java

public void getAllUser() {
   List<User> userList = UserMapper.getAllUser();
   // 各种业务
}

然后就是导致容易OOM

那么我们现在改为用Mybatis的游标ResultHandler(Mybatis好像还有别的游标用法,我也没具体研究,只是这里是刚好遇到的情况)

在UserMapper.xml层面不变

<select id="getAllUser" resultType="component.pojo.User">
    select * from User
</select>

UserMapper.java就要改变了,返回值必须为void,ResultHandler用在参数里面

void getAllUser(ResultHandler<User> resultHandler);

UserService.java

public void getAllUser() {
   UserMapper.getAllUser(new ResultHandler<User>() {
    @Override
    public void handleResult(ResultContext<? extends ParkingLockDevice> resultContext) {
       // 各种业务,从数据库查询到的数据也可以直接从resultContext中获取
        }
    });
}

这篇文章主要是我在遇到某个表拿取全部数据的问题,原本是直接取,后来担心OOM,于是乎使用了Mybatis的游标,但是并没有深究其底层。