延遲查詢是一對一和一對多查詢的延續。
在默認的一對一和一對多中,一條SQL就能夠查詢到所有數據,但是,有的數據有時候一時半會用不上,例如查詢員工,捎帶獲取員工的部門數據,但是部門數據使用的頻率很低,這種時候可以使用延遲查詢,首先獲取到所有的員工數據,然后在需要的時候再去獲取部門數據。當需要使用數據的時候才去加載既是延遲加載
開啟延遲配置
Settings配置
全局配置文件中配置
Mybatis-cfg.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 導入外部資源 -->
<properties resource="db.properties"/>
<!-- 開啟延遲加載 -->
<settings>
<setting name="lazyLoadingEnabled" value="true" />
<setting name="aggressiveLazyLoading" value="false" />
</settings>
<!-- 自定義別名 -->
<typeAliases>
<typeAlias type="com.zsl.pojo.Emp" alias="emp"/>
<typeAlias type="com.zsl.pojo.Dept" alias="dept"/>
</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="EmpMapper.xml"/>
<mapper resource="DeptMapper.xml"/>
<!-- <package name="包名"/> -->
</mappers>
</configuration>
映射文件
與Mybatis關聯關系的配置相似
EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zsl.dao.EmpMapper">
<resultMap type="emp" id="baseMap">
<id column="empno" property="empno" />
<result column="ename" property="ename" />
<result column="job" property="job" />
<association property="dept" javaType="dept"
column="deptno" select="queryDeptById">
<id column="deptno" property="deptno" />
<result column="dname" property="dname" />
<result column="loc" property="loc" />
</association>
</resultMap>
<!-- 需要延遲加載的數據 -->
<select id="queryDeptById" parameterType="int"
resultType="dept">
select * from dept where deptno = #{deptno}
</select>
<!-- 查詢主表數據 -->
<select id="queryE" resultMap="baseMap">
select * from emp
</select>
</mapper>
DeptMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zsl.dao.DeptMapper">
<resultMap type="dept" id="baseMap">
<id column="deptno" property="deptno" />
<result column="dname" property="dname" />
<result column="loc" property="loc" />
<!-- ofType List中泛型的類型 property為變量的名稱 -->
<collection property="emps" ofType="emp"
column="deptno" select="queryEmpByDid">
<id column="empno" property="empno" />
<result column="ename" property="ename" />
<result column="job" property="job" />
</collection>
</resultMap>
<select id="queryEmpByDid" resultType="emp" parameterType="int">
select * from emp where deptno=#{deptno}
</select>
<select id="queryD" resultMap="baseMap">
select * from dept
</select>
</mapper>
接口
DeptMapper
public interface DeptMapper {
public List<Dept> queryD();
}
EmpMapper
public interface EmpMapper {
public List<Emp> queryE();
}
分析:
在DeptMapper.xml映射文件中:
在EmpMapper.xml映射文件中:
DBUtils
package com.zsl.utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class DbUtils {
public static SqlSession getSession() throws IOException {
// TODO Auto-generated method stub
// 1.通過Resources對象加載配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-cfg.xml");
// 2.獲取SqlSessionFactory對象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
// 3.通過SqlSessionFactory對象獲取SQLSession對象
SqlSession session = factory.openSession();
return session;
}
public static void commit(SqlSession session) {
// TODO Auto-generated method stub
session.commit();
}
public static void close(SqlSession session) {
// TODO Auto-generated method stub
session.close();
}
}
測試類Test
package com.zsl.test;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.zsl.dao.DeptMapper;
import com.zsl.dao.EmpMapper;
import com.zsl.pojo.Dept;
import com.zsl.pojo.Emp;
import com.zsl.utils.DbUtils;
public class Test {
public static void main(String[] args) throws IOException {
Test test = new Test();
System.out.println(test.queryD());
}
public List<Emp> queryE() throws IOException {
// TODO Auto-generated method stub
SqlSession session = DbUtils.getSession();
EmpMapper mapper = session.getMapper(EmpMapper.class);
List<Emp> list = mapper.queryE();
session.close();
return list;
}
public List<Dept> queryD() throws IOException {
// TODO Auto-generated method stub
SqlSession session = DbUtils.getSession();
DeptMapper mapper = session.getMapper(DeptMapper.class);
List<Dept> list = mapper.queryD();
session.close();
return list;
}
}