mybatis教程--延遲載入詳解
阿新 • • 發佈:2019-02-15
延遲載入
1 使用延遲載入意義
在進行資料查詢時,為了提高資料庫查詢效能,儘量使用單表查詢,因為單表查詢比多表關聯查詢速度要快。
如果查詢單表就可以滿足需求,一開始先查詢單表,當需要關聯資訊時,再關聯查詢,當需要關聯資訊再查詢這個叫延遲載入。
mybatis中resultMap提供延遲載入功能,通過resultMap配置延遲載入。
2 配置mybatis支援延遲載入
在 SqlMapConfig.xml中配置全域性引數:
<!-- 全域性配置引數 --> <settings> <!-- 延遲載入總開關 --> <setting name="lazyLoadingEnabled" value="true" /> <!-- 設定按需載入 --> <setting name="aggressiveLazyLoading" value="false" /> </settings>
3 延遲載入實現
3.1 實現思路
需求:
查詢訂單及使用者的資訊,一對一查詢。
剛開始只查詢訂單資訊
當需要使用者時呼叫 Orders類中的getUser()方法執行延遲載入 ,向資料庫發出sql。
3.2 mapper.xml
<!-- 一對一查詢延遲載入 開始只查詢訂單,對使用者資訊進行延遲載入 --> <select id="findOrderUserListLazyLoading" resultMap="orderCustomLazyLoading"> SELECT orders.* FROM orders </select>
3.3 resultMap
<!-- 一對一查詢延遲載入 的配置 --> <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
//一對一查詢,延遲載入
public List<Orders> findOrderUserListLazyLoading() throws Exception;
3.5 測試程式碼
// 一對一查詢延遲載入
@Test
public void testFindOrderUserListLazyLoading() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
// 建立mapper代理物件
OrdersMapperCustom ordersMapperCustom = sqlSession
.getMapper(OrdersMapperCustom.class);
// 呼叫方法
List<Orders> list = ordersMapperCustom.findOrderUserListLazyLoading();
//這裡執行延遲載入,要發出sql
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中。