摘要:什么時候會執行延遲加載配置之后在對關聯對象進行查詢時使用延遲加載。在和集成時,要確保只能在層調用延遲加載的屬性。當結果從層返回至層時,如果獲取延遲加載的屬性值,會因為口已經關閉而拋出異常。
mybatis 延遲加載
延遲加載又叫懶加載,也叫按需加載,也就是說先加載主信息,需要的時候,再去加載從信息。代碼中有查詢語句,當執行到查詢語句時,并不是馬上去DB中查詢,而是根據設置的延遲策略將查詢向后推遲。
配置之后在對關聯對象進行查詢時使用延遲加載。
遇到代碼中查詢語句,馬上到DB中執行select語句進行查詢。(這種只能用于多表多帶帶查詢)
將關聯對象的詳情(具體數據,如id、name)侵入到主加載對象,作為主加載對象的詳情的一部分出現。當要訪問主加載對象的詳情時才會查詢主表,但由于關聯對象詳情作為主加載對象的詳情一部分出現,所以這個查詢不僅會查詢主表,還會查詢關聯表。
將關聯對象的詳情(具體數據,如id、name)侵入到主加載對象,作為主加載對象的詳情的一部分出現。當要訪問主加載對象的詳情時才會查詢主表,但由于關聯對象詳情作為主加載對象的詳情一部分出現,所以這個查詢不僅會查詢主表,還會查詢關聯表。
減輕DB服務器的壓力,因為我們延遲加載只有在用到需要的數據才會執行查詢操作。
我們用關聯查詢來實現延遲加載,假設我們現在要查出用戶和用戶角色。
首先我們在user中添加查詢userVo的方法和xml。
....id, `name`, age, role_id ... ...id, role_name ...
測試用例
@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)); } }
輸出結果:
UserVo{user=User [Hash = 1937575946, id=12312232, name=哇哈哈啊娃哈哈哇哈哈哈哈哈哈哈, age=48, roleId=1, serialVersionUID=1], role=Role [Hash = 317053574, id=1, roleName=admin, serialVersionUID=1]}
許多對延遲加載原理不太熟悉的朋友會經常遇到一些莫名其妙的問題:有些時候延遲加載
可以得到數據,有些時候延遲加載就會報錯,為什么會出現這種情況呢?
MyBatis 延遲加載是通過動態代理實現的,當調用配直為延遲加載的屬性方法時, 動態代
理的操作會被觸發,這些額外的操作就是通過 MyBatis 的 SqlSessio口去執行嵌套 SQL 的 。
由于在和某些框架集成時, SqlSession 的生命周期交給了框架來管理,因此當對象超出
SqlSession 生命周期調用時,會由于鏈接關閉等問題而拋出異常 。 在和 Spring 集成時,要
確保只能在 Service 層調用延遲加載的屬性 。 當結果從 Service 層返回至 Controller 層時, 如果
獲取延遲加載的屬性值,會因為 SqlSessio口已經關閉而拋出異常 。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73029.html
摘要:相關閱讀通過項目逐步深入了解一通過項目逐步深入了解二通過項目逐步深入了解三本項目所有代碼及文檔都托管在地址延遲加載什么是延遲加載可以實現高級映射使用實現一對一及一對多映射,具備延遲加載功能。一級緩存是級別的緩存。 相關閱讀: 1、通過項目逐步深入了解Mybatis 2、通過項目逐步深入了解Mybatis 3、通過項目逐步深入了解Mybatis 本項目所有代碼及文檔都托管在 Github...
摘要:問題解析因為熱愛,所以拼搏。如何解決問題本身給出解決方案,就是延遲加載。延遲加載延遲加載會解決上述的問題,也就是在個級聯表的情況下,只加載需求的數據庫表數據。在特定的關聯中,使用屬性覆蓋該內容的功能。 Mybatis N+1問題解析 因為熱愛,所以拼搏。 --RuiDer 前導必備 Mybatis 數據庫 級聯 N+1問題?? N+1問題來源于數據庫中常見的...
摘要:本文首發于的博客轉載請注明出處邏輯分頁和物理分頁的區別是什么分頁是為了節省網絡傳輸的數據量邏輯分頁是將數據全部加載到內存,再通過后端邏輯控制分頁顯示到前端物理分頁是在數據庫層面分部分獲取數據,通常情況下對內存的壓力較邏輯分頁少是否支持延遲加 ????本文首發于cartoon的博客????轉載請注明出處:https://cartoonyu.github.io/c... Mybatis...
摘要:場合常見一些明細記錄的展示,將關聯查詢信息全部展示在頁面時,此時可直接使用將每一條記錄映射到中,在前端頁面遍歷中是即可。如果查詢單表就可以滿足需求,一開始先查詢單表,當需要關聯信息時,再關聯查詢,當需要關聯信息再查詢這個叫延遲加載。 配置文件和映射文件還有挺多的屬性我還沒有講的,現在就把它們一一補全 映射文件 在mapper.xml文件中配置很多的sql語句,執行每個sql語句時,封裝...
閱讀 1312·2021-10-08 10:05
閱讀 4135·2021-09-22 15:54
閱讀 3114·2021-08-27 16:18
閱讀 3116·2019-08-30 15:55
閱讀 1450·2019-08-29 12:54
閱讀 2758·2019-08-26 11:42
閱讀 556·2019-08-26 11:39
閱讀 2139·2019-08-26 10:11