本篇文章主要介紹了mybatis教程之延遲載入詳解。詳細介紹了延遲載入的意義和用法實現,有興趣的可以了解一下
延遲載入
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中。
【相關推薦】
1. 特別推薦:「php程式設計師工具箱」V0.1版本下載
2. Java免費影片教學
3. 全面解析Java註解
以上是介紹mybatis延遲載入的解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!