精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

iBATIS使用之高級查詢技術詳解

開發 后端
iBATIS使用之高級查詢技術iBATIS 是In Action之高級查詢技術的展現,那么本文就向你展示這項技術的內涵。

iBATIS In Action為iBATIS展現自己強大功能提供了保證,iBATIS也可以完成更為復雜的任務。在本章中,我們會了解新的技術,減少我們的編碼量;以及改善性能、降低資源消耗(footprint)的幾種方法。

1 使用iBATIS操作XML

譯者注:iBATIS的Java版本可以操作基于XML的數據。但意義并不是很大,在以后的版本中該特性可能會被移除。iBATIS.NET則未提供該功能。

2 使用映射語句關聯對象

iBATIS框架也提供了多種方法用以關聯復雜的對象,比如訂單(order)和它的訂單項(order item)(還有它們的相關產品、顧客等等)。每種方法都有其優點和缺點,正所謂“尺有所短,寸有所長”,每一種方案都不是完美的。應根據需要來選擇適合的方案。

注意:為簡短起見,在本章的余下的例子中,我們將省略那些對于演示來說不必要的數據。例如,當我們獲取了一個顧客(customer)對象,我們不會獲取它的所有字段,而是僅僅獲取它的主鍵和外鍵。

2.1 復雜的集合屬性

在第4章中,我們學習了如何使用SELECT語句從數據庫獲取數據。在那些例子中,我們獲取的結果僅僅是單個對象,即使是連接多表也是如此。事實上,如果您有多個復雜對象,也可以使用iBATIS加載它們。

如果我們的應用程序模型與數據模型比較類似,那么這個功能會很有用。可以考慮根據對象的關系(關聯)來定義數據模型,然后使用iBATIS將它們一起加載。例如,如果在數據庫中,Account記錄對應著相關的Order記錄,而Order又對應著相關的OrderItem記錄,可以為這些記錄建立關系,當我們請求一條Account記錄時,可以一并獲取所有的Order和OrderItem記錄。下面的代碼清單顯示了如何定義我們的SQL映射:

SQL映射 

圖1SQL映射

先來看看結果映射(result map,即上面的ResultAccountInfoMap,ResultOrderInfoMap和ResultOrderItemMap),前兩個Map都用到了select特性。這個特性告訴iBATIS,屬性的值將由另一個映射語句來設置,語句的名稱就是select特性的值。例如,我們執行getAccountInfoList語句時,ResultAccountInfoMap結果映射有一個子元素:

select特性的值 

圖2select特性的值

它的作用是告訴iBATIS,account對象的orderList屬性的值由ChgetOrderInfoList語句來設置,同時把accountId列的值傳給ChgetOrderInfoList作為參數。類似地,在設置order對象的orderItemList對象時,也會執行getOrderItemList語句。

這個功能給我們帶來便利的同時,也帶來了兩個問題。首先,創建包含大量對象的列表可能會消耗大量的內存。其次,這種方法會導致數據庫的I/O問題,其原因是所謂的“N+1 Select”現象,這個現象將在后面討論。對于每個問題,iBATIS框架都提供了解決方案,但是注意,沒有哪一種能同時解決這兩個問題。

數據庫I/O

數據庫I/O是數據庫使用狀況的一項指標,也是數據庫性能的主要瓶頸之一。在讀取或寫入數據庫時,數據必須要經歷從磁盤到內存或者從內存到磁盤的轉換,這個過程是比較耗時的。在程序中使用緩存可以減少對數據庫的訪問,但這種方法使用時要謹慎,否則也會引發問題。要了解iBATIS中的緩存機制,可以參看第10章的內容。

在使用關聯數據時,可能會遭遇數據庫I/O問題。考慮一下這個場景:有1000個Account,每一個關聯了1000個Order,而每個Order則包含25個OrderItem。如果嘗試將所有這些數據加載到內存,執行的SQL語句要超過1000000行(1條用來查詢Account,1000條用于Order,1000000條用于OrderItem),而創建的對象大約為2500萬——如果你真敢這么做,等你的系統管理員收拾你吧。

分析N+1查詢問題

N+1查詢問題是由于試圖加載多個父記錄(比如Account)的子記錄(Order)而引起的。因此,在查詢父記錄時,只需要1條語句,假設返回N條記錄,那么就需要再執行N條語句來查詢子記錄,引發所謂的“N+1查詢”。

這些問題的解決方案

延遲加載(Lazy load,在2.2中詳細講述)可以解決一部分內存問題,它將加載過程打散為一些更小的過程。但是,它并沒有解決數據庫I/O問題,在最壞的情況下,它對數據庫的訪問次數與非延遲加載的版本是一樣的,因為加載數據時它的方法還是N+1查詢(這個我們將在2.3中解決)。另一方面,當我們解決了N+1查詢問題,減少了對數據庫的訪問,但我們的查詢結果卻包含著2500萬行記錄!

要決定是否使用復雜屬性,我們需要理解數據庫以及應用程序對數據庫的使用方式。如果您使用了本節中的技術,那可以省不少事兒,但如果誤用了它,也會有大麻煩。在接下來的兩節中,我們會分析如何根據目標選擇合適的策略。

讓我們從這個問題開始:像上面例子那樣將Account關聯到Order并將Order關聯到OrderItem是否合適?實際上,不是——order-to-orderitem關系是固定的,但是account-to-order關系則是不必要的。

我們是如是推理的:沒有所屬的Order,OrderItem是沒有意義的,而Account則是有意義的。一般情況下,沒有OrderItem,Order沒什么大用,相對的,不屬于任何Order的OrderItem是沒有意義的。另一方面,一個Account則可以認為是一個完整的對象。

但在我們的例子中,這種關系可以良好地描述相關的技術,因此我們會在一段時間內一直使用它。

2.2 延遲加載(Lazy loading)

首先來看看延遲加載。如果不是對所有數據都馬上用到,那么延遲加載是有用的。例如,我們的程序首先在一個網頁顯示所有Account,然后銷售代理(我們的客戶)可以點擊一個Account來查看該Account的Order列表,然后可以再點擊一個Order來查看其所有的OrderItem信息。在這種情況下,每次都僅查詢一個列表。這是對延遲加載的合理使用。

譯注:在iBATIS的Java版本中,使用延遲加載前還需要進行配置SqlMapConfig.xml以打開該功能。在.NET版本中不需要配置等價的sqlMap.config。

使用了延遲加載后,我們就可以更合理地進行對象創建和對數據庫的訪問。(還是使用上面的例子)如果一個用戶關注到OrderItem層次的數據,我們需要進行三次查詢(一次是為Account,一次是Order,還有一次是OrderItem),應用程序則要創建2025個對象(1000個Account, 1000個Order,25個OrderItem)。效果明顯!而我們要做的僅僅是修改XML配置文件的一個特性(attribute)而已,無需改動代碼。

在一項不太嚴謹的測試中,我們發現,對于同樣的對象關聯關系(如上面的Account- Order- ORderItem),在加載第一個列表數據時(Account列表),沒有使用延遲加載的版本花費的時間是使用了延遲加載的版本的三倍。但是,在加載所有數據時,延遲加載的版本的時間卻多了20%。很明顯,我們要根據數據加載的數量和時機來確定是否采用延遲加載。此時,經驗是最重要的。

而有時您并不希望推遲數據的加載,而是希望在第一次請求的時候加載所有的數據。在這種情況下,您可以使用下節中的技術,它僅需要一次查詢即可。下節的方法避免了“N+1查詢”。

2.3 避免“N+1查詢”問題

我們來考慮如何避免“N+1查詢”問題,這里可以使用連接語句(Join)。

這里用到的技術同前面類似。簡單的說,使用Result Map來定義對象間的關系,將頂層的Result Map關聯到映射語句。下面的例子的Data Map文件結構與前面大體一致,但是只需要執行一條SQL語句。

這里面有三個Result Map,一是關于Account的,二是關于Order的,三是OrderItem的。

關于Account的Result Map有兩個作用:

映射Account對象本身的屬性。

告訴iBATIS如何映射下一層的關聯對象,這里是orderList。

Order的Result Map作用與之類似。

映射Order對象本身的屬性。

告訴iBATIS如何映射下一層的關聯對象,這里是orderItemList。

orderItemList 

圖3orderItemList

我們的不太科學的測試表明,在加載少量數據時,該方法將原先方法的性能提高為7:1。我們猜想,對于例子中使用的2500萬條數據,兩種方法仍然不錯。

譯注:在iBATIS.NET DataMapper 1.1中,添加了groupBy特性,它將進一步改善性能。詳細內容請參看相關文檔,本文使用的是DataMapper 1.5.1。

需要注意的是,盡管性能得到改善,內存的消耗仍然與沒有使用延遲加載的版本相同。所有的記錄一起放入內存,因此盡管它稍微快了一點,但內存的消耗仍是問題。

譯注:在加載復雜屬性時可能出現兩方面的問題,一是對數據庫的訪問,二是創建對象時對內存的消耗。我們可以采用延遲加載或Join的方法來解決這些問題,但是兩者都不是萬靈藥。延遲加載的原理時推遲對復雜屬性的加載,以減少對數據庫的訪問和對象的創建,但它的前提是復雜屬性不會馬上用到,否則的話,延遲就失去意義。Join的原理是通過一條SQL語句加載所有數據,這樣可以大幅度減少對數據庫的訪問量,它的前提是對象的數量不會太多。該如何選擇呢?下面的表格給出了簡單的原則:

簡單的原則 

圖4簡單的原則

譯注:另外,我覺得還有一條很重要的原則,那就是永遠只加載必需的數據。以上面的例子來說,我們不太可能會同時顯示1000個Account給用戶看,這時就不要同時加載1000個Account的數據了,可以通過分頁只顯示50條數據,在此基礎上再應用延遲加載或Join效果會很不錯。關于在Web項目中如何使用iBATIS進行分頁,請參看這篇文章。

關于iBATIS使用的相關以及復雜屬性映射相關的內容就介紹到這里,希望對你有所幫助。

【編輯推薦】

  1. iBATIS是什么?
  2. iBATIS的優、缺點及注意事項淺談
  3. iBATIS不適合使用的四種情況淺析
  4. iBATIS發展方向的四方面淺析
  5. iBATIS快速創建應用淺析
責任編輯:仲衡 來源: 互聯網
相關推薦

2010-05-27 17:57:09

Svn使用入門

2011-08-12 09:30:04

SQL Server數高級SQL查詢

2015-05-04 14:51:49

SQL子查詢

2022-01-12 08:10:40

APISIXIngress Url Rewrite

2009-07-15 11:43:13

<iterate>標簽

2022-02-23 21:10:53

LonghornKubernetes快照

2009-08-11 13:20:45

高斯消元法C#算法

2011-04-19 09:14:59

Ibatis

2009-07-17 17:57:20

NPetShop iBATIS.Net

2009-07-15 13:11:25

ibatis動態查詢

2023-06-12 08:30:08

多線程編程線程調試

2009-07-22 10:42:59

iBATIS Cach

2014-03-12 10:33:56

GitTortoiseGit

2009-07-24 16:59:57

iBatis模糊查詢

2009-07-22 13:04:41

iBATIS動態查詢

2023-11-06 12:00:04

GORM

2009-07-22 16:13:40

iBATIS用法SqlMapTempl

2009-11-05 15:47:37

CCNP學習筆記

2009-07-21 17:06:35

iBATIS.NET執

2009-07-16 13:30:12

resultMapgroupBy屬性
點贊
收藏

51CTO技術棧公眾號

一本大道久久a久久综合| 国产精品一区二区在线观看网站| 亚洲欧洲午夜一线一品| 亚洲综合欧美在线| 日本精品600av| 久久久亚洲欧洲日产国码αv| 国产精自产拍久久久久久| 久久精品一区二区三| 国内精品久久久久久久影视简单 | 国产黄色一级大片| 麻豆精品网站| 欧美贵妇videos办公室| 永久免费毛片在线观看| 18国产精品| 欧美日韩一区视频| 亚洲色成人一区二区三区小说| 麻豆传媒视频在线观看| 久久久久国色av免费看影院| 成人情视频高清免费观看电影| 中文资源在线播放| 国产日韩欧美| 国内揄拍国内精品| 91porn在线视频| 久久亚洲在线| 国产亚洲欧洲高清一区| 好吊色视频一区二区三区| 成人豆花视频| 欧美日韩美女一区二区| 一级黄色香蕉视频| 色老头在线一区二区三区| 一区二区在线观看免费视频播放| 亚洲一二区在线| 美女毛片在线看| 97aⅴ精品视频一二三区| 成人欧美一区二区三区视频| 97人妻精品一区二区三区视频| 日韩中文欧美在线| 国产成人精品免费视频| 依依成人综合网| 国产精品毛片在线看| 91精品国产成人www| 久久免费少妇高潮99精品| 亚洲香蕉av| 久久国产精彩视频| 日本一级二级视频| 一区二区国产在线| 欧美片一区二区三区| 成人免费视频网站入口::| 在线精品国产| 欧美激情一区二区三区高清视频| 国产高潮国产高潮久久久91| 欧美黄色一区| 久久6精品影院| 欧美日韩中文视频| 亚洲久久成人| 日韩av电影在线网| 超碰在线免费97| 久久精品国产亚洲aⅴ| 成人激情在线观看| 国产三级午夜理伦三级| 国产成人久久精品77777最新版本| 亚洲影视中文字幕| 亚洲精品一区二区三区不卡| 99久久久久久| 欧美一区激情视频在线观看| www.成人.com| 中文字幕亚洲区| 永久免费网站视频在线观看| 欧美人与牲禽动交com| 图片区小说区国产精品视频| 国产综合免费视频| 欧美视频精品| 欧美大片一区二区| 免费的av网站| 久久国产成人精品| 欧美激情精品久久久久| 久久久久久久久久久影院| 亚洲欧美日韩一区在线观看| 国产精品久久久久久久久久免费 | 欧美大荫蒂xxx| 日韩精品久久久久久久酒店| 日日噜噜夜夜狠狠视频欧美人 | 国产又粗又黄又爽的视频| 国产精品996| 久久精品综合一区| 欧美一区二区三区在线观看免费| 亚洲精品国产品国语在线app| 成熟丰满熟妇高潮xxxxx视频| 日本欧美一区| 欧美大胆人体bbbb| 国产高清一区二区三区四区| 亚洲人成免费网站| 国产91色在线|免| 国产视频一区二区三| 99riav久久精品riav| 一本一道久久久a久久久精品91| 国产丝袜在线观看视频| 欧美艳星brazzers| 伊人网综合视频| 久久高清精品| 日韩av大片在线| 亚洲av无码国产精品永久一区| 久久精品欧美日韩精品| 大荫蒂性生交片| 久久精品97| 日韩精品视频中文在线观看 | 五月久久久综合一区二区小说| 97**国产露脸精品国产| 国产欧美久久久| 国产午夜亚洲精品羞羞网站| 国产精彩视频一区二区| www 久久久| 中文字幕成人在线| 亚洲精品男人天堂| 风间由美一区二区三区在线观看| 亚洲美女网站18| 日本电影欧美片| 亚洲黄色www| 麻豆一区二区三区精品视频| 久久成人免费电影| 日韩精品资源| 性欧美hd调教| 亚洲欧美日韩高清| 成年人免费高清视频| 成人小视频在线| 黄色一级片av| 久久久久久亚洲精品美女| 日韩在线欧美在线| 久久久久久高潮国产精品视| 国产午夜精品一区二区理论影院| 激情小说亚洲一区| 亚洲一区精品视频| 91伊人久久| 国产一区二区三区在线| 亚洲欧美偷拍一区| 久久青草欧美一区二区三区| 成人在线免费观看av| 免费萌白酱国产一区二区三区| 欧美精品videos| 丰满肉肉bbwwbbww| 亚洲一区二区三区三| 2025中文字幕| 亚洲午夜电影| 国产亚洲一区二区三区在线播放| 密臀av在线| 精品国产三级电影在线观看| 国产一级特黄毛片| 成人91在线观看| 人妻夜夜添夜夜无码av| 欧美重口另类| 日本在线精品视频| gogogo高清在线观看免费完整版| 色欧美日韩亚洲| 日韩视频在线观看免费视频| 免费在线一区观看| 黄瓜视频免费观看在线观看www | 欧美日韩亚洲在线| 偷拍中文亚洲欧美动漫| 国产亚洲xxx| 国产又黄又爽视频| 亚洲福利视频导航| 久久亚洲AV成人无码国产野外| 久久看片网站| 在线观看成人av| 亚洲1区在线| 91国内产香蕉| 69久久夜色| 日韩视频一区二区三区在线播放 | 99国产精品99久久久久久粉嫩| 黑人中文字幕一区二区三区| 在线看的毛片| 色一区av在线| 亚洲精品国产精| 欧美午夜视频一区二区| 老司机精品免费视频| 国产一区二区三区日韩| 日韩在线一级片| 日韩国产一区| 国产主播一区二区三区四区| 九九热线视频只有这里最精品| www.国产一区| 无套内谢的新婚少妇国语播放| 欧美天堂一区二区三区| 久久久久久久久久久久久久免费看| 26uuu久久天堂性欧美| 一级黄色特级片| 在线日韩视频| 亚洲精品第一区二区三区| 99ri日韩精品视频| 国产精品国产福利国产秒拍| 黄页网站在线| 中文字幕欧美国内| 视频污在线观看| 在线播放/欧美激情| 久久久久在线视频| 亚洲精品成人少妇| 亚洲精品视频网址| www.亚洲在线| 91蝌蚪视频在线| 久久最新视频| 男人插女人视频在线观看| 日韩免费一区| 蜜桃成人在线| 国产精品一线| 成人国产精品日本在线| gay欧美网站| 久久久久久久爱| av片在线观看免费| 这里只有精品在线观看| 日韩中文字幕观看| 欧美一区二区不卡视频| 五月天中文字幕| 欧美午夜精品久久久久久人妖| 精品无码人妻一区二区三区品| 国产精品美女久久福利网站| 丝袜美腿中文字幕| 成人激情av网| 日本高清一区二区视频| 久久综合影音| 毛片av免费在线观看| 亚洲美女色禁图| 男人的天堂avav| 欧美国产另类| 欧美日韩午夜爽爽| 香蕉久久网站| 一区视频二区视频| 日本一区二区免费高清| 日本一区二区三不卡| 夜夜躁狠狠躁日日躁2021日韩| 国产综合18久久久久久| 国产精伦一区二区三区| 国产91免费视频| 中文字幕区一区二区三| 91观看网站| 高清久久精品| 亚洲精品女av网站| 欧美欧美在线| 97se国产在线视频| 亚洲成av人片在线观看www| 1区1区3区4区产品乱码芒果精品| 国产精品777777在线播放| 成人av在线网址| 国产精品1区在线| 97人摸人人澡人人人超一碰| 亚洲综合网站| 国产亚洲福利社区| 伊人久久大香线蕉av不卡| 裸模一区二区三区免费| 国产一区二区三区网| 日韩高清三级| 99久久夜色精品国产亚洲狼| 欧美日韩亚洲国产成人| 欧美激情综合色综合啪啪| 国产精品国三级国产av| 一区二区三区福利| 一本久道综合色婷婷五月| 美腿丝袜在线亚洲一区| 在线视频观看一区二区| 国产精品亚洲午夜一区二区三区 | 色综合久久久无码中文字幕波多| 国产成人免费在线观看不卡| 日本少妇xxxx| 国产亚洲成av人在线观看导航| 日本一二三不卡视频| 中文字幕综合网| 久久这里只有精品国产| 欧美三级欧美成人高清www| 日韩国产亚洲欧美| 91精品国产综合久久精品麻豆| 亚洲国产精品suv| 精品无码久久久久久国产| av片在线看| 欧美国产极速在线| 欧美日韩视频网站| 91久久综合亚洲鲁鲁五月天| 第一区第二区在线| 日韩av一区二区三区美女毛片| 亚洲成av人片一区二区密柚| 毛片在线播放视频| 蜜桃久久久久久久| 在线观看一区二区三区四区| 久久亚洲综合色一区二区三区| 91大神福利视频| 亚洲国产一区二区三区| 亚洲 国产 日韩 欧美| 日韩无一区二区| 国产资源在线观看| 色综合天天综合网国产成人网| 快播电影网址老女人久久| 亚洲资源在线看| 精品久久国产老人久久综合| 小泽玛利亚一区| 午夜一区二区三区视频| 中文字幕视频在线播放| 精品国产制服丝袜高跟| 中文字幕日本在线| 成人涩涩免费视频| 日韩av资源在线| 精品一区二区三区在线视频| 欧美极品jizzhd欧美仙踪林| 日本一区二区三区久久久久久久久不 | 欧美亚洲韩国| 成人久久18免费网站漫画| 国产伦精品一区二区三区视频 | 丝袜美腿诱惑一区二区三区| 动漫一区二区在线| 欧美超碰在线| 日韩有码免费视频| 国产69精品一区二区亚洲孕妇| 免费看一级黄色| 一本色道综合亚洲| 天天干免费视频| 精品自在线视频| 亚洲aⅴ网站| 日本a级片久久久| 在线视频精品| 精品1卡二卡三卡四卡老狼| 自拍视频在线观看一区二区| 自拍偷拍福利视频| 亚洲欧美变态国产另类| 国产拍在线视频| www.久久草| 欧美日韩免费| 免费高清视频在线观看| 中文字幕一区日韩精品欧美| 久久这里只有精品9| 亚洲人午夜精品免费| 老色鬼在线视频| 国内精品久久久久久久果冻传媒| 国产中文一区| 中文字幕亚洲日本| 亚洲精品第1页| 亚洲第一精品网站| 九九热精品视频在线播放| 国产一区二区高清在线| 亚洲砖区区免费| 另类小说欧美激情| 蜜桃视频最新网址| 欧美日韩久久久| 麻豆免费在线观看| 3d蒂法精品啪啪一区二区免费| 亚洲不卡av不卡一区二区| 亚洲第一成肉网| 亚洲免费观看高清完整版在线| 国产情侣av在线| 久青草国产97香蕉在线视频| 国产精久久一区二区| 天堂а√在线中文在线| 成人深夜在线观看| 久久免费激情视频| 亚洲欧美制服丝袜| 国产精品久久久久久妇女| 在线视频不卡国产| 国产精品一品二品| 日本中文字幕免费观看| 亚洲欧美成人精品| 成人在线视频免费| 看全色黄大色大片| 成人美女在线视频| 久久久久99精品成人片我成大片| 国产亚洲视频在线观看| 久久福利在线| bt天堂新版中文在线地址| av网站免费线看精品| 无码人妻精品一区二区| 日韩一区视频在线| 999久久久精品一区二区| 日本精品免费在线观看| 国产精品美日韩| www.久久综合| 日本高清+成人网在线观看| 青青草国产免费一区二区下载| 图片区乱熟图片区亚洲| 亚洲丶国产丶欧美一区二区三区| 久久这里精品| 亚洲iv一区二区三区| 香蕉国产精品偷在线观看不卡| 国产三级黄色片| 欧美成人猛片aaaaaaa| 欧美gay视频| 一本大道东京热无码aⅴ| 久久在线观看免费| 亚洲中文字幕在线一区| 午夜精品久久久久久久99热浪潮| 国产亚洲第一伦理第一区| 黑人无套内谢中国美女| 在线视频欧美精品| 欧美人体视频xxxxx| 亚洲国产精品www| www.日韩av| 国产精品福利电影| 浅井舞香一区二区| 欧美激情日韩| 日韩福利在线视频| 日韩不卡在线观看| 国产一区二区三区亚洲综合| 国产1区2区在线| 亚洲一区二区三区在线看| 2019中文字幕在线视频| 精品一区二区日本|