1. 程式人生 > 實用技巧 >MyBatis 流式查詢

MyBatis 流式查詢

基本概念

流式查詢指的是查詢成功後不是返回一個集合而是返回一個迭代器,應用每次從迭代器取一條查詢結果。流式查詢的好處是能夠降低記憶體使用。

如果沒有流式查詢,我們想要從資料庫取 1000 萬條記錄而又沒有足夠的記憶體時,就不得不分頁查詢,而分頁查詢效率取決於表設計,如果設計的不好,就無法執行高效的分頁查詢。因此流式查詢是一個數據庫訪問框架必須具備的功能。

流式查詢的過程當中,資料庫連線是保持開啟狀態的,因此要注意的是:執行一個流式查詢後,資料庫訪問框架就不負責關閉資料庫連線了,需要應用在取完資料後自己關閉。

MyBatis 流式查詢介面

MyBatis提供了一個叫org.apache.ibatis.cursor.Cursor

的介面類用於流式查詢,這個介面繼承了java.io.Closeablejava.lang.Iterable介面,由此可知:

1、Cursor 是可關閉的;

2、Cursor 是可遍歷的。

除此之外,Cursor 還提供了三個方法:

1、isOpen():用於在取資料之前判斷 Cursor 物件是否是開啟狀態。只有當開啟時 Cursor 才能取資料;

2、isConsumed():用於判斷查詢結果是否全部取完。

3、getCurrentIndex():返回已經獲取了多少條資料

示例

@RestController
@Api(tags = "XcLogController")
@RequestMapping(
"/xc_log") @Slf4j public class XcLogController { @Resource private XcLogMapper xcLogMapper; @ApiOperation("流式查詢") @RequestMapping(value = "/streamQuery", method = RequestMethod.GET) @Transactional public List<XcLog> streamQuery(XcLog xcLog) { log.info("/xc_log/streamQuery");
// return xcLogMapper.streamQuery(xcLog); try (Cursor<XcLog> cursor = xcLogMapper.streamQuery(xcLog)) { cursor.forEach(t -> { // log.info(t.toString()); }); } catch (IOException e) { e.printStackTrace(); } return null; } }
public interface XcLogMapper {

    Cursor<XcLog> streamQuery(XcLog xcLog);

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xc.xcspringboot.mapper.xcLog.XcLogMapper">

    <resultMap id="XcLogResultMap" type="com.xc.xcspringboot.model.xcLog.XcLog">
        <result column="id" property="id"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="is_delete" property="isDelete"/>
    </resultMap>

    <select id="streamQuery" resultMap="XcLogResultMap" fetchSize="100">
        select *
        from xc_log
    </select>


</mapper>

參考文章:https://segmentfault.com/a/1190000022478915