Mybatis延遲加載原理和延遲加載配置詳解
一、概念
MyBatis中的延遲加載,也稱(chēng)為懶加載,是指在進(jìn)行表的關(guān)聯(lián)查詢(xún)時(shí),按照設(shè)置延遲規(guī)則推遲對(duì)關(guān)聯(lián)對(duì)象的select查詢(xún)。例如在進(jìn)行一對(duì)多查詢(xún)的時(shí)候,只查詢(xún)出一方,當(dāng)程序中需要多方的數(shù)據(jù)時(shí),mybatis再發(fā)出sql語(yǔ)句進(jìn)行查詢(xún),這樣子延遲加載就可以的減少數(shù)據(jù)庫(kù)壓力。MyBatis 的延遲加載只是對(duì)關(guān)聯(lián)對(duì)象的查詢(xún)有遲延設(shè)置,對(duì)于主加載對(duì)象都是直接執(zhí)行查詢(xún)語(yǔ)句的。
二、原理
MyBatis實(shí)現(xiàn)延遲加載的方式是使用代理對(duì)象,在訪問(wèn)未加載的數(shù)據(jù)時(shí)觸發(fā)代理對(duì)象的方法,從而進(jìn)行數(shù)據(jù)的加載。
三、延遲加載支持的對(duì)象
Mybatis 僅支持 association 關(guān)聯(lián)對(duì)象和 collection 關(guān)聯(lián)集合對(duì)象的延遲加載
- association 指的就是一對(duì)一
- collection 指的就是一對(duì)多查詢(xún)
四、 配置延遲加載
1.配置全局延遲加載
<!-- 在Mybatis的核?配置?件中可以使?setting標(biāo)簽修改全局的加載策略--> <settings> <!-- 打開(kāi)延遲加載的開(kāi)關(guān) --> <setting name="lazyLoadingEnabled" value="true"/> <!--不是必要的標(biāo)簽 false 深入式延遲加載 true 侵入式延遲加載 --> <setting name="aggressiveLazyLoading" value="false"/> </settings>
侵入式延遲加載和深入式延遲加載的區(qū)別
class 與 student 之間是一對(duì)多關(guān)系,我們?cè)诩虞d時(shí),可以先加載 class 數(shù)據(jù),當(dāng)需要使用到 student 數(shù)據(jù)時(shí),我們?cè)偌虞d student 的相關(guān)數(shù)據(jù)。
- 侵入式延遲加載 侵入式延遲加載指的是只要主表的任一屬性加載,就會(huì)觸發(fā)延遲加載,比如:class 的 name 被加載,student 信息就會(huì)被觸發(fā)加載。
- 深度延遲加載 深度延遲加載指的是只有關(guān)聯(lián)的從表信息被加載,延遲加載才會(huì)被觸發(fā)。 通常,我們?cè)趯?shí)戰(zhàn)中更傾向使用深度延遲加載。
2 配置局部延遲加載
<!--修改標(biāo)簽的fetchType屬性 fetchType="lazy" 延遲加載策略 fetchType="eager" ?即加載策略--> <resultMap id="kunkunMap" type="user"> <id column="id" property="id"></id> <result column="ctrl" property="ctrl"></result> <!--開(kāi)啟?對(duì)多 延遲加載--> <collection property="userList" ofType="order" column="id" select="com.lagou.dao.OrderMapper.findByUid" fetchType="lazy"> </collection> <!--開(kāi)啟?對(duì)一 延遲加載--> <association property="order" column="id" javaType="order" select="com.xinxin.dao.OrderMapper.findById" fetchType="lazy"> </association> </resultMap>
3.加載順序
局部的加載策略的優(yōu)先級(jí)高于全局的加載策略。
到此這篇關(guān)于Mybatis延遲加載原理和延遲加載配置詳解的文章就介紹到這了,更多相關(guān)Mybatis延遲加載原理和配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java獲取當(dāng)前時(shí)間的四種方法代碼實(shí)例
這篇文章主要介紹了java獲取當(dāng)前時(shí)間的四種方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09關(guān)于后綴表達(dá)式的java實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了關(guān)于后綴表達(dá)式的java實(shí)現(xiàn)過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07SpringBoot實(shí)現(xiàn)自定義指標(biāo)監(jiān)控功能
本文主要介紹了SpringBoot實(shí)現(xiàn)自定義指標(biāo)監(jiān)控功能的實(shí)現(xiàn),,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,感興趣的小伙伴跟著著小編來(lái)一起來(lái)學(xué)習(xí)吧2024-01-01Mybatis如何通過(guò)注解開(kāi)啟使用二級(jí)緩存
這篇文章主要介紹了Mybatis基于注解開(kāi)啟使用二級(jí)緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11SpringBoot簡(jiǎn)單的SpringBoot后端實(shí)例
這篇文章主要介紹了SpringBoot簡(jiǎn)單的SpringBoot后端實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Spring?BeanDefinition收集過(guò)程示例詳解
這篇文章主要為大家介紹了Spring?BeanDefinition收集過(guò)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08idea中Java實(shí)體類(lèi)怎樣生成序列化的版本號(hào)的方法
這篇文章主要介紹了idea中Java實(shí)體類(lèi)怎樣生成序列化的版本號(hào)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11解決springboot 獲取form-data里的file文件的問(wèn)題
這篇文章主要介紹了解決springboot 獲取form-data里的file文件的問(wèn)題的相關(guān)資料,這里提供了詳細(xì)的解決步驟,需要的朋友可以參考下2017-07-07