最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis延遲加載策略深入探究

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

有兩種寫法來表示查詢信息,分別是鏈表查詢和分步查詢的方法。那么既然我么能用一個SQL語句能夠執(zhí)行完,那為什么還要分開來寫呢?

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

分步查詢的優(yōu)點

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

lazyLoadingEnabled:延遲加載的全局開關。當開啟時,所有關聯(lián)對象都會延遲加載

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

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

在主配置文件當中設置延遲加載

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

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

在studentDao.xml當中設置分步查詢

測試結果

此時開啟了懶加載,實現(xià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>

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

測試代碼

public class Test {
  public static void main(String[] args) throws IOException {
    try (InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml")) {
      // 構建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);
    }
  }
}

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

延遲加載的好處

延遲加載主要能解決mybatis的N+1問題,什么是N+1問題其實叫1+N更為合理,以上面的業(yè)務例子來說就是假設一次查詢出來10000個用戶,那么還需要針對這10000個用戶使用子查詢getPermitsByUserId獲取每個用戶的權限列表,需要10000次查詢,總共10001次,真實情況下你可能并不需要每個子查詢的結果,這樣就浪費數(shù)據(jù)庫連接資源了。如果使用延遲加載的話就相當于不用進行這10000次查詢,因為它是等到你真正使用的時候才會調(diào)用子查詢獲取結果。

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

您可能感興趣的文章:

相關文章

  • SpringBoot+阿里云OSS實現(xiàn)在線視頻播放的示例

    SpringBoot+阿里云OSS實現(xiàn)在線視頻播放的示例

    這篇文章主要介紹了SpringBoot+阿里云OSS實現(xiàn)在線視頻播放的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Spring中的REST分頁的實現(xiàn)代碼

    Spring中的REST分頁的實現(xiàn)代碼

    本文將介紹在REST API中實現(xiàn)分頁的基礎知識。我們將專注于使用Spring Boot和Spring Data 在Spring MVC中構建REST分頁,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java基礎學習之構造方法詳解

    Java基礎學習之構造方法詳解

    這篇文章主要為大家詳細介紹了Java基礎學習中構造方法的概述及注意事項,文中的示例代碼講解詳細,對我們學習Java有一定幫助,需要的可以參考一下
    2022-08-08
  • Java多維數(shù)組和Arrays類方法總結詳解

    Java多維數(shù)組和Arrays類方法總結詳解

    這篇文章主要介紹了Java多維數(shù)組和Arrays類方法總結詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • JAVA 實現(xiàn)磁盤文件加解密操作的示例代碼

    JAVA 實現(xiàn)磁盤文件加解密操作的示例代碼

    這篇文章主要介紹了JAVA 實現(xiàn)磁盤文件加解密操作的示例代碼,幫助大家利用Java實現(xiàn)文件的加解密,感興趣的朋友可以了解下
    2020-09-09
  • Idea安裝bpmn插件actiBPM的詳細過程(解決高版本無法安裝actiBPM插件)

    Idea安裝bpmn插件actiBPM的詳細過程(解決高版本無法安裝actiBPM插件)

    這篇文章主要介紹了Idea安裝bpmn插件actiBPM的詳細過程(解決高版本無法安裝actiBPM插件)的問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • Java通過Scanner了解if...else if語句

    Java通過Scanner了解if...else if語句

    這篇文章主要介紹了Java通過Scanner了解if...else if語句,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • Java實現(xiàn)讀取設置pdf屬性信息

    Java實現(xiàn)讀取設置pdf屬性信息

    這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)讀取設置pdf屬性信息,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-01-01
  • SpringBoot實現(xiàn)自動配置的方式詳解

    SpringBoot實現(xiàn)自動配置的方式詳解

    Spring Boot 自動配置 是其核心特性之一,它通過智能化的默認配置減少了開發(fā)者的工作量,自動配置的原理基于條件化配置和 Spring 的 @Configuration 機制,本文給大家講解了SpringBoot實現(xiàn)自動配置的過程,需要的朋友可以參考下
    2025-04-04
  • Java 線程的生命周期完整實例分析

    Java 線程的生命周期完整實例分析

    這篇文章主要介紹了Java 線程的生命周期,結合完整實例形式分析了java線程周期相關的加鎖、釋放鎖、阻塞、同步等原理與操作技巧,需要的朋友可以參考下
    2019-10-10

最新評論

泰宁县| 桐乡市| 张北县| 额济纳旗| 柯坪县| 花莲市| 甘孜| 本溪市| 奇台县| 昌图县| 枣庄市| 娱乐| 揭阳市| 永济市| 太原市| 克东县| 吉林省| 讷河市| 和龙市| 永顺县| 文昌市| 全州县| 日土县| 三原县| 九台市| 衡东县| 南江县| 内江市| 古丈县| 浮梁县| 新宾| 友谊县| 潼南县| 浪卡子县| 盘锦市| 石楼县| 舒城县| 宁津县| 东海县| 兴文县| 同德县|