亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis延遲加載策略深入探究

 更新時(shí)間:2022年07月30日 08:46:22   作者:·~簡(jiǎn)單就好  
本文主要為大家詳細(xì)介紹下mybatis的延遲加載,從原理上介紹下怎么使用、有什么好處能規(guī)避什么問(wèn)題。感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

有兩種寫(xiě)法來(lái)表示查詢(xún)信息,分別是鏈表查詢(xún)和分步查詢(xún)的方法。那么既然我么能用一個(gè)SQL語(yǔ)句能夠執(zhí)行完,那為什么還要分開(kāi)來(lái)寫(xiě)呢?

原因很簡(jiǎn)單:可以發(fā)現(xiàn)如果我們把他們連在一起那么他們就是一個(gè)多表查詢(xún)語(yǔ)句,如果不放在一起執(zhí)行,那那就是單獨(dú)一個(gè)表的查詢(xún)語(yǔ)句。但是這需要我們?cè)O(shè)置mybatis的延遲加載(懶加載)

分步查詢(xún)的優(yōu)點(diǎn)

**可以實(shí)現(xiàn)延遲加載,**但是必須在核心配置文件中設(shè)置全局配置信息

lazyLoadingEnabled:延遲加載的全局開(kāi)關(guān)。當(dāng)開(kāi)啟時(shí),所有關(guān)聯(lián)對(duì)象都會(huì)延遲加載

aggressiveLazyLoding:當(dāng)開(kāi)啟時(shí),任何方式的調(diào)用都會(huì)加載該對(duì)象的所有屬性。否則,該屬性會(huì)按需加載 ,此時(shí)就可以實(shí)現(xiàn)按需加載,需要獲取的數(shù)據(jù)是什么,就只會(huì)執(zhí)行相應(yīng)的sql.此時(shí)會(huì)通過(guò)association和collection中的fetchType屬性設(shè)置當(dāng)前的分步查詢(xún)是否使用懶加載

fetchType=“lazy(延遲加載) | eager(立即加載)”

在主配置文件當(dāng)中設(shè)置延遲加載

延遲加載:在SqlMapConfig.xml中配置延遲加載文件

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING" />  <!-- 打印日志到控制臺(tái)上 -->
    <setting name="lazyLoadingEnabled" value="true"/>   
    <setting name="aggressiveLazyLoading" value="false"/>   <!-- false才會(huì)按需加載,不開(kāi)啟調(diào)用所有的對(duì)象 -->
</settings>

在studentDao.xml當(dāng)中設(shè)置分步查詢(xún)

測(cè)試結(jié)果

此時(shí)開(kāi)啟了懶加載,實(shí)現(xiàn)了分布查詢(xún)

如何使用

public class UserDO {
  private Integer userId;
  private String username;
  private String password;
  private String nickname;
  private List<PermitDO> permitDOList;
  public UserDO() {}
}
<resultMap id="BaseMap" type="org.apache.ibatis.study.entity.UserDO">
    <id column="user_id" jdbcType="INTEGER" property="userId" />
    <result column="username" jdbcType="VARCHAR" property="username" />
    <result column="password" jdbcType="VARCHAR" property="password" />
    <result column="nickname" jdbcType="VARCHAR" property="nickname"/>
    <collection property="permitDOList" column="user_id" select="getPermitsByUserId"
     fetchType="lazy">
    </collection>
</resultMap>
  <resultMap id="PermitBaseMap" type="org.apache.ibatis.study.entity.PermitDO">
    <id column="id" jdbcType="INTEGER" property="id"/>
    <result column="code" jdbcType="VARCHAR" property="code"/>
    <result column="name" jdbcType="VARCHAR" property="name"/>
    <result column="type" jdbcType="TINYINT" property="type"/>
    <result column="pid" jdbcType="INTEGER" property="pid"/>
  </resultMap>
   <select id="getByUserId2" resultMap="BaseMap">
    select * from user
    where user_id = #{userId}
  </select>
  <select id="getPermitsByUserId" resultMap="PermitBaseMap">
    select p.*
    from user_permit up
    inner join permit p on up.permit_id = p.id
    where up.user_id = #{userId}
  </select>

通過(guò)fetchType=lazy指定子查詢(xún)getPermitsByUserId使用懶加載,這樣的話就不用管全局配置lazyLoadingEnabled是true還是false了。當(dāng)然這里可以直接用多表關(guān)聯(lián)查詢(xún)不使用子查詢(xún),使用方法在這篇文章

測(cè)試代碼

public class Test {
  public static void main(String[] args) throws IOException {
    try (InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml")) {
      // 構(gòu)建session工廠 DefaultSqlSessionFactory
      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      SqlSession sqlSession = sqlSessionFactory.openSession();
      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
      UserDO userDO = userMapper.getByUserId2(1);
      System.out.println(userDO);
    }
  }
}

結(jié)果如下,打了斷點(diǎn)可以看到原userDO對(duì)象已被代理并且permitDOList是null需要調(diào)用get方法才會(huì)去查詢(xún)拿到值,咳咳這邊之前直接運(yùn)行顯示是已經(jīng)把permitDOList查詢(xún)出來(lái)了,想了半天啥原因后來(lái)才發(fā)現(xiàn)println會(huì)調(diào)用userDO對(duì)象的toString方法,而toString方法也會(huì)走代理方法直接去調(diào)用子查詢(xún)的

延遲加載的好處

延遲加載主要能解決mybatis的N+1問(wèn)題,什么是N+1問(wèn)題其實(shí)叫1+N更為合理,以上面的業(yè)務(wù)例子來(lái)說(shuō)就是假設(shè)一次查詢(xún)出來(lái)10000個(gè)用戶(hù),那么還需要針對(duì)這10000個(gè)用戶(hù)使用子查詢(xún)getPermitsByUserId獲取每個(gè)用戶(hù)的權(quán)限列表,需要10000次查詢(xún),總共10001次,真實(shí)情況下你可能并不需要每個(gè)子查詢(xún)的結(jié)果,這樣就浪費(fèi)數(shù)據(jù)庫(kù)連接資源了。如果使用延遲加載的話就相當(dāng)于不用進(jìn)行這10000次查詢(xún),因?yàn)樗堑鹊侥阏嬲褂玫臅r(shí)候才會(huì)調(diào)用子查詢(xún)獲取結(jié)果。

到此這篇關(guān)于MyBatis延遲加載策略深入探究的文章就介紹到這了,更多相關(guān)MyBatis延遲加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • 關(guān)于Java中String創(chuàng)建的字符串對(duì)象內(nèi)存分配測(cè)試問(wèn)題

    關(guān)于Java中String創(chuàng)建的字符串對(duì)象內(nèi)存分配測(cè)試問(wèn)題

    這篇文章主要介紹了Java中String創(chuàng)建的字符串對(duì)象內(nèi)存分配測(cè)試,給大家詳細(xì)介紹了在創(chuàng)建String對(duì)象的兩種常用方法比較,通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • java獲取類(lèi)名的方法詳解

    java獲取類(lèi)名的方法詳解

    這篇文章主要介紹了java獲取類(lèi)名的問(wèn)題詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • 解析springBoot-actuator項(xiàng)目構(gòu)造中health端點(diǎn)工作原理

    解析springBoot-actuator項(xiàng)目構(gòu)造中health端點(diǎn)工作原理

    這篇文章主要介紹了springBoot-actuator中health端點(diǎn)工作原理,對(duì)spring-boot-actuator的項(xiàng)目構(gòu)造,工作原理進(jìn)行了全面的梳理,側(cè)重health健康檢查部分
    2022-02-02
  • MyBatis動(dòng)態(tài)Sql之if標(biāo)簽的用法詳解

    MyBatis動(dòng)態(tài)Sql之if標(biāo)簽的用法詳解

    這篇文章主要介紹了MyBatis動(dòng)態(tài)Sql之if標(biāo)簽的用法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-07-07
  • Java匿名內(nèi)部類(lèi)和Lambda(->) 的多種寫(xiě)法總結(jié)

    Java匿名內(nèi)部類(lèi)和Lambda(->) 的多種寫(xiě)法總結(jié)

    這篇文章主要和大家分享一下Java匿名內(nèi)部類(lèi)和Lambda(->) 的多種寫(xiě)法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以先看一下
    2022-07-07
  • springboot整合log4j的踩坑實(shí)戰(zhàn)記錄

    springboot整合log4j的踩坑實(shí)戰(zhàn)記錄

    log日志的重要性不言而喻,所以我們需要在系統(tǒng)內(nèi)根據(jù)實(shí)際的業(yè)務(wù)進(jìn)行日志的整合,下面這篇文章主要給大家介紹了關(guān)于springboot整合log4j的踩坑實(shí)戰(zhàn)記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Spring Boot項(xiàng)目集成UidGenerato的方法步驟

    Spring Boot項(xiàng)目集成UidGenerato的方法步驟

    這篇文章主要介紹了Spring Boot項(xiàng)目集成UidGenerato的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 詳解如何為SpringBoot Web應(yīng)用的日志方便追蹤

    詳解如何為SpringBoot Web應(yīng)用的日志方便追蹤

    在Web應(yīng)用程序領(lǐng)域,有效的請(qǐng)求監(jiān)控和可追溯性對(duì)于維護(hù)系統(tǒng)完整性和診斷問(wèn)題至關(guān)重要,SpringBoot是一種用于構(gòu)建Java應(yīng)用程序的流行框架,在本文中,我們探討了在SpringBoot中向日志添加唯一ID的重要性,需要的朋友可以參考下
    2023-11-11
  • Springboot mybatis-plus配置及用法詳解

    Springboot mybatis-plus配置及用法詳解

    這篇文章主要介紹了Springboot mybatis-plus配置及用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java利用Netty時(shí)間輪實(shí)現(xiàn)延時(shí)任務(wù)

    Java利用Netty時(shí)間輪實(shí)現(xiàn)延時(shí)任務(wù)

    時(shí)間輪是一種可以執(zhí)行定時(shí)任務(wù)的數(shù)據(jù)結(jié)構(gòu)和算法。本文將為大家詳細(xì)講解一下Java如何利用Netty時(shí)間輪算法實(shí)現(xiàn)延時(shí)任務(wù),感興趣的小伙伴可以了解一下
    2022-08-08

最新評(píng)論