延遲加載概念:需要用到數(shù)據(jù)時才進行加載耘纱,不需要用到數(shù)據(jù)時就不加載數(shù)據(jù)殴玛,延遲加載也叫做懶加載。
優(yōu)點:先從單表查詢翘地,需要用的時候再從關聯(lián)表去關聯(lián)查詢申尤,大大提高數(shù)據(jù)庫性能,因為查詢單表要比關聯(lián)查詢多張表速度要快子眶。
缺點:因為只有當需要用到數(shù)據(jù)時瀑凝,才會進行數(shù)據(jù)庫查詢,在大批量數(shù)據(jù)查詢時臭杰,因為查詢工作也要耗費時間粤咪,所以造就用戶用戶等待時間較長,造成用戶體驗下降渴杆。
使用場景:
一對多寥枝,多對多:通常使用延遲加載宪塔。
一對一,多對一:通常使用立即加載囊拜。
注意:延遲加載是基于嵌套查詢實現(xiàn)的
局部延遲加載
<!— 開啟一對多 延遲加載 —>
<resultMap id = “UserMap" type = “user”>
<id cloumn=“id” property=“id”></id>
<result column=“username” property=“username”></result>
<!— fetchType = “l(fā)azy 懶加載策略”
fetchType = “eager 立即加載策略”
—>
<collection property=“orderList” ofType=“order” column=“id” select = “com.lagou.dao.orderMapper.findByUid” fetchType =“l(fā)azy”>
</collection>
</resultMap>
<select id = “findAll” resultMap = “userMap”>
select * from `user`
</select>
全局延遲加載
在Mybatis的核心配置文件總可以使用setting標簽修改全局的加載策略
<settings>
<!— 開啟全局延遲加載功能 —>
<setting name = “l(fā)azyLoadingEnabled” value = “true"></setting>
</settings>
詳細配置可參考官方文檔的介紹:https://mybatis.org/mybatis-3/zh/configuration.html#settings
注意:局部的加載策略優(yōu)先級高于全局的加載策略某筐。
延遲加載原理:
使用CGLIB或Javassist(默認)創(chuàng)建目標對象的代理對象,當調(diào)用代理 對象的延遲加載屬性的getting方法時冠跷,進入攔截器方法(invoke)南誊。發(fā)現(xiàn)該方法需要延遲加載時,會單獨發(fā)送事先保存好的查詢關聯(lián)對象的SQL蜜托,查詢上來后調(diào)用set方法抄囚,為屬性設置值,接著調(diào)用get方法橄务,返回我們剛剛set的內(nèi)容幔托,這就是延遲加載的基本原理
延遲加載原理總結(jié):
延遲加載主要是通過動態(tài)代理的形式實現(xiàn),通過代理攔截到指定方法蜂挪,執(zhí)行數(shù)據(jù)加載重挑。