1. 程式人生 > >mybatis教程--延遲載入詳解

mybatis教程--延遲載入詳解

延遲載入

使用延遲載入意義

在進行資料查詢時,為了提高資料庫查詢效能,儘量使用單表查詢,因為單表查詢比多表關聯查詢速度要快。

如果查詢單表就可以滿足需求,一開始先查詢單表,當需要關聯資訊時,再關聯查詢,當需要關聯資訊再查詢這個叫延遲載入。

mybatisresultMap提供延遲載入功能,通過resultMap配置延遲載入。

配置mybatis支援延遲載入

 

在 SqlMapConfig.xml中配置全域性引數:
<!-- 全域性配置引數 -->

<settings>

<!-- 延遲載入總開關 -->

<setting name="lazyLoadingEnabled" value="true" />

<!-- 設定按需載入 -->

<setting name="aggressiveLazyLoading" value="false" />

</settings>

延遲載入實現

3.1 實現思路

需求:

查詢訂單及使用者的資訊,一對一查詢。

剛開始只查詢訂單資訊

當需要使用者時呼叫 Orders類中的getUser()方法執行延遲載入 ,向資料庫發出sql

3.2 mapper.xml

<!-- 一對一查詢延遲載入
	 開始只查詢訂單,對使用者資訊進行延遲載入 
	  -->
	 <select id="findOrderUserListLazyLoading" resultMap="orderCustomLazyLoading">
		 SELECT 
		  orders.*
		FROM
		  orders
	 </select>

3.3 resultMap

<!-- 一對一查詢延遲載入 的配置 -->
	<resultMap type="orders" id="orderCustomLazyLoading">
		<!-- 完成了訂單資訊的對映配置 -->
		<!-- id:訂單關聯使用者查詢的唯 一 標識 -->
		<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" />
		<!-- 配置使用者資訊的延遲載入 select:延遲載入執行的sql所在的statement的id,如果不在同一個namespace需要加namespace 
			sql:根據使用者id查詢使用者資訊 column:關聯查詢的列 property:將關聯查詢的使用者資訊設定到Orders的哪個屬性 -->
		<association property="user"
			select="com.sihai.mybatis.mapper.UserMapper.findUserById" column="user_id"></association>


	</resultMap>

3.4 mapper.java

//一對一查詢,延遲載入
	public List<Orders> findOrderUserListLazyLoading() throws Exception;

3.5 測試程式碼

// 一對一查詢延遲載入
	@Test
	public void testFindOrderUserListLazyLoading() throws Exception {

		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 建立mapper代理物件
		OrdersMapperCustom ordersMapperCustom = sqlSession
				.getMapper(OrdersMapperCustom.class);

		// 呼叫方法
		List<Orders> list = ordersMapperCustom.findOrderUserListLazyLoading();
		
		//這裡執行延遲載入,要發出sql
		User user = list.get(0).getUser();
		System.out.println(user);
		
	}

4 resultTyperesultMap、延遲載入使用場景總結

4.1 延遲載入:

延遲載入實現的方法多種多樣,在只查詢單表就可以滿足需求,為了提高資料庫查詢效能使用延遲載入,再查詢關聯資訊。

mybatis提供延遲載入的功能用於service層。

4.2 resultType

作用:

將查詢結果按照sql列名pojo屬性名一致性對映到pojo中。

場合:

常見一些明細記錄的展示,將關聯查詢資訊全部展示在頁面時,此時可直接使用resultType將每一條記錄對映到pojo中,在前端頁面遍歷listlist中是pojo)即可。

4.3 resultMap

使用associationcollection完成一對一和一對多高階對映。

4.4 association

作用:

將關聯查詢資訊對映到一個pojo類中。

場合:

為了方便獲取關聯資訊可以使用association將關聯訂單對映為pojo,比如:查詢訂單及關聯使用者資訊。

4.5 collection

作用:

將關聯查詢資訊對映到一個list集合中。

場合:

為了方便獲取關聯資訊可以使用collection將關聯資訊對映到list集合中,比如:查詢使用者許可權範圍模組和功能,可使用collection將模組和功能列表對映到list中。