日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

MyBatis如何實現流式查詢的示例代碼

瀏覽:24日期:2023-10-24 09:14:53

基本概念

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

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

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

MyBatis 流式查詢接口

MyBatis 提供了一個叫 org.apache.ibatis.cursor.Cursor 的接口類用于流式查詢,這個接口繼承了 java.io.Closeable 和 java.lang.Iterable 接口,由此可知:

Cursor 是可關閉的; Cursor 是可遍歷的。

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

isOpen():用于在取數據之前判斷 Cursor 對象是否是打開狀態。只有當打開時 Cursor 才能取數據; isConsumed():用于判斷查詢結果是否全部取完。 getCurrentIndex():返回已經獲取了多少條數據

因為 Cursor 實現了迭代器接口,因此在實際使用當中,從 Cursor 取數據非常簡單:

cursor.forEach(rowObject -> {...});

但構建 Cursor 的過程不簡單

我們舉個實際例子。下面是一個 Mapper 類:

@Mapperpublic interface FooMapper { @Select('select * from foo limit #{limit}') Cursor<Foo> scan(@Param('limit') int limit);}

方法 scan() 是一個非常簡單的查詢。通過指定 Mapper 方法的返回值為 Cursor 類型,MyBatis 就知道這個查詢方法一個流式查詢。

然后我們再寫一個 SpringMVC Controller 方法來調用 Mapper(無關的代碼已經省略):

@GetMapping('foo/scan/0/{limit}')public void scanFoo0(@PathVariable('limit') int limit) throws Exception { try (Cursor<Foo> cursor = fooMapper.scan(limit)) { // 1 cursor.forEach(foo -> {}); // 2 }}

上面的代碼中,fooMapper 是 @Autowired 進來的。注釋 1 處調用 scan 方法,得到 Cursor 對象并保證它能最后關閉;2 處則是從 cursor 中取數據。

上面的代碼看上去沒什么問題,但是執行 scanFoo0() 時會報錯:

java.lang.IllegalStateException: A Cursor is already closed.

這是因為我們前面說了在取數據的過程中需要保持數據庫連接,而 Mapper 方法通常在執行完后連接就關閉了,因此 Cusor 也一并關閉了。

所以,解決這個問題的思路不復雜,保持數據庫連接打開即可。我們至少有三種方案可選。

方案一:SqlSessionFactory

我們可以用 SqlSessionFactory 來手工打開數據庫連接,將 Controller 方法修改如下:

@GetMapping('foo/scan/1/{limit}')public void scanFoo3(@PathVariable('limit') int limit) throws Exception { try ( SqlSession sqlSession = sqlSessionFactory.openSession(); // 1 Cursor<Foo> cursor =sqlSession.getMapper(FooMapper.class).scan(limit) // 2 ) { cursor.forEach(foo -> { }); }}

上面的代碼中,1 處我們開啟了一個 SqlSession (實際上也代表了一個數據庫連接),并保證它最后能關閉;2 處我們使用 SqlSession 來獲得 Mapper 對象。這樣才能保證得到的 Cursor 對象是打開狀態的。

方案二:TransactionTemplate

在 Spring 中,我們可以用 TransactionTemplate 來執行一個數據庫事務,這個過程中數據庫連接同樣是打開的。代碼如下:

@GetMapping('foo/scan/2/{limit}')public void scanFoo1(@PathVariable('limit') int limit) throws Exception { TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); // 1 transactionTemplate.execute(status -> {// 2 try (Cursor<Foo> cursor = fooMapper.scan(limit)) { cursor.forEach(foo -> { }); } catch (IOException e) { e.printStackTrace(); } return null; });}

上面的代碼中,1 處我們創建了一個 TransactionTemplate 對象(此處 transactionManager 是怎么來的不用多解釋,本文假設讀者對 Spring 數據庫事務的使用比較熟悉了),2 處執行數據庫事務,而數據庫事務的內容則是調用 Mapper 對象的流式查詢。注意這里的 Mapper 對象無需通過 SqlSession 創建。

方案三:@Transactional 注解

這個本質上和方案二一樣,代碼如下:

@GetMapping('foo/scan/3/{limit}')@Transactionalpublic void scanFoo2(@PathVariable('limit') int limit) throws Exception { try (Cursor<Foo> cursor = fooMapper.scan(limit)) { cursor.forEach(foo -> { }); }}

它僅僅是在原來方法上面加了個 @Transactional 注解。這個方案看上去最簡潔,但請注意 Spring 框架當中注解使用的坑:只在外部調用時生效。在當前類中調用這個方法,依舊會報錯。

以上是三種實現 MyBatis 流式查詢的方法。更多相關MyBatis 如何實現流式查詢內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品久久精品| 国产精品jk白丝蜜臀av小说| 久久在线91| 久久av影院| 国产精品xxxav免费视频| 国产午夜久久av| 日韩不卡一区二区| 国产亚洲一区二区三区不卡| 久久精品国产99国产精品| 国产精品三级| 国产中文在线播放| 久久九九精品| 在线日韩成人| 国产精品黄色片| 久久精品1区| 香蕉久久一区| 狠狠久久伊人| 欧美精品一区二区久久| 综合激情一区| 欧美国产极品| 欧美理论视频| 中文字幕av一区二区三区人| 国产欧美丝祙| 1024精品久久久久久久久| 亚洲欧美日韩专区| 日韩午夜av在线| 久久国产精品色av免费看| 日韩综合一区二区三区| 美日韩一区二区三区| 精品视频网站| 亚洲精品91| 精品一区不卡| 国产亚洲电影| 国产精品久久久久久久久久齐齐 | 福利在线一区| 麻豆视频久久| 97在线精品| 欧美高清不卡| 久久国产精品久久久久久电车| 蜜臀久久99精品久久久久宅男| 在线一区二区三区视频| 91欧美精品| 高清一区二区| 国产午夜精品一区在线观看| 99国产精品自拍| 亚洲www啪成人一区二区| 国产精品地址| 国产毛片精品| 欧美亚洲人成在线| 亚洲一区二区动漫| 免费不卡中文字幕在线| 久久久国产精品一区二区中文| 久久久久伊人| 欧美精品二区| 久久精品国产成人一区二区三区| 欧美亚洲综合视频| 婷婷精品在线观看| 日本久久一区| 国产剧情一区| 精品国产aⅴ| 国产一区二区三区不卡视频网站 | 日韩黄色av| 久久国产66| 日韩在线观看一区二区| 午夜一区在线| 亚洲精品免费观看| 日本一不卡视频| 蜜桃久久久久久| 日本99精品| 国产精品99精品一区二区三区∴| 国产欧美一区| 成人高清一区| 不卡在线一区二区| 蜜桃av一区二区在线观看| 亚洲精品在线a| 国产精品片aa在线观看| 国产盗摄——sm在线视频| 1024精品久久久久久久久| 天堂精品久久久久| 2023国产精品久久久精品双| 麻豆精品在线| 综合激情网...| 精品国产99| 免费人成精品欧美精品| 久草免费在线视频| 国产色噜噜噜91在线精品| 91精品国产乱码久久久久久久 | 日韩精品久久理论片| 精品99在线| 日韩精品1区2区3区| 尤物tv在线精品| 欧美国产美女| 国产精品115| 欧美专区在线| 久久亚洲二区| 欧美1区2区3区| 麻豆mv在线观看| 精品国产乱码久久久| 国产欧美日韩在线观看视频| 麻豆亚洲精品| 亚洲丝袜美腿一区| 伊人久久一区| 亚洲精品动态| 日韩制服丝袜先锋影音| 欧美精品激情| 亚洲精品午夜av福利久久蜜桃| 中文字幕在线看片| 久久婷婷av| 日韩久久精品| 欧洲在线一区| 亚洲国产综合在线看不卡| 九九久久电影| 石原莉奈在线亚洲二区| 蜜桃传媒麻豆第一区在线观看| 女同性一区二区三区人了人一| 激情五月综合| 男人天堂欧美日韩| 视频一区日韩精品| 91嫩草精品| 久久久久久色 | 国产午夜久久av| 日韩国产一二三区| 国产精品一在线观看| 国产情侣久久| 国产成人77亚洲精品www| 999久久久亚洲| 蜜臀av在线播放一区二区三区| 亚洲伊人精品酒店| 欧美激情99| 视频小说一区二区| 亚洲a成人v| 中文在线а√天堂| 色一区二区三区四区| 国产精品最新自拍| 日韩在线黄色| 久久亚州av| 日本特黄久久久高潮| 伊人久久成人| 激情欧美丁香| 久久精品成人| 亚洲精品成人图区| 欧美黑人做爰爽爽爽| 欧美日本不卡| 蜜臀精品久久久久久蜜臀| 欧美日韩中文一区二区| 精品久久福利| 麻豆一区二区三区| 国产精品免费大片| 午夜久久av| 九一精品国产| 999视频精品| 国产一区二区色噜噜| 久久午夜影视| 欧美sss在线视频| 国产精品极品| 日韩精品一区二区三区av | 91久久久久| 亚洲黄色网址| 欧美日一区二区在线观看| 国产视频一区三区| av中文字幕在线观看第一页| 日韩av影院| 亚洲一区av| 日韩精品一级中文字幕精品视频免费观看| 黄在线观看免费网站ktv| 国产精品一二| 国产精品伦一区二区| 国产剧情一区| **爰片久久毛片| 国产乱子精品一区二区在线观看 | 欧美成人aaa| 欧美久久亚洲| 欧美亚洲福利| 国产精品亚洲综合色区韩国| 日韩av中文在线观看| 日本aⅴ免费视频一区二区三区| 影音先锋久久精品| 欧美综合精品| 久久av偷拍| 欧美aa一级| 激情欧美日韩一区| 水野朝阳av一区二区三区| 日韩中文字幕区一区有砖一区| 在线精品视频一区| 日本成人在线不卡视频| 青青伊人久久| 国产精品久久久久久久久久10秀| 亚洲国产福利| 黄色不卡一区| 婷婷精品在线| 麻豆一区二区三| 亚洲综合电影| 国产模特精品视频久久久久| 欧美偷窥清纯综合图区| 日韩在线观看| 中文无码久久精品| 国产欧美日韩免费观看| 91精品啪在线观看国产18| 69堂免费精品视频在线播放| 卡一精品卡二卡三网站乱码|