Mybatis - 延遲加載

前兩節(jié)說(shuō)到了一對(duì)一漆际、一對(duì)多和多層級(jí)聯(lián)操作淆珊,當(dāng)多層級(jí)聯(lián)層數(shù)太多時(shí),不建議使用級(jí)聯(lián)奸汇,會(huì)造成復(fù)雜度的增加施符,不利于他人的理解和維護(hù)楞陷,同時(shí)還存在一些劣勢(shì)璧微,比如有時(shí)候并不需要獲取所有的數(shù)據(jù),吩翻,但是級(jí)聯(lián)會(huì)多執(zhí)行幾次SQL婴洼,將全部關(guān)聯(lián)信息查詢出來(lái)骨坑,這樣就會(huì)導(dǎo)致執(zhí)行SQL較多從而導(dǎo)致性能下降。針對(duì)這種問(wèn)題,我們可以使用延遲加載來(lái)解決欢唾,本節(jié)繼續(xù)使用前兩節(jié)的demo來(lái)演示延遲加載的功能且警。

  • 全局配置
  1. 修改application.yml 添加延遲加載全局配置
mybatis:
  mapper-locations: classpath:mappers/*.xml
  configuration:
    #開(kāi)啟延遲加載,默認(rèn)即時(shí)加載
    lazy-loading-enabled: true
    #Mybatis默認(rèn)是按層級(jí)延遲加載的礁遣,為true時(shí)按層級(jí)加載斑芜,否則就按我們調(diào)用的要求加載
    aggressive-lazy-loading: false
    #打印日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    #指定哪個(gè)對(duì)象的方法觸發(fā)一次延遲加載。默認(rèn)值:equals,clone,hashCode,toString 祟霍,可以阻擋不相干的操作觸發(fā)杏头,實(shí)現(xiàn)懶加載
    lazy-load-trigger-methods: ""

注意:實(shí)體類中如果是使用的lombok,則加上@ToString(doNotUseGetters = true)

  1. 修改AuthorService沸呐,方便查看效果
@Service
public class AuthorService {

    @Autowired
    private AuthorMapper authorMapper;

    public Author getAuthorById(String id) {
        Author author = authorMapper.getAuthorById(id);
        System.out.println("查詢作者信息表數(shù)據(jù)");
        author.getAuthorInformation();
        System.out.println("查詢作者的主題表數(shù)據(jù)");
        author.getSpecials();
        System.out.println("查詢作者的文章表數(shù)據(jù)");
        for (int i = 0; i < author.getSpecials().size(); i++) {
            author.getSpecials().get(i).getArticles();
        }
        return author;
    }

}
測(cè)試

在第一步打個(gè)斷點(diǎn)醇王,然后調(diào)用AuthorService的getAuthorById方法獲取作者信息
image.png
image.png

第一步執(zhí)行結(jié)束后可以看到級(jí)聯(lián)的authorInformation和specials信息沒(méi)有查詢出來(lái),級(jí)聯(lián)的SQL也沒(méi)有執(zhí)行崭添。

在return處再打個(gè)斷點(diǎn)寓娩,繼續(xù)執(zhí)行代碼到return處。
image.png
image.png
從執(zhí)行的sql日志中可以看到呼渣,只有當(dāng)我們調(diào)用級(jí)聯(lián)對(duì)象數(shù)據(jù)時(shí)才會(huì)去查詢對(duì)應(yīng)的數(shù)據(jù)棘伴。從上面的結(jié)果中可以看出延遲加載生效了。
  • 局部配置

也有部分場(chǎng)景屁置,需要一部分級(jí)聯(lián)的對(duì)象數(shù)據(jù)即時(shí)加載焊夸,一部分不需要,這個(gè)時(shí)候可以使用局部延遲加載的功能蓝角,我們可以在 associationcollection元素中加入 fetchType屬性實(shí)現(xiàn)局部延遲加載功能阱穗。
fetchType有兩個(gè)取值,如下:
eager:即時(shí)加載
lazy:延遲加載

  1. 修改AuthorMapper.xml帅容,為association添加 fetchType="eager"實(shí)現(xiàn)即時(shí)加載颇象,為collection 添加 fetchType="lazy"實(shí)現(xiàn)延遲加載
<resultMap id="BaseResultMap" type="com.sy.mybatis.pojo.Author" >
    <id column="id" property="id" jdbcType="VARCHAR" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="login_name" property="loginName" jdbcType="VARCHAR" />
    <result column="pwssword" property="pwssword" jdbcType="VARCHAR" />
    <association fetchType="eager" property="authorInformation" column="id" select="com.sy.mybatis.mapper.AuthorInformationMapper.getAuthorInformationbyAuthorId"></association>
    <collection fetchType="lazy" property="specials" column="id" select="com.sy.mybatis.mapper.SpecialMapper.getSpecialsByAuthorId"></collection>
  </resultMap>
測(cè)試

在第一步打個(gè)斷點(diǎn)伍伤,然后調(diào)用AuthorService的getAuthorById方法獲取作者信息

image.png
image.png
第一步執(zhí)行結(jié)束后可以看到設(shè)置了fetchType="eager"即時(shí)加載級(jí)聯(lián)的authorInformation對(duì)象數(shù)據(jù)查詢了出來(lái)并徘,執(zhí)行了級(jí)聯(lián)SQL,而設(shè)置了fetchType="lazy"延遲加載的specials對(duì)象信息沒(méi)有查詢出來(lái)扰魂,級(jí)聯(lián)的SQL也沒(méi)有執(zhí)行麦乞。

在return處再打個(gè)斷點(diǎn),繼續(xù)執(zhí)行代碼到return處劝评。
image.png
image.png

從執(zhí)行的sql日志中可以看到姐直,再次調(diào)用即時(shí)加載的屬性時(shí)沒(méi)有重新執(zhí)行級(jí)聯(lián)查詢,后面的延遲加載對(duì)象在我調(diào)用時(shí)才去查詢了對(duì)應(yīng)的數(shù)據(jù)蒋畜,這樣就實(shí)現(xiàn)了局部延遲加載功能声畏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子插龄,更是在濱河造成了極大的恐慌愿棋,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件均牢,死亡現(xiàn)場(chǎng)離奇詭異糠雨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)徘跪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén)甘邀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人垮庐,你說(shuō)我怎么就攤上這事松邪。” “怎么了哨查?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵测摔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我解恰,道長(zhǎng)锋八,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任护盈,我火速辦了婚禮挟纱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腐宋。我一直安慰自己紊服,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布胸竞。 她就那樣靜靜地躺著欺嗤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卫枝。 梳的紋絲不亂的頭發(fā)上煎饼,一...
    開(kāi)封第一講書(shū)人閱讀 52,874評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音校赤,去河邊找鬼吆玖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛马篮,可吹牛的內(nèi)容都是我干的沾乘。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼浑测,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼翅阵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤掷匠,失蹤者是張志新(化名)和其女友劉穎读慎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體槐雾,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夭委,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了募强。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片株灸。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖擎值,靈堂內(nèi)的尸體忽然破棺而出慌烧,到底是詐尸還是另有隱情,我是刑警寧澤鸠儿,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布屹蚊,位于F島的核電站,受9級(jí)特大地震影響进每,放射性物質(zhì)發(fā)生泄漏汹粤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一田晚、第九天 我趴在偏房一處隱蔽的房頂上張望嘱兼。 院中可真熱鬧,春花似錦贤徒、人聲如沸芹壕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)踢涌。三九已至,卻和暖如春序宦,著一層夾襖步出監(jiān)牢的瞬間睁壁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工挨厚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堡僻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓疫剃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親硼讽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巢价,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361