MyBatis延遲加載(懶加載)

什麼是延遲加載

將採用高級映射實現多表聯查時向數據庫發出的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>

相關資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章