MyBatis 流式查詢
阿新 • • 發佈:2020-12-21
基本概念
流式查詢指的是查詢成功後不是返回一個集合而是返回一個迭代器,應用每次從迭代器取一條查詢結果。流式查詢的好處是能夠降低記憶體使用。
如果沒有流式查詢,我們想要從資料庫取 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