什麼是延遲加載
將採用高級映射實現多表聯查時向數據庫發出的SQL語句拆分成若干條單表查詢的SQL語句,當需要返回數據時纔會向數據庫發出只針對當前數據的SQL語句。
1、延遲加載的條件:
使用resultMap高級映射(主要體現在與元素association、collection實現一對一及一對多映射上),association、collection具備分層查詢的功能,間接具備了實現延遲加載的屬性。
2、延遲加載的好處:
先從單表查詢、需要時再從關聯表去關聯查詢,提升數據庫性能,因爲查詢單表要比關聯查詢多張錶速度要快,內存資源佔用更少。但是很少使用,內存不夠就加內存,畢竟能用錢解決的事情就別燒腦。
Mapper文件
<!-- 懶加載(按需加載): select user_id from order WHERE id=1;//得到user_id
select * from user WHERE id=1 //1 是上一個查詢得到的user_id的值 property:別名(屬性名) column:列名 -->
<select id="getOrderByOrderId" resultMap="getOrderMap">
select * from orders
</select>
<resultMap type="com.ys.lazyload.Orders" id="getOrderMap">
<id column="id" property="id" />
<result column="number" property="number" />
<!-- select:指定延遲加載需要執行的statement的id(根據user_id查詢的statement) 如果不在本文件中,需要加上namespace
property:resultMap中type指定類中的屬性名 column:和select查詢關聯的字段user_id -->
<association property="user"
javaType="com.ys.lazyload.User" column="user_id"
select="getUserByUserId">
</association>
</resultMap>
<select id="getUserByUserId" resultType="com.ys.lazyload.User">
select * from user where
id=#{id}
</select>
MyBatis配置文件
<!-- 開啓懶加載配置 -->
<settings>
<!-- 全局性設置懶加載。如果設爲'false',則所有相關聯的都會被初始化加載。 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 當設置爲'true'的時候,懶加載的對象可能被任何懶屬性全部加載。否則,每個屬性都按需加載。 -->
<setting name="aggressiveLazyLoading" value="false" />
</settings>