Mybatis__延迟加载

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

}
作为新手小菜鸟的我,只想记录,便于温故知新,如有错误或疏忽,请留言,审查后改正,谢谢各位大佬
原文地址:https://www.cnblogs.com/zhangsonglin/p/11178469.html