MyBatis深入解读懒加载的实现

 更新时间:2022年04月27日 11:04:59   作者:羡羡ˇ  
顾名思义,懒加载就是因为偷懒了,懒得加载了,只有使用的时候才进行加载。其实,懒加载也加延迟加载,主要以应用与Mybatis的关联查询,按照设置的延迟规则,推迟对延迟对关联对象的select查询

懒加载 ,也称为嵌套查询

       需要查询关联信息时,使用 Mybatis 懒加载特性可有效的减少数据库压力, 首次查询只查询主表信息,关联表的信息在用户获取时再加载。        

       Mybatis 一对一关联的 association 和一对多的 collection 可以实现懒加载。懒加载时要 使用resultMap,不能使用 resultType 。

这里我们以员工表和部门表为例 

通过deptId 与 部门表 id 关联

 我们这里首先需要开启一个设置

<settings>
    <!--指定哪些方法去触发延迟加载,hashCode,equals,clone,toString-->
    <setting name="lazyLoadTriggerMethods" value=""/>
</settings>

懒加载功能是默认开启的, 但这里我们也需要设置这个属性, 不设置则不会触发延迟加载功能

Employee selectOneEmployee(int id);

我们以查询单个员工为例 , resultMap 与sql 如下

<!--定义resultMap-->
<resultMap id="employeeMap1" type="Employee">
   <id column="id" property="id"/>
   <result property="name" column="name"/>
   <result property="age" column="age"/>
   <!--fetchType为查询的类型,这里选择lazy  select为嵌套查询-->
   <association property="dept" javaType="Dept" fetchType="lazy"
         select="selectDept" column="deptId">
   <result column="name" property="name"/>
   </association>
</resultMap>
<select id="selectOneEmployee" resultMap="employeeMap1">
   select id,name,age,deptId from employee where id=#{id}
</select>
<!--通过上一级sql提供的deptId查询-->
<select id="selectDept" resultType="Dept">
   select name from dept where id=#{deptId}
</select>

此处一对一 ,我们使用<association>

java测试 : 

public static void main(String[] args) {
   SqlSession sqlSession= MybatisUtil.getSqlSession();
   EmployeeDao mapper=sqlSession.getMapper(EmployeeDao.class);
   Employee employee = mapper.selectOneEmployee(3);
   System.out.println(employee);
   System.out.println(employee.getDept());
   sqlSession.commit();  //提交事务
   sqlSession.close();   //关闭

查询结果 :

通过结果可以看到 , 当我们第一次输出这个 employee 对象时, 部门是没有被查询的 , 而当我们需要使用到部门的信息时, 才会去触发这个查询 

查询部门 resultMap 与 sql如下: 

<resultMap id="deptMap1" type="Dept">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <!--collection为一对多 , 这里一个部门包含多个员工-->
    <collection property="list" javaType="List" ofType="Employee"
          select="selectEmployee" fetchType="lazy" column="id">
    <result property="name" column="name"/>
    </collection>
</resultMap>
<select id="selectOneDept" resultMap="deptMap1">
    SELECT id,name FROM dept where id=#{id}
</select>
<select id="selectEmployee" resultType="Employee">
    select name from employee where deptId=#{id}
</select>

一对多,我们使用<collection>

懒加载就介绍到这里,感谢阅读

到此这篇关于MyBatis深入解读懒加载的实现的文章就介绍到这了,更多相关MyBatis懒加载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java之Spring Boot创建和使用

    Java之Spring Boot创建和使用

    Spring 的诞生就是为了简化 Java 程序的开发的.Spring Boot 的诞生就是为了简化 Spring 程序开发的,对Springboot感兴趣的同学可以借鉴本文
    2023-04-04
  • Jenkins初级使用过程中的异常处理

    Jenkins初级使用过程中的异常处理

    这篇文章主要为大家介绍了Jenkins初级使用过程中的异常处理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • SpringCloud URL重定向及转发代码实例

    SpringCloud URL重定向及转发代码实例

    这篇文章主要介绍了SpringCloud URL重定向及转发代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • springboot详解实现车险理赔信息管理系统代码

    springboot详解实现车险理赔信息管理系统代码

    本系统基于Springboot开发实现了一个为用户车险进行理赔信息管理的一个信息化管理系统,核心的业务主要是用户申请保险理赔,管理员审核进入理赔程序,事故调查员对事故进行调查和现场勘察,这其中共涉及到三类用户,购买保险的客户,事故调查员和系统管理员
    2022-06-06
  • springboot的controller层的常用注解说明

    springboot的controller层的常用注解说明

    这篇文章主要介绍了springboot的controller层的常用注解说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • java notify和notifyAll的对比

    java notify和notifyAll的对比

    这篇文章主要介绍了 java notify和notifyAll的对比的相关资料,需要的朋友可以参考下
    2017-02-02
  • java实现对服务器的自动巡检邮件通知

    java实现对服务器的自动巡检邮件通知

    这篇文章主要为大家详细介绍了java实现对服务器的自动巡检邮件通知,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • java学习粗略路线的方法

    java学习粗略路线的方法

    下面小编就为大家带来一篇java学习粗略路线的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • java实现图像转码为字符画的方法

    java实现图像转码为字符画的方法

    这篇文章主要为大家详细介绍了java实现图像转码为字符画的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Java包含抽象方法的枚举类示例

    Java包含抽象方法的枚举类示例

    这篇文章主要介绍了Java包含抽象方法的枚举类,结合实例形式分析了Java包含抽象方法的枚举类实现方法与相关操作技巧,需要的朋友可以参考下
    2019-08-08

最新评论