1. 程式人生 > >MyBatis懶載入

MyBatis懶載入

resultMap可以實現高階對映,即使用association和collection實現一對一、一對多的對映,association和collection具備懶載入的功能。懶載入可以提高資料庫效能,MyBatis延遲載入的策略是先從單表查詢然後再從關聯表查詢,這樣可以大大提高資料庫效能,單表查詢要比關聯查詢多張錶速度要快。

1、資料庫設計

user使用者表


orders訂單表


orders訂單表外來鍵


2、需求

查詢訂單表,並且關聯使用者資訊

3、SQL語句


4、實現

4.1、在MyBatis配置檔案SqlMapConfig.xml中新增全域性引數

<settings>
<!-- 開啟延遲載入的開關 -->
	<setting name="lazyLoadingEnabled" value="true"/>
	<!-- 將積極載入改為消極載入即按需要載入 -->
	<setting name="aggressiveLazyLoading" value="false"/>
</settings>
4.2、在OrdersMapper.xml檔案中新增resultMap
<!-- 延遲載入的resultMap -->
<resultMap type="org.mybatis.demo.po.Orders" id="OrdersUserLazyLoadingResultMap">
	<!--對訂單資訊進行對映配置 -->
	<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:指定延遲載入需要執行的statement的id(是根據user_id查詢使用者資訊的statement) 
	,如果findUserById不在本mapper中需要前邊加namespace 
	column:訂單資訊中關聯使用者資訊查詢的列,是user_id,即外來鍵-->
	<association property="user" javaType="org.mybatis.demo.po.User"
		select="org.mybatis.demo.mapper.OrdersMapper.findUserById" column="user_id">
	</association>
</resultMap>
4.3、select中引用resultMap
<select id="findUserById" parameterType="int" resultType="org.mybatis.demo.po.User">
	SELECT * FROM USER WHERE id=#{value}
</select>
<!-- 查詢訂單關聯查詢使用者,使用者資訊需要延遲載入 -->
<select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">
	SELECT * FROM orders
</select>
4.4、建立OrdersMapper介面關聯OrdersMapper.xml
package org.mybatis.demo.mapper;

import java.util.List;

import org.mybatis.demo.po.Orders;

public interface OrdersMapper {
	public List<Orders> findOrdersUserLazyLoading();
}
4.5、測試
package org.mybatis.demo.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import org.mybatis.demo.mapper.OrdersMapper;
import org.mybatis.demo.po.Orders;

public class TestMyBatis {

	private SqlSessionFactory sessionFactory;

	@Before
	public void createSqlSessionFactory() throws IOException {
		//引入配置檔案
		String resource = "SqlMapConfig.xml";
		InputStream ins = Resources.getResourceAsStream(resource);
		
		//建立SqlSession物件
		sessionFactory = new SqlSessionFactoryBuilder().build(ins);
	}
	
	@Test
	public void test1() {
		SqlSession session = null;
		try {
			session = sessionFactory.openSession();
			OrdersMapper mapper = session.getMapper(OrdersMapper.class);
			List<Orders> list = mapper.findOrdersUserLazyLoading();
			for(Orders order : list){
				System.out.println(order.getUser().getUsername() + " 在 " +order.getCreatetime() + " 提交了訂單");
			}
		} finally {
			if(session != null){
				session.close();
			}
		}
	}

}
4.6、原始碼