MyBatis 流式查詢


基本概念

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

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

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

 

MyBatis 流式查詢接口

MyBatis 提供了一個叫 org.apache.ibatis.cursor.Cursor 的接口類用於流式查詢,這個接口繼承了 java.io.Closeable 和 java.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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM