1、什么是延遲加載
- 延遲加載的條件:resultMap可以實現高級映射(使用association、collection實現一對一及一對多映射),association、collection具備延遲加載功能。
- 延遲加載的好處:
先從單表查詢、需要時再從關聯表去關聯查詢,大大提高 數據庫性能,因為查詢單表要比關聯查詢多張表速度要快。 - 延遲加載的實例:
如果查詢訂單並且關聯查詢用戶信息。如果先查詢訂單信息即可滿足要求,當我們需要查詢用戶信息時再查詢用戶信息。把對用戶信息的按需去查詢就是延遲加載。
2、如何開啟延遲加載功能
-
Mybatis的延遲加載功能默認是關閉的
-
需要在SqlMapConfig.xml文件中通過setting標簽配置來開啟延遲加載功能
-
開啟延遲加載的屬性:
lazyLoadingEnabled:全局性設置懶加載。如果設為‘false’,則所有相關聯的都會被初始化加載。默認為false
aggressiveLazyLoading:當設置為‘true’的時候,懶加載的對象可能被任何懶屬性全部加載。否則,每個屬性都按需加載。默認為true -
配置
<settings> <!--開啟延遲加載--> <setting name="lazyLoadingEnabled" value="true"/> <!--關閉積極加載--> <setting name="aggressiveLazyLoading" value="false"/> </settings>
3、延遲加載的resultMap
-
在resultMap中使用association或者collection,即可使用延遲加載。
-
延遲加載需要兩個statement語句來完成
-
在resultMap中使用association或者collection來配置兩個statement直接的管理
-
resultMap代碼 :
<!--查詢訂單和創建訂單的用戶,使用延遲加載--> <resultMap id="OrderAndUserLazyLoad" type="Orders"> <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 colunm:關聯兩張表的那個列的列名 --> <association property="user" javaType="User" select="findUser" column="user_id"> </association> </resultMap>
4、延遲加載的mapper文件
-
必須要有兩個statement
-
兩個statement直接必須存在關聯的數據列
<select id="findOrdersByLazyLoad" resultMap="OrderAndUserLazyLoad"> SELECT * FROM orders </select> <select id="findUser" parameterType="int" resultType="User"> SELECT * FROM User WHERE id = #{value} </select>
5、mapper接口
public List<Orders> findOrdersByLazyLoad() throws Exception;
6、測試代碼
public void testFindOrdersByLazyLoad() throws Exception{
SqlSession session = sessionFactory.openSession();
Mapper mapper = session.getMapper(Mapper.class);
//只會發送查詢訂單信息的SQL
List<Orders> orders = mapper.findOrdersByLazyLoad();
for (Orders order : orders){
//會發生查詢用戶信息的SQL
order.getUser();
}
}
7、總結
-
不使用mybatis提供的association及collection中的延遲加載功能,如何實現延遲加載??
實現方法如下:
定義兩個mapper方法:
1、查詢訂單列表
2、根據用戶id查詢用戶信息
實現思路:
先去查詢第一個mapper方法,獲取訂單信息列表
在程序中(service),按需去調用第二個mapper方法去查詢用戶信息。 -
總之:
使用延遲加載方法,先去查詢簡單的sql(最好單表,也可以關聯查詢),再去按需要加載關聯查詢的其它信息。