延迟查询是一对一和一对多查询的延续。
在默认的一对一和一对多中,一条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;
}
}