MyBatis 之 延遲加載(Lazy Load)

1. LazyLoad 的做用:java

    在數據與對象進行 mapping 操做時,只有在真正使用到 該對象時,才進行 mapping 操做,以減小數據庫查詢開銷,從而提高系統性能
sql

    可是Lazy Load也有缺點,在 按需加載時會屢次鏈接數據庫,同時會增長數據庫的壓力。因此在實際使用時,會衡量是否使用 延遲加載。
數據庫

2. 實現:mybatis

    1)在 sqlMapConfig.xml 文件中配置 Lazy Load 的開關。
app

<settings>
	<!-- 開啓全局性設置懶加載 -->
	<setting name="lazyLoadingEnabled" value="true"/>
	<!-- 開啓按需加載 -->
	<setting name="aggressiveLazyLoading" value="false"/>
</settings>

    2)在 sqlMapper.xml 映射文件中中配置sql映射,這裏是一對一查詢<association>,也可用在 <collection>中
性能

<!-- 訂單及用戶信息, Lazy Load -->
<resultMap id="orderAndUser" type="mybatis_b.model.Order">
  <!-- id 這裏表示結果集的惟一主鍵,雖然出現重複的orderDetail,可是屬於同一個orderId -->
  <id property="orderId" column="orderId"/>
  <result property="user_id" column="user_id"/>
  <result property="orderNumber" column="orderNumber"/>
  <!-- 延遲加載,經過 findUserById 來查詢User 信息, column="user_id" 是上面查詢出來的userid,做爲parameterType傳入到 findUserById 方法 -->
  <association property="user" javaType="mybatis_b.model.User" select="findUserById" column="user_id">
  	<!-- 這裏能夠使用延遲加載來查詢User信息,經過  findUserById 
  	<id property="userId" column="userId"/>
	<result property="username" column="username"/>
	<result property="sex" column="sex"/>
	<result property="birthday" column="birthday"/>
	<result property="address" column="address"/>
	<result property="detail" column="detail"/>
	<result property="score" column="score"/>
  	-->
  </association>
</resultMap>
  
<!-- user 查詢 -->
<select id="findUserById" parameterType="int" resultType="user">
  select * from users where userId = #{user_id}
</select>
  
<select id="findOrderAndUser_lazyLoad" resultMap="orderAndUser">
  select * from orders
</select>

    3)定義 mapper 接口,並調用接口方法
spa

//延遲加載
	@Test
	public void testFindOrderAndUser_lazyLoad() throws Exception {
		//獲取SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//指定 mapper 接口的類型,MyBatis經過動態代理的方式實現mapper接口
		OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
		
		List<Order> list = orderMapper.findOrderAndUser_lazyLoad();
		
		System.out.println(list.size());
		//Iterator<Order> iterator = list.iterator();
		//while (iterator.hasNext()) {
			//Order order = (Order) iterator.next();
			//System.out.println(order.getUser());
		//}
	}

    執行結果:代理

    若是去掉上面代碼註釋的部分,那麼就調用了getUser()的方法,mybatis 會自動調用 findUserById() 去獲取 User信息。結果以下:
code

若是關閉了 Lazy Load,那麼結果是這樣的:xml

相關文章
相關標籤/搜索