標籤:

Mybatis6:延遲載入

1.1 什麼是延遲載入

resultMap可以實現高級映射(使用association、collection實現一對一及一對多映射),association、collection具備延遲載入功能。

需求:

如果查詢訂單並且關聯查詢用戶信息。如果先查詢訂單信息即可滿足要求,當我們需要查詢用戶信息時再查詢用戶信息。把對用戶信息的按需去查詢就是延遲載入。

延遲載入:先從單表查詢、需要時再從關聯表去關聯查詢,大大提高 資料庫性能,因為查詢單表要比關聯查詢多張錶速度要快。

2.1 使用association實現延遲載入

1.1.1 需求

查詢訂單並且關聯查詢用戶信息

1.1.2 mapper.xml

需要定義兩個mapper的方法對應的statement。

1、只查詢訂單信息

SELECT * FROM orders

在查詢訂單的statement中使用association去延遲載入(執行)下邊的satatement(關聯查詢用戶信息)

2、關聯查詢用戶信息

通過上邊查詢到的訂單信息中user_id去關聯查詢用戶信息

使用UserMapper.xml中的findUserById

上邊先去執行findOrdersUserLazyLoading,當需要去查詢用戶的時候再去執行findUserById,通過resultMap的定義將延遲載入執行配置起來。

1.1.1 mapper.xml

需要定義兩個mapper的方法對應的statement。

1、只查詢訂單信息

SELECT * FROM orders

在查詢訂單的statement中使用association去延遲載入(執行)下邊的satatement(關聯查詢用戶信息)

2、關聯查詢用戶信息

通過上邊查詢到的訂單信息中user_id去關聯查詢用戶信息

使用UserMapper.xml中的findUserById

通俗一點來講:

上邊先去執行findOrdersUserLazyLoading,當需要去查詢用戶的時候再去執行findUserById,通過resultMap的定義將延遲載入執行配置起來。

1.1.2 延遲載入resultMap

使用association中的select指定延遲載入去執行的statement的id。

<!-- 延遲載入的resultMap --><resultMap type="cn.itcast.mybatis.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)要使用userMapper.xml中findUserById完成根據用戶id(user_id)用戶信息的查詢,如果findUserById不在本mapper中需要前邊加namespacecolumn:訂單信息中關聯用戶信息查詢的列,是user_id關聯查詢的sql理解為:SELECT orders.*,(SELECT username FROM USER WHERE orders.user_id = user.id)username,(SELECT sex FROM USER WHERE orders.user_id = user.id)sexFROM orders--><association property="user" javaType="cn.itcast.mybatis.po.User" select="cn.itcast.mybatis.mapper.UserMapper.findUserById" column="user_id"><!-- 實現對用戶信息進行延遲載入 --></association></resultMap>

1.1.3 mapper.java

測試思路:

1、執行上邊mapper方法(findOrdersUserLazyLoading),內部去調用cn.itcast.mybatis.mapper.OrdersMapperCustom中的findOrdersUserLazyLoading只查詢orders信息(單表)。

2、在程序中去遍歷上一步驟查詢出的List<Orders>,當我們調用Orders中的getUser方法時,開始進行延遲載入。

3、延遲載入,去調用UserMapper.xml中findUserbyId這個方法獲取用戶信息。

延遲載入配置

即我們要將懶載入開啟,積極載入關閉

在sqlMapConfig中進行配置

測試代碼

當調用getUser()方法時才會調用延遲載入

總結:My

使用延遲載入方法,先去查詢簡單的sql(最好單表,也可以關聯查詢),再去按需要載入關聯查詢的其它信息。


推薦閱讀:

MyBatis3:SqlMapConfig配置文件
我的產品開發之旅 - SSM框架升級API平台(Spring + SpringMVC + MyBatis)
Mybatis7:查詢緩存
Mybatis4:訂單商品模型分析+高級映射

TAG:MyBatis |