" />

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

Mybatis延遲加載的實(shí)現(xiàn)示例

 更新時(shí)間:2026年04月02日 10:03:23   作者:小王不愛笑132  
延遲加載是 MyBatis 的一種優(yōu)化機(jī)制,也稱為懶加載,本文就來詳細(xì)的介紹一下Mybatis延遲加載的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

什么是延遲加載

延遲加載(Lazy Loading)是 MyBatis 的一種優(yōu)化機(jī)制,也稱為懶加載。它指的是在進(jìn)行關(guān)聯(lián)查詢時(shí),按需加載數(shù)據(jù),而不是一次性加載所有關(guān)聯(lián)數(shù)據(jù),從而提高系統(tǒng)性能,減少不必要的數(shù)據(jù)庫查詢。

延遲加載配置

全局配置(SqlMapConfig.xml)

需要在 MyBatis 核心配置文件中開啟延遲加載開關(guān):

<settings>
    <!-- 開啟延遲加載 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 將積極加載改為消極加載(按需加載) -->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>
  • lazyLoadingEnabled:全局開啟延遲加載開關(guān)(默認(rèn) false)
  • aggressiveLazyLoading:是否開啟積極加載(默認(rèn) false)
    • 積極加載:加載一個(gè)對(duì)象時(shí),會(huì)同時(shí)加載所有關(guān)聯(lián)對(duì)象
    • 消極加載:只有真正使用關(guān)聯(lián)對(duì)象時(shí)才會(huì)加載

延遲加載實(shí)現(xiàn)(以 Account 和 User 為例)

1. 實(shí)體類定義

Account 類(包含 User 關(guān)聯(lián)對(duì)象):

public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private Double money;
    // 關(guān)聯(lián)的用戶對(duì)象
    private User user;
    // getter/setter/toString省略
}

User 類:

public class User implements Serializable {
    private Integer id;
    private String name;
    private Date birthday;
    private String sex;
    private String address;
    // getter/setter/toString省略
}

2. Mapper 接口定義

AccountMapper 接口:

public interface AccountMapper {
    // 查詢所有賬戶
    List<Account> findAll();
}

UserMapper 接口:

public interface UserMapper {
    // 根據(jù)ID查詢用戶
    User findById(Integer id);
}

3. Mapper 映射文件配置(關(guān)鍵)

AccountMapper.xml 中配置延遲加載:

<mapper namespace="com.qcby.mapper.AccountMapper">
    <!-- 延遲加載配置 -->
    <select id="findAll" resultMap="accountMap">
        select * from account
    </select>
    <resultMap id="accountMap" type="Account">
        <id column="id" property="id"/>
        <result column="uid" property="uid"/>
        <result column="money" property="money"/>
        <!-- 配置延遲加載 -->
        <association 
            property="user"        <!-- 關(guān)聯(lián)對(duì)象在Account中的屬性名 -->
            javaType="User"        <!-- 關(guān)聯(lián)對(duì)象的類型 -->
            select="com.qcby.mapper.UserMapper.findById"  <!-- 延遲加載時(shí)執(zhí)行的查詢 -->
            column="uid"/>         <!-- 傳遞給select查詢的參數(shù)(賬戶表中的uid字段) -->
    </resultMap>
</mapper>

UserMapper.xml 中需要有對(duì)應(yīng)的查詢方法:

<mapper namespace="com.qcby.mapper.UserMapper">
    <select id="findById" parameterType="int" resultType="User">
        select * from user where id = #{id}
    </select>
</mapper>

延遲加載測(cè)試代碼

public class Test02 {
    private InputStream in;
    private SqlSession session;
    private AccountMapper mapper;
    @Before
    public void init() throws Exception {
        // 加載配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 創(chuàng)建工廠對(duì)象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        // 創(chuàng)建session對(duì)象
        session = factory.openSession();
        // 獲取代理對(duì)象
        mapper = session.getMapper(AccountMapper.class);
    }
    @After
    public void destroy() throws Exception {
        session.close();
        in.close();
    }
    @Test
    public void testLazyLoading() {
        // 1. 查詢所有賬戶(此時(shí)只會(huì)執(zhí)行account表的查詢)
        List<Account> accounts = mapper.findAll();
        // 2. 遍歷賬戶列表
        for (Account account : accounts) {
            System.out.println("賬戶信息:" + account.getMoney());
            // 3. 當(dāng)需要使用user屬性時(shí),才會(huì)執(zhí)行user表的查詢(延遲加載觸發(fā)點(diǎn))
            System.out.println("用戶信息:" + account.getUser().getName());
        }
    }
}

延遲加載執(zhí)行流程解析

  1. 執(zhí)行mapper.findAll()時(shí),MyBatis 只查詢 account 表,獲取賬戶基本信息
  2. 此時(shí) account 對(duì)象中的 user 屬性為代理對(duì)象(尚未查詢數(shù)據(jù)庫)
  3. 當(dāng)執(zhí)行account.getUser().getName()時(shí),才會(huì)觸發(fā) User 查詢
  4. 執(zhí)行com.qcby.mapper.UserMapper.findById方法,傳入 uid 參數(shù)
  5. 獲取用戶信息并賦值給 account 的 user 屬性

延遲加載的優(yōu)點(diǎn)

  1. 減少不必要的 SQL 查詢,提高數(shù)據(jù)庫性能
  2. 減少內(nèi)存占用,只加載當(dāng)前需要的數(shù)據(jù)
  3. 適用于關(guān)聯(lián)數(shù)據(jù)較多但不一定都會(huì)使用的場(chǎng)景

注意事項(xiàng)

  1. 延遲加載只對(duì)關(guān)聯(lián)查詢有效(一對(duì)一、一對(duì)多等)
  2. 必須在核心配置文件中開啟延遲加載開關(guān)
  3. 如果提前關(guān)閉 SqlSession,會(huì)導(dǎo)致延遲加載失?。o法執(zhí)行后續(xù)查詢)
  4. 延遲加載通過 CGLIB 或 JDK 動(dòng)態(tài)代理實(shí)現(xiàn),關(guān)聯(lián)對(duì)象是代理對(duì)象

到此這篇關(guān)于Mybatis延遲加載的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Mybatis延遲加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java擴(kuò)展Hibernate注解支持java8新時(shí)間類型

    java擴(kuò)展Hibernate注解支持java8新時(shí)間類型

    這篇文章主要介紹了java擴(kuò)展Hibernate注解支持java8新時(shí)間類型,需要的朋友可以參考下
    2014-04-04
  • Java設(shè)計(jì)模式之備忘錄模式

    Java設(shè)計(jì)模式之備忘錄模式

    這篇文章主要介紹了Java設(shè)計(jì)模式之備忘錄模式,備忘錄模式(Memento Pattern),屬于行為型設(shè)計(jì)模式,目的是用于保存一個(gè)對(duì)象在某一時(shí)刻的狀態(tài),以便于在將來某個(gè)時(shí)刻根據(jù)此狀態(tài)恢復(fù)該對(duì)象,需要的朋友可以參考下
    2023-12-12
  • java接口防重提交的處理方法

    java接口防重提交的處理方法

    本文主要介紹了java接口防重提交的處理方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • jpa使用manyToOne(opntional=true)踩過的坑及解決

    jpa使用manyToOne(opntional=true)踩過的坑及解決

    這篇文章主要介紹了jpa使用manyToOne(opntional=true)踩過的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java解析JT808協(xié)議的實(shí)現(xiàn)代碼

    java解析JT808協(xié)議的實(shí)現(xiàn)代碼

    這篇文章主要介紹了java解析JT808協(xié)議的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2020-03-03
  • Java判斷兩個(gè)日期相差天數(shù)的方法

    Java判斷兩個(gè)日期相差天數(shù)的方法

    這篇文章主要介紹了Java判斷兩個(gè)日期相差天數(shù)的方法,以實(shí)例形式對(duì)比分析了java進(jìn)行日期換算及對(duì)比的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • SpringBoot數(shù)據(jù)層測(cè)試事務(wù)回滾的實(shí)現(xiàn)流程

    SpringBoot數(shù)據(jù)層測(cè)試事務(wù)回滾的實(shí)現(xiàn)流程

    這篇文章主要介紹了SpringBoot數(shù)據(jù)層測(cè)試事務(wù)回滾的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • Spring注解驅(qū)動(dòng)之關(guān)于@Bean注解指定初始化和銷毀的方法

    Spring注解驅(qū)動(dòng)之關(guān)于@Bean注解指定初始化和銷毀的方法

    這篇文章主要介紹了Spring注解驅(qū)動(dòng)之關(guān)于@Bean注解指定初始化和銷毀的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Java匿名內(nèi)部類的使用方法舉例詳解

    Java匿名內(nèi)部類的使用方法舉例詳解

    Java中的匿名內(nèi)部類是一種沒有名字的局部?jī)?nèi)部類,主要用于一次性實(shí)現(xiàn)接口或繼承類的場(chǎng)合,它們常見于GUI事件處理、多線程編程等場(chǎng)景,簡(jiǎn)化代碼結(jié)構(gòu)同時(shí)提高開發(fā)效率,需要的朋友可以參考下
    2024-09-09
  • 集群環(huán)境中使用ehcache_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    集群環(huán)境中使用ehcache_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了集群環(huán)境中使用ehcache的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評(píng)論

鄂托克旗| 海南省| 长宁县| 舞钢市| 定安县| 柘城县| 潞城市| 永登县| 淄博市| 颍上县| 垫江县| 射阳县| 南乐县| 蓬安县| 余庆县| 环江| 砀山县| 中方县| 韩城市| 阿合奇县| 海林市| 丰县| 公主岭市| 固始县| 弥勒县| 凤庆县| 平塘县| 汉阴县| 芒康县| 灌阳县| 偏关县| 阜康市| 西城区| 乐都县| 金堂县| 凌源市| 青海省| 涟源市| 嵊泗县| 杭州市| 沅陵县|