MyBatis(八) resultMap 之 (三) 延遲載入 (懶載入)
阿新 • • 發佈:2019-01-26
繼承第七章的例子:
下面我們講延遲載入 也叫 懶載入。
延遲載入:resultMap 的資料以 樹狀結構 為主,當我們用到分支資料的時候再查下,反之則,不查詢,這樣可以節省資料庫資源。
那麼我在上一個demo的基礎做一點小改進:
1、首先在 mybatis-config.xml 中新增設定:
<configuration>
<settings><!-- -->
<!-- 懶載入設定為 true -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 積極載入設定為false -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
2、修改 Mapper 對映檔案 OrderDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zll.mybatis.dao.OrderDaoLazy">
<resultMap type="com.zll.mybatis.bean.Orders" id="findOrderDetailMap">
<id column="id" property="id" />
<result column="createTime" property="createTime" />
<result column="userId" property="userId" />
<association property="user" javaType="com.zll.mybatis.bean.User"
column="id" select="findUser" />
<collection property="orderItems" ofType="com.zll.mybatis.bean.OrderItem"
column="id" select="findOrdersItem" />
</resultMap>
<select id="findOrderDetailLazy" resultMap="findOrderDetailMap">
select * from orders
</select>
<select id="findUser" parameterType="int" resultType="com.zll.mybatis.bean.User">
select *
from user where id = #{id}
</select>
<select id="findOrdersItem" parameterType="int" resultType="com.zll.mybatis.bean.OrderItem">
select * from orderItem where orderId = #{id}
</select>
</mapper>
注意:由於是懶載入是分開查詢,所以我們的每個select 對映也需要分開寫。
這裡需要注意的就是 association 和 collection 標籤中的 column 和select屬性
select: 填寫 我們要呼叫的 select 對映的 id
column : 填寫 我們要傳遞給 select 對映的 引數。
測試程式碼:
/**
* Unit test for simple App.
*/
public class AppTest extends TestCase {
public void selectOrder() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
OrderDaoLazy mapper = session.getMapper(OrderDaoLazy.class);
List<Orders> orders = mapper.findOrderDetailLazy();
for(int i=0; i<orders.size(); i++){
System.out.println(orders.get(i).toString());
}
session.close();
}
}
注意:由於我們的Order類中的 toString方法 讀取了User 和 OrderItem物件,出發了懶載入,所以你會看到控制檯列印了3次 select 語句,當我們呼叫資料時才會查詢資料庫。(如果想進步測試,可以將 Order 類中的toString,方法去掉,然後分別呼叫getUser 和 getOrderItems 方法,通過斷點方式去檢視)