本篇文章主要介紹了mybatis教程之延遲載入詳解。詳細介紹了延遲載入的意義和用法實現,有興趣的可以了解一下
延遲載入
1 使用延遲載入意義
在進行資料查詢時,為了提高資料庫查詢效能,盡量使用單表查詢,因為單表查詢比多表關聯查詢速度快。
如果查詢單表就可以滿足需求,一開始先查詢單表,當需要關聯資訊時,再關聯查詢,當需要關聯資訊再查詢這個叫延遲載入。
mybatis中resultMap提供延遲載入功能,透過resultMap設定延遲載入。
2 設定mybatis支援延遲載入

在SqlMapConfig.xml中設定全域參數:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <!-- 全局配置参数 -->
<settings>
<!-- 延迟加载总开关 -->
<setting name= "lazyLoadingEnabled" value= "true" />
<!-- 设置按需加载 -->
<setting name= "aggressiveLazyLoading" value= "false" />
</settings>
|
登入後複製
3 延遲載入實作
3.1 實作想法
需求:
查詢訂單及使用者的信息,一對一查詢。
剛開始只查詢訂單資訊
當需要使用者時呼叫 Orders類別中的getUser()方法執行延遲載入 ,向資料庫發出sql。
3.2 mapper.xml
#
1 2 3 4 5 6 7 8 9 | <!-- 一对一查询延迟加载
开始只查询订单,对用户信息进行延迟加载
-->
<select id= "findOrderUserListLazyLoading" resultMap= "orderCustomLazyLoading" >
SELECT
orders.*
FROM
orders
</select>
|
登入後複製
3.3 resultMap
#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!-- 一对一查询延迟加载 的配置 -->
<resultMap type= "orders" id= "orderCustomLazyLoading" >
<!-- 完成了订单信息的映射配置 -->
<!-- id:订单关联用户查询的唯 一 标识 -->
<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:延迟加载执行的sql所在的statement的id,如果不在同一个 namespace 需要加 namespace
sql:根据用户id查询用户信息 column:关联查询的列 property:将关联查询的用户信息设置到Orders的哪个属性 -->
<association property= "user"
select= "com.sihai.mybatis.mapper.UserMapper.findUserById" column= "user_id" ></association>
</resultMap>
|
登入後複製
3.4 mapper.java
1 2 | public List<Orders> findOrderUserListLazyLoading() throws Exception;
|
登入後複製
3.5 測試程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @Test
public void testFindOrderUserListLazyLoading() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
OrdersMapperCustom ordersMapperCustom = sqlSession
.getMapper(OrdersMapperCustom. class );
List<Orders> list = ordersMapperCustom.findOrderUserListLazyLoading();
User user = list.get(0).getUser();
System.out.println(user);
}
|
登入後複製
4 resultType、resultMap、延遲載入使用場景總結
4.1 延遲載入:
延遲加載實現的方法多種多樣,在只查詢單表就可以滿足需求,為了提高資料庫查詢效能使用延遲加載,再查詢關聯資訊。
mybatis提供延遲載入的功能用於service層。
4.2 resultType:
#作用:將查詢結果依照sql列名pojo屬性名一致性對應到pojo。
場合:常見一些明細記錄的展示,將關聯查詢資訊全部展示在頁面時,此時可直接使用resultType將每一筆記錄對應到pojo中,在前端頁面遍歷list(list中是pojo)即可。
4.3 resultMap:
#使用association和collection完成一對一和一對多進階對應。
4.4 association:
#作用:將關聯查詢資訊對應到一個pojo類別。
場合:為了方便取得關聯資訊可以使用association將關聯訂單對應為pojo,例如:查詢訂單及關聯使用者資訊。
4.5 collection:
作用:將關聯查詢資訊對應到一個list集合中。
場合:為了方便取得關聯資訊可以使用collection將關聯資訊對應到list集合中,例如:查詢使用者權限範圍模組和功能,可使用collection將模組和功能清單對應到list中。
【相關推薦】
1. 特別推薦:「php程式設計師工具箱」V0.1版本下載
2. Java免費影片教學
3. 全面解析Java註解
以上是介紹mybatis延遲載入的解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!