MyBatis延遲加載

延遲加載

延遲加載就是在需要某些數據的時候纔去加載該數據。就上篇中的一對一、一對多查詢中,如果我們只是需要員工信息用不着部門信息,這個時候就需要使用延遲查詢,先查詢員工的信息,後續有需要再去查詢部門信息。

延遲加載配置

延遲加載需要在mybatis的全局配置文件中進行配置,因爲延遲加載的配置設置會改變整個mybatis的運行行爲,所以配置的時候根據情況具體分析。

設置參數 描述 有效值 默認值
lazyLoadingEnabled 延遲加載的全局開關。當開啓時,多有的關聯對象都會延遲加載。特定關聯關係中可通過設置fetchType屬性來覆蓋該開關狀態 true/false false
aggressiveLazyLoading 當開啓時,任何方法的調用都會加載該對象的所有屬性。否則,每個屬性都會按需加載參考lazyLoadTriggerMethods true/false false

在全局配置文件中進行設置:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 這裏的config表示這個配置文件是mybatis的整體配置文件 -->
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置數據庫的參數從哪裏讀取 -->
<properties resource="db.properties"/>
<!-- 對MyBatis進行全局設置 -->
<settings>
	<!-- 開啓延遲加載 -->
	<setting name="lazyLoadingEnabled" value="true"/>
	<setting name="aggerssiveLazyLoading" value="false"/>
</settings>
<!-- 設置數據類型別名 -->
<typeAliases>
	<!-- 給指定的類設置別名 -->
	<!-- <typeAlias type="com.xj.dao.User" alias="user"/> -->
	<!-- 指定一個基礎路徑 使用直接調用名稱不區分大小寫 -->
	<package name="com.xj.vo"/>
</typeAliases>
	<!-- 數據庫連接環境配置 -->
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <!-- 連接映射配置 -->
  <mappers>
  		<!-- 連接映射必須保證與調用接口名稱一致 -->
  		<!-- <mapper resource="com/xj/dao/IUserdao.xml"/> -->
  		<!-- package 在接口的方式下使用,接口名稱必須和映射文件名稱一致 -->
  		<package name="com.xj.dao"/>
  </mappers>
</configuration>

一對一的延遲加載

延遲加載需要寫成兩個SQL語句,分開查詢。
映射配置文件代碼:

<!-- 一對一延遲加載查詢 -->
	<resultMap type="user" id="delayMap">
		<id column="no" property="no"/>
		<result column="name" property="name"/>
		<result column="age" property="age"/>
		<!-- 在這裏設置延時查詢 -->
		<association property="dept" javaType="Dept" column="deptno" select="queryDept">
			<id column="deptno" property="deptno"/>
			<result column="deptname" property="deptname"/>
			<result column="deptdesc" property="deptdesc"/>
		</association>
	</resultMap>
	<select id="queryDept" parameterType="int" resultType="dept">
		select * from t_dept where deptno = #{deptno}
	</select>
	
	<select id="queryUser" resultMap="delayMap">
		select * from t_user 
	</select>

測試代碼及結果:
使用延遲加載:

List<User> list = mapper.queryUser();
		for (User user : list) {
			//調用了所有的參數用到了部門t_dept
			System.err.println(user);
		}

在這裏插入圖片描述
未使用延遲加載:

List<User> list = mapper.queryUser();
		for (User user : list) {
			//值調用了t_user的部分參數未使用t_dept參數
			System.err.println(user.getName()+"--"+user.getAge());
		}

在這裏插入圖片描述

一對多延遲加載

一對多延遲加載同上一對一加載,格式方法基本不變。
映射文件配置:

<!-- 一對多延遲加載查詢 -->
	<resultMap type="dept" id="delaydMap">
		<id column="deptno" property="deptno"/>
		<result column="deptname" property="deptname"/>
		<result column="deptdesc" property="deptdesc"/>
		<collection property="users" ofType="user" column="deptno" select="queryUserd">
			<id column="no" property="no"/>
			<result column="name" property="name"/>
			<result column="age" property="age"/>
		</collection>
 	</resultMap>
	<select id="queryDeptd"  resultMap="delaydMap">
		select * from t_dept
	</select>
	
	<select id="queryUserd" parameterType="int" resultType="dept">
		select * from t_user where deptno = #{deptno}
	</select>

測試代碼及結果:
使用延遲加載:

List<Dept> deptd = mapper.queryDeptd();
		//調用所有參數,使用延遲加載
		for (Dept dept : deptd) {
			System.err.println(dept);
		}

在這裏插入圖片描述
未使用延遲加載:

在這裏List<Dept> deptd = mapper.queryDeptd();
		//只使用t_dept的部分參數,不觸發延遲加載
		for (Dept dept : deptd) {
			System.err.println(dept.getDeptno()+"---"+dept.getDeptname());
		}插入代碼片

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章