什么是延遲加載
resultMap可以實現(xiàn)高級映射(使用association反砌、collection實現(xiàn)一對一及一對多映射),association膀藐、collection具備延遲加載功能屠阻。
需求:
如果查詢訂單并且關(guān)聯(lián)查詢用戶信息。如果先查詢訂單信息即可滿足要求额各,當(dāng)我們需要查詢用戶信息時再查詢用戶信息国觉。把對用戶信息的按需去查詢就是延遲加載。
延遲加載:先從單表查詢虾啦,需要時再從關(guān)聯(lián)表去關(guān)聯(lián)查詢麻诀,大大提高數(shù)據(jù)庫性能,因為查詢單表要比關(guān)聯(lián)查詢多張表速度要快傲醉。
使用association實現(xiàn)延遲加載
需求
查詢訂單并且關(guān)聯(lián)查詢用戶信息
mapper.xml
需要定義兩個mapper的方法對應(yīng)的statement蝇闭。
1、只查詢訂單信息
SELECT * FROM orders
在查詢訂單的statement中使用association去延遲加載(執(zhí)行)下邊的statement
2硬毕、關(guān)聯(lián)查詢用戶信息
通過上邊查詢到的訂單信息中user_id去關(guān)聯(lián)查詢用戶信息丁眼。
使用UserMapper.xml中的findUserById
上邊先執(zhí)行findOrdersUserLazyLoading,當(dāng)需要去查詢用戶的時候再去執(zhí)行findUserById昭殉,通過resultMap的定義將延遲加載執(zhí)行配置起來。
延遲加載resultMap
使用association中的select指定延遲加載去執(zhí)行的statement的id藐守。
<!-- 延遲加載的resultMap -->
<resultMap type="cn.iven.mybatis.po.Orders" id="OrdersUserLazyLoadingResultMap">
<!-- 對訂單信息進(jìn)行映射配置 -->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<!-- 實現(xiàn)對用戶信息進(jìn)行延遲加載
select:指定延遲加載需要執(zhí)行的statement的id(是根據(jù)user_id查詢用戶的statement)
要使用UserMapper.xml中的findUserById完成根據(jù)用戶id(user_id)用戶信息的查詢挪丢,如果findUserById不在本mapper中需要前邊加namespace
column:訂單信息中關(guān)聯(lián)用戶信息查詢的列,是user_id
SELECT orders.*,
(SELECT username FROM user WHERE orders.user_id=`user`.id) username,
(SELECT sex FROM user WHERE orders.user_id=`user`.id) sex
FROM orders;
-->
<association property="user" javaType="cn.iven.mybatis.po.User" select="cn.iven.mybatis.mapper.UserMapper.findUserById" column="user_id">
<!-- 實現(xiàn)對用戶信息進(jìn)行延遲加載 -->
</association>
mapper.java
測試
測試思路:
1卢厂、執(zhí)行上邊mapper方法(findOrdersUserLazyLoading),內(nèi)部去調(diào)用cn.iven.mybatis.mapper.OrdersMapperCustom中的findOrdersUserLazyLoading只查詢orders信息(單表)乾蓬。
2、在程序中去遍歷上一步查詢出的List<Orders>,當(dāng)我們調(diào)用Orders的getUser()方法時慎恒,開始進(jìn)行延遲加載任内。
3、延遲加載融柬,去調(diào)用UserMapper.xml中findUserById這個方法獲取用戶信息死嗦。
延遲加載配置
mybatis默認(rèn)沒有開啟延遲加載
在SqlMapConfig.xml配置:
測試代碼
延遲加載思考
不使用mybatis提供的association及collection中的延遲加載功能,如何實現(xiàn)延遲加載粒氧?
實現(xiàn)方法如下:
定義兩個mapper方法:
1越除、查詢訂單列表
2、根據(jù)用戶id查詢用戶信息
實現(xiàn)思路:
先去查詢第一個mapper方法,獲取訂單信息列表
在程序中(service)摘盆,按需去調(diào)用第二個mapper方法去查詢用戶信息翼雀。
總結(jié):
使用延遲加載方法,先去查詢簡單的sql(最好是單表孩擂,也可以是關(guān)聯(lián))狼渊,再去按需加載關(guān)聯(lián)查詢的其他信息。