• 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;
    	}
    
    }
    
    作为新手小菜鸟的我,只想记录,便于温故知新,如有错误或疏忽,请留言,审查后改正,谢谢各位大佬
  • 相关阅读:
    【BZOJ2287】消失之物
    【NOI2001】炮兵阵地
    【SCOI2005】互不侵犯
    【USACO2007 nov glod】玉米田
    【NOIP模拟】航班
    【NOIP模拟】闲荡
    【NOIP模拟】军队调遣
    树形地铁系统
    矩阵
    完美的集合(题解)
  • 原文地址:https://www.cnblogs.com/zhangsonglin/p/11178469.html
Copyright © 2020-2023  润新知