Mybatis入門筆記(五)
MyBatis的入門筆記(五)
- 2018年11月16日
MyBatis的懶載入(延遲載入):
以前多表關聯查詢時,每次都會講所有資料查一遍,如果緊緊只是需要整個資料中的一張表的資料中的一個欄位的資訊呢,那該怎麼辦,這時候就需要懶載入。
1. 需求:查詢教室相關資訊,有時候僅僅只是需要關聯的學生的姓名。
就如這種,我們一次查詢了所有的資料,需要什麼資訊的時候直接從查詢的結果中篩選。但是教室關聯的學生很多,這種關聯查詢就比較耗時耗資源。
2. 什麼是懶載入:
通俗的講就是按需載入,我們需要什麼的時候再去進行什麼操作。而且先從單表查詢,需要時再從關聯表去關聯查詢,能大大提高資料庫效能,因為查詢單表要比關聯查詢多張錶速度要快。
在MyBatis的中,結果對映可以實現高階對映(使用關聯,集合實現一對一及一對多對映),關聯,集合具備延遲載入功能。
3. 啟用懶載入:
<! - 要使延遲載入生效必須配置下面兩個屬性- >
<! - 全域性性設定懶載入。如果設為'false',則所有相關聯的都會被初始化載入- >
< 設定名稱=“lazyLoadingEnabled” value =“true” />
<! - 當設定為真的時候,懶載入的物件可能被任何懶屬性全部載入。否則,每個屬性都按需載入- >
< setting name = “aggressiveLazyLoading”
<! - 指定日誌記錄- >
< setting name =“logImpl” value =“LOG4J” />
<!-- 要使延遲載入生效必須配置下面兩個屬性 --> <!--全域性性設定懶載入。如果設為'false',則所有相關聯的都會被初始化載入--> <setting name="lazyLoadingEnabled" value="true"/> <!--當設定為true的時候,懶載入的物件可能被任何懶屬性全部載入。否則,每個屬性都按需載入--> <setting name="aggressiveLazyLoading" value="false"/> <!--指定日誌記錄--> <setting name="logImpl" value="LOG4J" />
首先需要每個表對映實體類:
在建立介面載入mapper.xml檔案,這都是基本操作。
這裡將以前的關聯查詢的所有SQL刪掉,直接查詢所有的資訊。
Studentmapper.xml:
通過teacherid查詢所有學生的資訊,返回列表<>集合
Wife.xml:也是同樣的操作。
在TeacherMapper.xml:
<!--實現懶載入-->
<!--使用resultMap對映實體類和欄位之間的一一對應的關係-->
<resultMap id="teacherMap" type="Teacher" autoMapping="true">
<!--一對一的關聯查詢-->
<association property="wife" select="org.robert.mapper.WifeMapper.getByTeacherid" column="id" fetchType="lazy"></association>
<!--一對多的關聯查詢-->
<collection property="stu" select="org.robert.mapper.StudentMapper.getByTeacherid" column="id" fetchType="lazy">
</collection>
</resultMap>
中實現懶載入查詢每個對映類的方法。
測試:
測試:查詢老師關聯的學生資訊的姓名
Log4j的:列印的日誌:
先用ID去查詢老師的資訊,然後用老師的ID資訊去查詢學生。
這樣就沒有查詢妻子的資訊。