前記:這是很早之前自學學習myBatis時的筆記,內容比較基礎,適合新手,內容基本是來自網絡,如有雷同,敬請諒解!
延遲加載
打開延遲加載的開關
在mybatis核心配置文件中配置:
lazyLoadingEnabled、
aggressiveLazyLoading
<settings>
<setting name="lazyLoadingEnabled"value="true"/>
<setting name="aggressiveLazyLoading"value="false"/>
</settings>
或者
使用association實現延遲加載
使用association即是實現一對一的延遲加載查詢
延遲加載resultMap
使用association中的select指定延遲加載去執行的statement的id。
<!-- 延遲加載的resultMap -->
<resultMaptype="cn.po.Orders" id="OrdersUserLazyLoadingResultMap">
<!--對訂單信息進行映射配置 -->
<idcolumn="id"property="id"/>
<resultcolumn="user_id"property="userId"/>
<resultcolumn="number"property="number"/>
<resultcolumn="createtime"property="createtime"/>
<resultcolumn="note"property="note"/>
<!--實現對用戶信息進行延遲加載
select:指定延遲加載需要執行的statement的id(是根據user_id查詢用戶信息的statement)
要使用userMapper.xml中findUserById完成根據用戶id(user_id)用戶信息的查詢,如果findUserById不在本mapper中需要前邊加namespace
column:訂單信息中關聯用戶信息查詢的列,是user_id
關聯查詢的sql理解爲:
SELECTorders.*,
(SELECT username FROM USERWHERE orders.user_id
=user.id) username,
(SELECT sex FROM USER WHEREorders.user_id = user.id)
sex
FROM orders
-->
<associationproperty="user" javaType="cn.po.User" select="cn.mapper.UserMapper.findUserById" column="user_id">
<!--實現對用戶信息進行延遲加載 -->
</association>
</resultMap>
注:上面的resultMap事例,是查詢訂單信息(orders),如果用需要的情況下,延遲加載每個訂單對應的用戶信息(一個訂單隻對應一個發票,即屬於一對一的查詢)。
Mapper.xml
需要定義兩個mapper的方法對應的statement。
1、只查詢訂單信息
SELECT * FROM orders
在查詢訂單的statement中使用association去延遲加載(執行)下邊的satatement(關聯查詢用戶信息)
2、關聯查詢用戶信息
通過上邊查詢到的訂單信息中user_id去關聯查詢用戶信息
使用UserMapper.xml中的findUserById
上邊先去執行findOrdersUserLazyLoading,當需要去查詢用戶的時候再去執行findUserById,通過resultMap的定義將延遲加載執行配置起來。
使用collection實現延遲加載
使用collection實現延遲加載,即實現一對多查詢的延遲加載。
在collection標籤中配置select內容即可,使用方法與association相同。
延遲加載思考與小結
思考
不使用mybatis提供的association及collection中的延遲加載功能,如何實現延遲加載??
實現方法如下:
定義兩個mapper方法:
1、查詢訂單列表
2、根據用戶id查詢用戶信息
實現思路:
先去查詢第一個mapper方法,獲取訂單信息列表
在程序中(service),按需去調用第二個mapper方法去查詢用戶信息。
總之:
使用延遲加載方法,先去查詢簡單的sql(最好單表,也可以關聯查詢),再去按需要加載關聯查詢的其它信息。
小結
作用:
當需要查詢關聯信息時再去數據庫查詢,默認不去關聯查詢,提高數據庫性能。
只有使用resultMap支持延遲加載設置。
場合:
當只有部分記錄需要關聯查詢其它信息時,此時可按需延遲加載,需要關聯查詢時再向數據庫發出sql,以提高數據庫性能。
當全部需要關聯查詢信息時,此時不用延遲加載,直接將關聯查詢信息全部返回即可,可使用resultType或resultMap完成映射。