Mybatis---resultMap的延遲載入 (懶載入)
阿新 • • 發佈:2019-02-17
延遲載入:
resultMap 的資料以 樹狀結構 為主,當我們用到分支資料的時候再查下,反之則,不查詢,這樣可以節省資料庫資源。
在程式碼中可以更詳細一些。
<settings><!-- -->
<!-- 懶載入設定為 true -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 積極載入設定為false -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
Mybatis的配置檔案規定setting配置順序得在properties節點下。
association 和collection 就具有懶載入特性
在Mapper配置檔案中配置如下:
<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 對映的 引數。
測試時只要輸出list物件中的order的id。讀取了User 和 OrderItem物件,出發了懶載入,所以你會看到控制檯列印了3次 select 語句,當我們呼叫資料時才會查詢資料庫。