摘要:什么時(shí)候會(huì)執(zhí)行延遲加載配置之后在對(duì)關(guān)聯(lián)對(duì)象進(jìn)行查詢時(shí)使用延遲加載。在和集成時(shí),要確保只能在層調(diào)用延遲加載的屬性。當(dāng)結(jié)果從層返回至層時(shí),如果獲取延遲加載的屬性值,會(huì)因?yàn)榭谝呀?jīng)關(guān)閉而拋出異常。
mybatis 延遲加載
延遲加載又叫懶加載,也叫按需加載,也就是說(shuō)先加載主信息,需要的時(shí)候,再去加載從信息。代碼中有查詢語(yǔ)句,當(dāng)執(zhí)行到查詢語(yǔ)句時(shí),并不是馬上去DB中查詢,而是根據(jù)設(shè)置的延遲策略將查詢向后推遲。
配置之后在對(duì)關(guān)聯(lián)對(duì)象進(jìn)行查詢時(shí)使用延遲加載。
遇到代碼中查詢語(yǔ)句,馬上到DB中執(zhí)行select語(yǔ)句進(jìn)行查詢。(這種只能用于多表多帶帶查詢)
將關(guān)聯(lián)對(duì)象的詳情(具體數(shù)據(jù),如id、name)侵入到主加載對(duì)象,作為主加載對(duì)象的詳情的一部分出現(xiàn)。當(dāng)要訪問(wèn)主加載對(duì)象的詳情時(shí)才會(huì)查詢主表,但由于關(guān)聯(lián)對(duì)象詳情作為主加載對(duì)象的詳情一部分出現(xiàn),所以這個(gè)查詢不僅會(huì)查詢主表,還會(huì)查詢關(guān)聯(lián)表。
將關(guān)聯(lián)對(duì)象的詳情(具體數(shù)據(jù),如id、name)侵入到主加載對(duì)象,作為主加載對(duì)象的詳情的一部分出現(xiàn)。當(dāng)要訪問(wèn)主加載對(duì)象的詳情時(shí)才會(huì)查詢主表,但由于關(guān)聯(lián)對(duì)象詳情作為主加載對(duì)象的詳情一部分出現(xiàn),所以這個(gè)查詢不僅會(huì)查詢主表,還會(huì)查詢關(guān)聯(lián)表。
減輕DB服務(wù)器的壓力,因?yàn)槲覀冄舆t加載只有在用到需要的數(shù)據(jù)才會(huì)執(zhí)行查詢操作。
我們用關(guān)聯(lián)查詢來(lái)實(shí)現(xiàn)延遲加載,假設(shè)我們現(xiàn)在要查出用戶和用戶角色。
首先我們?cè)趗ser中添加查詢userVo的方法和xml。
....id, `name`, age, role_id ... ...id, role_name ...
測(cè)試用例
@RunWith(SpringRunner.class) @SpringBootTest public class BaseMapperApplicationTests { @Autowired private UserMapper userMapper; @Autowired private RoleMapper roleMapper; @Test public void getUserVo() { System.out.println(userMapper.getUserVo("12312232")); // System.out.println(userMapper.getUserById("12312232")); // System.out.println(roleMapper.getRoleById(1)); } }
輸出結(jié)果:
UserVo{user=User [Hash = 1937575946, id=12312232, name=哇哈哈啊娃哈哈哇哈哈哈哈哈哈哈, age=48, roleId=1, serialVersionUID=1], role=Role [Hash = 317053574, id=1, roleName=admin, serialVersionUID=1]}
許多對(duì)延遲加載原理不太熟悉的朋友會(huì)經(jīng)常遇到一些莫名其妙的問(wèn)題:有些時(shí)候延遲加載
可以得到數(shù)據(jù),有些時(shí)候延遲加載就會(huì)報(bào)錯(cuò),為什么會(huì)出現(xiàn)這種情況呢?
MyBatis 延遲加載是通過(guò)動(dòng)態(tài)代理實(shí)現(xiàn)的,當(dāng)調(diào)用配直為延遲加載的屬性方法時(shí), 動(dòng)態(tài)代
理的操作會(huì)被觸發(fā),這些額外的操作就是通過(guò) MyBatis 的 SqlSessio口去執(zhí)行嵌套 SQL 的 。
由于在和某些框架集成時(shí), SqlSession 的生命周期交給了框架來(lái)管理,因此當(dāng)對(duì)象超出
SqlSession 生命周期調(diào)用時(shí),會(huì)由于鏈接關(guān)閉等問(wèn)題而拋出異常 。 在和 Spring 集成時(shí),要
確保只能在 Service 層調(diào)用延遲加載的屬性 。 當(dāng)結(jié)果從 Service 層返回至 Controller 層時(shí), 如果
獲取延遲加載的屬性值,會(huì)因?yàn)?SqlSessio口已經(jīng)關(guān)閉而拋出異常 。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/73029.html
摘要:相關(guān)閱讀通過(guò)項(xiàng)目逐步深入了解一通過(guò)項(xiàng)目逐步深入了解二通過(guò)項(xiàng)目逐步深入了解三本項(xiàng)目所有代碼及文檔都托管在地址延遲加載什么是延遲加載可以實(shí)現(xiàn)高級(jí)映射使用實(shí)現(xiàn)一對(duì)一及一對(duì)多映射,具備延遲加載功能。一級(jí)緩存是級(jí)別的緩存。 相關(guān)閱讀: 1、通過(guò)項(xiàng)目逐步深入了解Mybatis 2、通過(guò)項(xiàng)目逐步深入了解Mybatis 3、通過(guò)項(xiàng)目逐步深入了解Mybatis 本項(xiàng)目所有代碼及文檔都托管在 Github...
摘要:?jiǎn)栴}解析因?yàn)闊釔?,所以拼搏。如何解決問(wèn)題本身給出解決方案,就是延遲加載。延遲加載延遲加載會(huì)解決上述的問(wèn)題,也就是在個(gè)級(jí)聯(lián)表的情況下,只加載需求的數(shù)據(jù)庫(kù)表數(shù)據(jù)。在特定的關(guān)聯(lián)中,使用屬性覆蓋該內(nèi)容的功能。 Mybatis N+1問(wèn)題解析 因?yàn)闊釔郏云床? --RuiDer 前導(dǎo)必備 Mybatis 數(shù)據(jù)庫(kù) 級(jí)聯(lián) N+1問(wèn)題?? N+1問(wèn)題來(lái)源于數(shù)據(jù)庫(kù)中常見的...
摘要:本文首發(fā)于的博客轉(zhuǎn)載請(qǐng)注明出處邏輯分頁(yè)和物理分頁(yè)的區(qū)別是什么分頁(yè)是為了節(jié)省網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量邏輯分頁(yè)是將數(shù)據(jù)全部加載到內(nèi)存,再通過(guò)后端邏輯控制分頁(yè)顯示到前端物理分頁(yè)是在數(shù)據(jù)庫(kù)層面分部分獲取數(shù)據(jù),通常情況下對(duì)內(nèi)存的壓力較邏輯分頁(yè)少是否支持延遲加 ????本文首發(fā)于cartoon的博客????轉(zhuǎn)載請(qǐng)注明出處:https://cartoonyu.github.io/c... Mybatis...
摘要:場(chǎng)合常見一些明細(xì)記錄的展示,將關(guān)聯(lián)查詢信息全部展示在頁(yè)面時(shí),此時(shí)可直接使用將每一條記錄映射到中,在前端頁(yè)面遍歷中是即可。如果查詢單表就可以滿足需求,一開始先查詢單表,當(dāng)需要關(guān)聯(lián)信息時(shí),再關(guān)聯(lián)查詢,當(dāng)需要關(guān)聯(lián)信息再查詢這個(gè)叫延遲加載。 配置文件和映射文件還有挺多的屬性我還沒有講的,現(xiàn)在就把它們一一補(bǔ)全 映射文件 在mapper.xml文件中配置很多的sql語(yǔ)句,執(zhí)行每個(gè)sql語(yǔ)句時(shí),封裝...
閱讀 1406·2021-10-08 10:05
閱讀 4231·2021-09-22 15:54
閱讀 3157·2021-08-27 16:18
閱讀 3156·2019-08-30 15:55
閱讀 1525·2019-08-29 12:54
閱讀 2803·2019-08-26 11:42
閱讀 631·2019-08-26 11:39
閱讀 2183·2019-08-26 10:11