1. 程式人生 > >MyBatis(八) resultMap 之 (三) 延遲載入 (懶載入)

MyBatis(八) resultMap 之 (三) 延遲載入 (懶載入)

繼承第七章的例子:
下面我們講延遲載入 也叫 懶載入。
延遲載入: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 方法,通過斷點方式去檢視)