MyBatis8-延遲加載

什么是延遲加載

舉個(gè)例子:如果查詢訂單并且關(guān)聯(lián)查詢用戶信息。如果先查詢訂單信息即可滿足要求,當(dāng)我們需要查詢用戶信息時(shí)再查詢用戶信息。把對(duì)用戶信息的按需去查詢就是延遲加載枣氧。 所以延遲加載即先從單表查詢、需要時(shí)再?gòu)年P(guān)聯(lián)表去關(guān)聯(lián)查詢垮刹,大大提高數(shù)據(jù)庫(kù)性能达吞,因?yàn)椴樵儐伪硪汝P(guān)聯(lián)查詢多張表速度要快。
我們來對(duì)比一下:

關(guān)聯(lián)查詢:SELECT orders.*, user.username FROM orders, USER WHERE orders.user_id = user.id 
延遲加載相當(dāng)于: 
SELECT orders.*, 
(SELECT username FROM USER WHERE orders.user_id = user.id)username FROM orders

所以這就比較直觀了危纫,也就是說宗挥,我把關(guān)聯(lián)查詢分兩次來做,而不是一次性查出所有的种蝶。第一步只查詢單表orders契耿,必然會(huì)查出orders中的一個(gè)user_id字段,然后我再根據(jù)這個(gè)user_id查user表螃征,也是單表查詢搪桂。下面來總結(jié)一下如何使用這個(gè)延遲加載.

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

前面博文中總結(jié)了resultMap可以實(shí)現(xiàn)高級(jí)映射(使用association、collection實(shí)現(xiàn)一對(duì)一及一對(duì)多映射)盯滚,其實(shí)association和collection還具備延遲加載的功能踢械,這里我就拿association來說明,collection和association使用的方法都是一樣的魄藕。需求就是上面提到的内列,查詢訂單并且關(guān)聯(lián)查詢用戶,查詢用戶使用延遲加載背率。
由上面的分析可知话瞧,延遲加載要查詢兩次,第二次是按需查詢寝姿,之前一對(duì)一關(guān)聯(lián)查詢的時(shí)候只需要查一次交排,把訂單和用戶信息都查出來了,所以只要寫一個(gè)mapper即可饵筑,但是延遲加載查兩次埃篓,所以理所當(dāng)然要有兩個(gè)mapper。(例如Orders表中有外鍵來引用Users表中的主鍵,所以我們查詢Orders表,在使用外鍵來查詢Users表)

兩個(gè)mapper.xml

需要定義兩個(gè)mapper的方法對(duì)應(yīng)的statement根资。先來分析一下思路:

1.只查詢訂單信息的statement架专,使用resultMap
2.通過查詢到的訂單信息中的user_id去查詢用戶信息的statement同窘,得到用戶
3.定義的resultMap將兩者關(guān)聯(lián)起來,即用訂單信息user_id去查用戶

下面來實(shí)現(xiàn)這個(gè)思路:

1. 只查詢訂單信息的statement:

<select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">
    SELECT * FROM orders
</select>

2. 只查詢用戶信息的statement:

<select id="findUserById" parameterType="int" resultType="user">
    select * from user where id = #{id}
</select>

3. 定義上面那個(gè)resultMap:

2.2 延遲加載的配置

mybatis默認(rèn)沒有開啟延遲加載胶征,需要在SqlMapConfig.xml中setting配置塞椎。前面一篇博文中提到SqlMapConfig.xml中的一些配置桨仿,有一個(gè)<settings>睛低,當(dāng)時(shí)沒說,這里就派上用場(chǎng)了服傍,可以通過這個(gè)標(biāo)簽來配置一下延遲加載钱雷。

<settings>
    <!-- 打開延遲加載的開關(guān) -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 將積極加載改為消極加載,即延遲加載 -->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

2.3 mapper.java

別忘了寫mapper接口:

public interface UserMapperOrders {

    //省去不相關(guān)代碼

    //查詢訂單吹零,關(guān)聯(lián)用戶查詢罩抗,用戶查詢用的是延遲加載
    public List<Orders> findOrdersUserLazyLoading() throws Exception;
}

到此為止,延遲加載就做完了灿椅,下面來測(cè)試一下:

@Test
public void testFindOrdersUserLazyLoading() throws Exception {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserMapperOrders userMapperOrders = sqlSession.getMapper(UserMapperOrders.class);
    //查詢訂單表(單表)
    List<Orders> list = userMapperOrders.findOrdersUserLazyLoading();

    //遍歷上邊的訂單列表
    for(Orders orders : list) {
        //執(zhí)行g(shù)etUser()去查詢用戶信息套蒂,這里實(shí)現(xiàn)按需加載
        User user = orders.getUser();
        System.out.println(user);
    }
}

看一下執(zhí)行結(jié)果:



執(zhí)行結(jié)果很明顯,使用了延遲加載茫蛹,將關(guān)聯(lián)查詢分成了兩次單表查詢操刀,但是有個(gè)奇怪的地方,就是第二次查用戶的時(shí)候婴洼,并沒有發(fā)sql骨坑,而是直接就拿到了,其實(shí)這就是mybatis中的一級(jí)緩存.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柬采,一起剝皮案震驚了整個(gè)濱河市欢唾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粉捻,老刑警劉巖礁遣,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異肩刃,居然都是意外死亡祟霍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門树酪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浅碾,“玉大人,你說我怎么就攤上這事续语〈剐唬” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵疮茄,是天一觀的道長(zhǎng)滥朱。 經(jīng)常有香客問我根暑,道長(zhǎng),這世上最難降的妖魔是什么徙邻? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任排嫌,我火速辦了婚禮,結(jié)果婚禮上缰犁,老公的妹妹穿的比我還像新娘淳地。我一直安慰自己,他們只是感情好帅容,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布颇象。 她就那樣靜靜地躺著,像睡著了一般并徘。 火紅的嫁衣襯著肌膚如雪遣钳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天麦乞,我揣著相機(jī)與錄音蕴茴,去河邊找鬼。 笑死姐直,一個(gè)胖子當(dāng)著我的面吹牛倦淀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播简肴,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晃听,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了砰识?” 一聲冷哼從身側(cè)響起能扒,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辫狼,沒想到半個(gè)月后初斑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膨处,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年见秤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片真椿。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹃答,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出突硝,到底是詐尸還是另有隱情测摔,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站锋八,受9級(jí)特大地震影響浙于,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挟纱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一羞酗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧紊服,春花似錦檀轨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剂府,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剃盾,已是汗流浹背腺占。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痒谴,地道東北人衰伯。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像积蔚,于是被迫代替她去往敵國(guó)和親意鲸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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

  • 一、什么是延遲加載 延遲加載:先從單表查詢漱贱、需要時(shí)再?gòu)年P(guān)聯(lián)表去關(guān)聯(lián)查詢槐雾,大大提高數(shù)據(jù)庫(kù)性能。 resultMap可...
    yjaal閱讀 2,980評(píng)論 0 3
  • 1.什么是延遲加載 resultMap可以實(shí)現(xiàn)高級(jí)映射幅狮,association募强、collection具備延遲加載功...
    Ching_Lee閱讀 213評(píng)論 0 0
  • 非本人總結(jié)的筆記,抄點(diǎn)筆記復(fù)習(xí)復(fù)習(xí)崇摄。感謝傳智博客及黑馬程序猿成長(zhǎng) 關(guān)聯(lián)查詢 數(shù)據(jù)中的表結(jié)構(gòu) 數(shù)據(jù)庫(kù)的分析方法 第一...
    鍵盤瞎閱讀 1,093評(píng)論 3 5
  • 主要內(nèi)容: 開發(fā)中數(shù)據(jù)模型的分析流程 一對(duì)一查詢 一對(duì)多查詢 一逐抑、開發(fā)中數(shù)據(jù)模型的分析流程 一般在開發(fā)中我們會(huì)直接...
    yjaal閱讀 2,175評(píng)論 5 8
  • 我今天可能23:00才能更出來泵肄,你們先睡吧捆交,明天要上班的淑翼,晚安。 提前祝你們:元旦快樂品追,哈哈玄括。
    冬知餃子閱讀 232評(píng)論 2 1