Mybatis中的延遲加載詳細(xì)解析
一、什么叫延遲加載、立即加載
1.什么是延遲加載 在真正需要使用數(shù)據(jù)時(shí)才發(fā)起查詢,不用的時(shí)候不進(jìn)行查詢。按需加載(懶加載)
2. 什么是立即加載 不管用不用,只要一調(diào)用方法,馬上發(fā)起查詢。
二、Mybatis中的延遲加載
需求: 在一對多中,當(dāng)我們有一個(gè)用戶,它有10個(gè)角色。 在查詢用戶時(shí),用戶下的角色信息應(yīng)該是,什么時(shí)候使用,什么時(shí)候查詢的。
在查詢角色時(shí),賬戶的所屬用戶信息應(yīng)該是隨著賬戶查詢時(shí)一起查詢出來。
在對應(yīng)的四種表關(guān)系中: 一對多,多對一,一對一,多對多 一 對多,多對多:通常情況下我們都是采用延遲加載。
多對一,一對一:通常情況下我們都是采用立即加載。
一對一延遲加載
例:以用戶和賬戶關(guān)系為例,查詢一個(gè)賬戶時(shí)顯示當(dāng)前賬戶的所屬用戶 查詢方法
1.dao層接口
public interface IAccountDao { /** * 查詢所有賬戶,同時(shí)還要獲取到當(dāng)前賬戶的所屬用戶信息 * @return */ List<Account> findAll(); }
2.映射文件:
<resultMap id="accountUserMap" type="account"> <id property="id" column="id"></id> <result property="uid" column="uid"></result> <result property="money" column="money"></result> <!-- 一對一的關(guān)系映射:配置封裝user的內(nèi)容 select屬性制定的內(nèi)容:查詢用戶的唯一標(biāo)識(shí) column屬性指定的內(nèi)容:用戶根據(jù)id時(shí),所需要的參數(shù)值的值--> <association property="user" column="uid" javaType="user" select="com.rpf.dao.IUserDao.findById"></association> </resultMap> <!-- 查詢所有 --> <select id="findAll" resultMap="accountUserMap"> select * from account </select>
3.Mybatis主配置文件配置開啟懶加載
<!--加入settings--> <settings> <!--開啟Mybatis支持延遲加載--> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"></setting> </settings>
4.測試
@Test public void testFindAll(){ List<Account> accounts = accountDao.findAll(); }
效果圖 沒開啟延遲加載之前執(zhí)行了三條
開啟了延遲加載后 執(zhí)行了一條語句
一對多實(shí)現(xiàn)延遲加載
1. dao層接口 List findAll();
2.映射文件
//user <resultMap id="userAccountMap" type="user"> <id property="id" column="id"></id> <result property="username" column="username"></result> <result property="address" column="address"></result> <result property="sex" column="sex"></result> <result property="birthday" column="birthday"></result> <!-- 配置user對象中accounts集合的映射 --> <collection property="accounts" ofType="account" select="com.rpf.dao.AccountDao.findAccountByUid" column="id"></collection> </resultMap> <!-- 查詢所有 --> <select id="findAll" resultMap="userAccountMap"> select * from user </select> <!-- 根據(jù)id查詢用戶 --> <select id="findById" parameterType="INT" resultType="user"> select * from user where id = #{uid} </select>
<!-- 根據(jù)用戶id查詢賬戶列表 account --> <select id="findAccountByUid" resultType="account"> select * from account where uid=#{uid} </select>
3.測試類:
@Test public void testFindAll(){ List<User> users = userDao.findAll(); }
只查詢了用戶并沒有查用戶下賬戶的信息
到此這篇關(guān)于Mybatis中的延遲加載詳細(xì)解析的文章就介紹到這了,更多相關(guān)Mybatis延遲加載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?Spring?boot日期和時(shí)間統(tǒng)一設(shè)置三種方法
時(shí)間和日期的統(tǒng)一設(shè)置在項(xiàng)目中經(jīng)常是會(huì)遇到的,下面這篇文章主要給大家介紹了關(guān)于Java?Spring?boot日期和時(shí)間統(tǒng)一設(shè)置的三種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08java算法導(dǎo)論之FloydWarshall算法實(shí)現(xiàn)代碼
這篇文章主要介紹了算法導(dǎo)論之FloydWarshall算法實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05關(guān)于maven全局配置文件settings.xml解析
這篇文章主要介紹了關(guān)于maven全局配置文件settings.xml,具有很好的參考價(jià)值,希望對大家有所幫助。2022-03-03Java中CountDownLatch進(jìn)行多線程同步詳解及實(shí)例代碼
這篇文章主要介紹了Java中CountDownLatch進(jìn)行多線程同步詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03java通過Idea遠(yuǎn)程一鍵部署springboot到Docker詳解
這篇文章主要介紹了java通過Idea遠(yuǎn)程一鍵部署springboot到Docker詳解,Idea是Java開發(fā)利器,springboot是Java生態(tài)中最流行的微服務(wù)框架,docker是時(shí)下最火的容器技術(shù),那么它們結(jié)合在一起會(huì)產(chǎn)生什么化學(xué)反應(yīng)呢?的相關(guān)資料2019-06-06使用springboot防止反編譯proguard+xjar
介紹了三種代碼混淆和加密工具的使用方法:ProGuard、Xjar和ClassFinal,ProGuard用于混淆Java字節(jié)碼,Xjar提供對JAR包內(nèi)資源的加密和動(dòng)態(tài)解密,而ClassFinal則支持直接加密JAR包或WAR包,通過預(yù)研和實(shí)際操作2024-11-11Java利用Hutool-Script封裝JS腳本執(zhí)行
在?Java?開發(fā)中,有時(shí)需要?jiǎng)討B(tài)執(zhí)行腳本代碼,比如?JavaScript?腳本,來實(shí)現(xiàn)一些靈活的業(yè)務(wù)邏輯,下面我們就來看看如何利用Hutool-Script模塊對Java的腳本執(zhí)行功能進(jìn)行封裝吧2025-02-02Java實(shí)現(xiàn)提取不重復(fù)的整數(shù)實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)提取不重復(fù)的整數(shù)實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12