zoukankan      html  css  js  c++  java
  • MyBatis延迟加载

    延迟加载

    延迟加载就是在需要某些数据的时候才去加载该数据。就上篇中的一对一、一对多查询中,如果我们只是需要员工信息用不着部门信息,这个时候就需要使用延迟查询,先查询员工的信息,后续有需要再去查询部门信息。

    延迟加载配置

    延迟加载需要在mybatis的全局配置文件中进行配置,因为延迟加载的配置设置会改变整个mybatis的运行行为,所以配置的时候根据情况具体分析。

    设置参数 描述 有效值 默认值
    lazyLoadingEnabled 延迟加载的全局开关。当开启时,多有的关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该开关状态 true/false false
    aggressiveLazyLoading 当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性都会按需加载参考lazyLoadTriggerMethods true/false false

    在全局配置文件中进行设置:

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 这里的config表示这个配置文件是mybatis的整体配置文件 -->
    <!DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    <!-- 配置数据库的参数从哪里读取 -->
    <properties resource="db.properties"/>
    <!-- 对MyBatis进行全局设置 -->
    <settings>
    	<!-- 开启延迟加载 -->
    	<setting name="lazyLoadingEnabled" value="true"/>
    	<setting name="aggerssiveLazyLoading" value="false"/>
    </settings>
    <!-- 设置数据类型别名 -->
    <typeAliases>
    	<!-- 给指定的类设置别名 -->
    	<!-- <typeAlias type="com.xj.dao.User" alias="user"/> -->
    	<!-- 指定一个基础路径 使用直接调用名称不区分大小写 -->
    	<package name="com.xj.vo"/>
    </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="com/xj/dao/IUserdao.xml"/> -->
      		<!-- package 在接口的方式下使用,接口名称必须和映射文件名称一致 -->
      		<package name="com.xj.dao"/>
      </mappers>
    </configuration>
    
    

    一对一的延迟加载

    延迟加载需要写成两个SQL语句,分开查询。
    映射配置文件代码:

    <!-- 一对一延迟加载查询 -->
    	<resultMap type="user" id="delayMap">
    		<id column="no" property="no"/>
    		<result column="name" property="name"/>
    		<result column="age" property="age"/>
    		<!-- 在这里设置延时查询 -->
    		<association property="dept" javaType="Dept" column="deptno" select="queryDept">
    			<id column="deptno" property="deptno"/>
    			<result column="deptname" property="deptname"/>
    			<result column="deptdesc" property="deptdesc"/>
    		</association>
    	</resultMap>
    	<select id="queryDept" parameterType="int" resultType="dept">
    		select * from t_dept where deptno = #{deptno}
    	</select>
    	
    	<select id="queryUser" resultMap="delayMap">
    		select * from t_user 
    	</select>
    

    测试代码及结果:
    使用延迟加载:

    List<User> list = mapper.queryUser();
    		for (User user : list) {
    			//调用了所有的参数用到了部门t_dept
    			System.err.println(user);
    		}
    

    在这里插入图片描述
    未使用延迟加载:

    List<User> list = mapper.queryUser();
    		for (User user : list) {
    			//值调用了t_user的部分参数未使用t_dept参数
    			System.err.println(user.getName()+"--"+user.getAge());
    		}
    

    在这里插入图片描述

    一对多延迟加载

    一对多延迟加载同上一对一加载,格式方法基本不变。
    映射文件配置:

    <!-- 一对多延迟加载查询 -->
    	<resultMap type="dept" id="delaydMap">
    		<id column="deptno" property="deptno"/>
    		<result column="deptname" property="deptname"/>
    		<result column="deptdesc" property="deptdesc"/>
    		<collection property="users" ofType="user" column="deptno" select="queryUserd">
    			<id column="no" property="no"/>
    			<result column="name" property="name"/>
    			<result column="age" property="age"/>
    		</collection>
     	</resultMap>
    	<select id="queryDeptd"  resultMap="delaydMap">
    		select * from t_dept
    	</select>
    	
    	<select id="queryUserd" parameterType="int" resultType="dept">
    		select * from t_user where deptno = #{deptno}
    	</select>
    

    测试代码及结果:
    使用延迟加载:

    List<Dept> deptd = mapper.queryDeptd();
    		//调用所有参数,使用延迟加载
    		for (Dept dept : deptd) {
    			System.err.println(dept);
    		}
    

    在这里插入图片描述
    未使用延迟加载:

    在这里List<Dept> deptd = mapper.queryDeptd();
    		//只使用t_dept的部分参数,不触发延迟加载
    		for (Dept dept : deptd) {
    			System.err.println(dept.getDeptno()+"---"+dept.getDeptname());
    		}插入代码片
    

    在这里插入图片描述

  • 相关阅读:
    eclipse/intellij idea 查看java源码和注释
    理解线程池,看这篇足够了-转
    乐观锁的幂等性方案
    springboot2.0以后的junit
    详解 Java 中的三种代理模式
    MYSQL慢查询配置
    MySQL 数据库性能优化之SQL优化【转】
    SQL中EXPLAIN命令详解---(转)
    spring的面试
    sql joins 7
  • 原文地址:https://www.cnblogs.com/xj619/p/11189173.html
Copyright © 2011-2022 走看看