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;
	}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM