基本概念
流式查詢指的是查詢成功后不是返回一個集合而是返回一個迭代器,應用每次從迭代器取一條查詢結果。流式查詢的好處是能夠降低內存使用。
如果沒有流式查詢,我們想要從數據庫取 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