2019-03-22 延遲加載

什么是延遲加載

resultMap可以實現(xiàn)高級映射(使用association反砌、collection實現(xiàn)一對一及一對多映射),association膀藐、collection具備延遲加載功能屠阻。
需求:
如果查詢訂單并且關(guān)聯(lián)查詢用戶信息。如果先查詢訂單信息即可滿足要求额各,當(dāng)我們需要查詢用戶信息時再查詢用戶信息国觉。把對用戶信息的按需去查詢就是延遲加載。

延遲加載:先從單表查詢虾啦,需要時再從關(guān)聯(lián)表去關(guān)聯(lián)查詢麻诀,大大提高數(shù)據(jù)庫性能,因為查詢單表要比關(guān)聯(lián)查詢多張表速度要快傲醉。

使用association實現(xiàn)延遲加載

需求

查詢訂單并且關(guān)聯(lián)查詢用戶信息

mapper.xml

需要定義兩個mapper的方法對應(yīng)的statement蝇闭。
1、只查詢訂單信息
SELECT * FROM orders
在查詢訂單的statement中使用association去延遲加載(執(zhí)行)下邊的statement

2硬毕、關(guān)聯(lián)查詢用戶信息
通過上邊查詢到的訂單信息中user_id去關(guān)聯(lián)查詢用戶信息丁眼。
使用UserMapper.xml中的findUserById


上邊先執(zhí)行findOrdersUserLazyLoading,當(dāng)需要去查詢用戶的時候再去執(zhí)行findUserById昭殉,通過resultMap的定義將延遲加載執(zhí)行配置起來。

延遲加載resultMap

使用association中的select指定延遲加載去執(zhí)行的statement的id藐守。

<!-- 延遲加載的resultMap -->
    <resultMap type="cn.iven.mybatis.po.Orders" id="OrdersUserLazyLoadingResultMap">
        <!-- 對訂單信息進(jìn)行映射配置 -->
        <id column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>
        <!-- 實現(xiàn)對用戶信息進(jìn)行延遲加載 
        select:指定延遲加載需要執(zhí)行的statement的id(是根據(jù)user_id查詢用戶的statement)
        要使用UserMapper.xml中的findUserById完成根據(jù)用戶id(user_id)用戶信息的查詢挪丢,如果findUserById不在本mapper中需要前邊加namespace
        column:訂單信息中關(guān)聯(lián)用戶信息查詢的列,是user_id
        SELECT orders.*,
        (SELECT username FROM user WHERE orders.user_id=`user`.id) username,
        (SELECT sex FROM user WHERE orders.user_id=`user`.id) sex
        FROM orders;
        -->
        <association property="user" javaType="cn.iven.mybatis.po.User" select="cn.iven.mybatis.mapper.UserMapper.findUserById" column="user_id">
        <!-- 實現(xiàn)對用戶信息進(jìn)行延遲加載 -->
        
        </association>

mapper.java

測試

測試思路:
1卢厂、執(zhí)行上邊mapper方法(findOrdersUserLazyLoading),內(nèi)部去調(diào)用cn.iven.mybatis.mapper.OrdersMapperCustom中的findOrdersUserLazyLoading只查詢orders信息(單表)乾蓬。
2、在程序中去遍歷上一步查詢出的List<Orders>,當(dāng)我們調(diào)用Orders的getUser()方法時慎恒,開始進(jìn)行延遲加載任内。
3、延遲加載融柬,去調(diào)用UserMapper.xml中findUserById這個方法獲取用戶信息死嗦。

延遲加載配置

mybatis默認(rèn)沒有開啟延遲加載
在SqlMapConfig.xml配置:


測試代碼

延遲加載思考

不使用mybatis提供的association及collection中的延遲加載功能,如何實現(xiàn)延遲加載粒氧?
實現(xiàn)方法如下:
定義兩個mapper方法:
1越除、查詢訂單列表
2、根據(jù)用戶id查詢用戶信息
實現(xiàn)思路:
先去查詢第一個mapper方法,獲取訂單信息列表
在程序中(service)摘盆,按需去調(diào)用第二個mapper方法去查詢用戶信息翼雀。

總結(jié):
使用延遲加載方法,先去查詢簡單的sql(最好是單表孩擂,也可以是關(guān)聯(lián))狼渊,再去按需加載關(guān)聯(lián)查詢的其他信息。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末类垦,一起剝皮案震驚了整個濱河市狈邑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌护锤,老刑警劉巖官地,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異烙懦,居然都是意外死亡驱入,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門氯析,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亏较,“玉大人,你說我怎么就攤上這事掩缓⊙┣椋” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵你辣,是天一觀的道長巡通。 經(jīng)常有香客問我,道長舍哄,這世上最難降的妖魔是什么宴凉? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮表悬,結(jié)果婚禮上弥锄,老公的妹妹穿的比我還像新娘。我一直安慰自己蟆沫,他們只是感情好籽暇,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饭庞,像睡著了一般戒悠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上但绕,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天救崔,我揣著相機(jī)與錄音惶看,去河邊找鬼。 笑死六孵,一個胖子當(dāng)著我的面吹牛纬黎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播劫窒,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼本今,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了主巍?” 一聲冷哼從身側(cè)響起冠息,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孕索,沒想到半個月后逛艰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡搞旭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年散怖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肄渗。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡镇眷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翎嫡,到底是詐尸還是另有隱情欠动,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布惑申,位于F島的核電站具伍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏圈驼。R本人自食惡果不足惜沿猜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碗脊。 院中可真熱鬧,春花似錦橄妆、人聲如沸衙伶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矢劲。三九已至,卻和暖如春慌随,著一層夾襖步出監(jiān)牢的瞬間芬沉,已是汗流浹背躺同。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留丸逸,地道東北人蹋艺。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像黄刚,于是被迫代替她去往敵國和親捎谨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 對訂單商品數(shù)據(jù)模型進(jìn)行分析憔维。 1.高級映射: 實現(xiàn)一對一涛救、一對多、多對多查詢延遲加載 2.查詢緩存 一級緩存二級緩...
    TiHom閱讀 667評論 1 4
  • 主要內(nèi)容 1 高級映射一對一一對多多對多 1 高級映射 2-1 訂單商品數(shù)據(jù)模型 數(shù)據(jù)模型分析思路:即拿到一個項目...
    艾剪疏閱讀 437評論 0 2
  • 一、什么是延遲加載 延遲加載:先從單表查詢程储、需要時再從關(guān)聯(lián)表去關(guān)聯(lián)查詢蹭沛,大大提高數(shù)據(jù)庫性能。 resultMap可...
    yjaal閱讀 2,982評論 0 3
  • 什么是延遲加載 舉個例子:如果查詢訂單并且關(guān)聯(lián)查詢用戶信息虱肄。如果先查詢訂單信息即可滿足要求致板,當(dāng)我們需要查詢用戶信息...
    我相信你愛過gg閱讀 230評論 0 0
  • 阿米巴模式是日本當(dāng)前唯一健在的“四大經(jīng)營之圣”之一的稻盛和夫創(chuàng)建的一種企業(yè)經(jīng)營管理模式,簡單地說就是將企業(yè)通過一種...
    潔蕓閱讀 837評論 2 0