常见Mybatis流式读取Mysql数据有以下2种形式:
一种是通过ResultHandler<T>接口,另一个是通过Cursor<T>接口。
具体这两种方式有什么区别,暂时没有研究,只记录demo代码作为案例。
第一种ResultHandler<T>:
Mapper.xml文件:
这里注意需要加
resultSetType="FORWARD_ONLY" fetchSize="-2147483648"
为什么要加这个属性,暂时没研究。
<select id="streamQuery" resultSetType="FORWARD_ONLY" fetchSize="-2147483648" resultMap="ResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM
table_name
WHERE 1=1
<if test="field != null and field != ''">
AND field=#{field}
</if>
</select>
DAO.java类:
void streamQuery (@Param("field") String field, ResultHandler<DO> resultHandler);
ServiceImpl.java类:
@Override
public void streamQuery() {
DOMapper.streamQuery("", resultContext -> {
DO do = resultContext.getResultObject();
System.out.println("==:" + JSON.toJSONString(do));
});
}
接下来是Cursor<T>:
Mapper.xml:
<select id="streamQuery" resultMap="ResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM
table_name
WHERE 1=1
<if test="field != null and field != ''">
AND field=#{field}
</if>
</select>
DAO.java:
Cursor<DO> streamQuery(@Param("field") String field);
ServiceImpl.java:
@Override
public void streamQuery() throws IOException {
String field = "xxx";
try (SqlSession sqlSession = sqlSession.openSession();
Cursor<DO> cursor = sqlSession.getMapper(DOMapper.class).streamQuery(field);
) {cursor.forEach( do -> {
System.out.println("=====:" + JSON.toJSONString(do));
});
}
}