成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

mybatis 延遲加載

Xufc / 641人閱讀

摘要:什么時候會執(zhí)行延遲加載配置之后在對關(guān)聯(lián)對象進(jìn)行查詢時使用延遲加載。在和集成時,要確保只能在層調(diào)用延遲加載的屬性。當(dāng)結(jié)果從層返回至層時,如果獲取延遲加載的屬性值,會因?yàn)榭谝呀?jīng)關(guān)閉而拋出異常。

mybatis 延遲加載
什么是延遲加載

延遲加載又叫懶加載,也叫按需加載,也就是說先加載主信息,需要的時候,再去加載從信息。代碼中有查詢語句,當(dāng)執(zhí)行到查詢語句時,并不是馬上去DB中查詢,而是根據(jù)設(shè)置的延遲策略將查詢向后推遲。

什么時候會執(zhí)行延遲加載

配置之后在對關(guān)聯(lián)對象進(jìn)行查詢時使用延遲加載。

延遲加載策略
直接加載

遇到代碼中查詢語句,馬上到DB中執(zhí)行select語句進(jìn)行查詢。(這種只能用于多表多帶帶查詢)

侵入式延遲加載

將關(guān)聯(lián)對象的詳情(具體數(shù)據(jù),如id、name)侵入到主加載對象,作為主加載對象的詳情的一部分出現(xiàn)。當(dāng)要訪問主加載對象的詳情時才會查詢主表,但由于關(guān)聯(lián)對象詳情作為主加載對象的詳情一部分出現(xiàn),所以這個查詢不僅會查詢主表,還會查詢關(guān)聯(lián)表。

深度延遲加載

將關(guān)聯(lián)對象的詳情(具體數(shù)據(jù),如id、name)侵入到主加載對象,作為主加載對象的詳情的一部分出現(xiàn)。當(dāng)要訪問主加載對象的詳情時才會查詢主表,但由于關(guān)聯(lián)對象詳情作為主加載對象的詳情一部分出現(xiàn),所以這個查詢不僅會查詢主表,還會查詢關(guān)聯(lián)表。

使用延遲加載的目的

減輕DB服務(wù)器的壓力,因?yàn)槲覀冄舆t加載只有在用到需要的數(shù)據(jù)才會執(zhí)行查詢操作。

配置
    
        
        
        
    

我們用關(guān)聯(lián)查詢來實(shí)現(xiàn)延遲加載,假設(shè)我們現(xiàn)在要查出用戶和用戶角色。

首先我們在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));

    }


}

輸出結(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]}
注意
許多對延遲加載原理不太熟悉的朋友會經(jīng)常遇到一些莫名其妙的問題:有些時候延遲加載
可以得到數(shù)據(jù),有些時候延遲加載就會報錯,為什么會出現(xiàn)這種情況呢?
MyBatis 延遲加載是通過動態(tài)代理實(shí)現(xiàn)的,當(dāng)調(diào)用配直為延遲加載的屬性方法時, 動態(tài)代
理的操作會被觸發(fā),這些額外的操作就是通過 MyBatis 的 SqlSessio口去執(zhí)行嵌套 SQL 的 。
由于在和某些框架集成時, SqlSession 的生命周期交給了框架來管理,因此當(dāng)對象超出
SqlSession 生命周期調(diào)用時,會由于鏈接關(guān)閉等問題而拋出異常 。 在和 Spring 集成時,要
確保只能在 Service 層調(diào)用延遲加載的屬性 。 當(dāng)結(jié)果從 Service 層返回至 Controller 層時, 如果
獲取延遲加載的屬性值,會因?yàn)?SqlSessio口已經(jīng)關(guān)閉而拋出異常 。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73029.html

相關(guān)文章

  • 通過項(xiàng)目逐步深入了解Mybatis(四)

    摘要:相關(guān)閱讀通過項(xiàng)目逐步深入了解一通過項(xiàng)目逐步深入了解二通過項(xiàng)目逐步深入了解三本項(xiàng)目所有代碼及文檔都托管在地址延遲加載什么是延遲加載可以實(shí)現(xiàn)高級映射使用實(shí)現(xiàn)一對一及一對多映射,具備延遲加載功能。一級緩存是級別的緩存。 相關(guān)閱讀: 1、通過項(xiàng)目逐步深入了解Mybatis 2、通過項(xiàng)目逐步深入了解Mybatis 3、通過項(xiàng)目逐步深入了解Mybatis 本項(xiàng)目所有代碼及文檔都托管在 Github...

    kuangcaibao 評論0 收藏0
  • Mybatis N+1問題解析

    摘要:問題解析因?yàn)闊釔?,所以拼搏。如何解決問題本身給出解決方案,就是延遲加載。延遲加載延遲加載會解決上述的問題,也就是在個級聯(lián)表的情況下,只加載需求的數(shù)據(jù)庫表數(shù)據(jù)。在特定的關(guān)聯(lián)中,使用屬性覆蓋該內(nèi)容的功能。 Mybatis N+1問題解析 因?yàn)闊釔?,所以拼搏? --RuiDer 前導(dǎo)必備 Mybatis 數(shù)據(jù)庫 級聯(lián) N+1問題?? N+1問題來源于數(shù)據(jù)庫中常見的...

    qqlcbb 評論0 收藏0
  • JAVA面試題(29)

    摘要:本文首發(fā)于的博客轉(zhuǎn)載請注明出處邏輯分頁和物理分頁的區(qū)別是什么分頁是為了節(jié)省網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量邏輯分頁是將數(shù)據(jù)全部加載到內(nèi)存,再通過后端邏輯控制分頁顯示到前端物理分頁是在數(shù)據(jù)庫層面分部分獲取數(shù)據(jù),通常情況下對內(nèi)存的壓力較邏輯分頁少是否支持延遲加 ????本文首發(fā)于cartoon的博客????轉(zhuǎn)載請注明出處:https://cartoonyu.github.io/c... Mybatis...

    junbaor 評論0 收藏0
  • Mybatis【配置文件】就是這么簡單

    摘要:場合常見一些明細(xì)記錄的展示,將關(guān)聯(lián)查詢信息全部展示在頁面時,此時可直接使用將每一條記錄映射到中,在前端頁面遍歷中是即可。如果查詢單表就可以滿足需求,一開始先查詢單表,當(dāng)需要關(guān)聯(lián)信息時,再關(guān)聯(lián)查詢,當(dāng)需要關(guān)聯(lián)信息再查詢這個叫延遲加載。 配置文件和映射文件還有挺多的屬性我還沒有講的,現(xiàn)在就把它們一一補(bǔ)全 映射文件 在mapper.xml文件中配置很多的sql語句,執(zhí)行每個sql語句時,封裝...

    freewolf 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<