延遲加載
延遲加載就是在需要某些數據的時候纔去加載該數據。就上篇中的一對一、一對多查詢中,如果我們只是需要員工信息用不着部門信息,這個時候就需要使用延遲查詢,先查詢員工的信息,後續有需要再去查詢部門信息。
延遲加載配置
延遲加載需要在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());
}插入代碼片