Mybatis中的延迟加载,以及原理分析

 更新时间:2024年04月17日 11:20:38   作者:程序员JavaWind  
这篇文章主要介绍了Mybatis中的延迟加载以及原理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Mybatis延迟加载原理

Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是一对一,collection 指的就是一对多查询。

在 Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。

它的原理是:使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB()是null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()方法的调用。这就是延迟加载的基本原理。

当然了,不光是 Mybatis,几乎所有的包括 Hibernate,支持延迟加载的原理都是一样的。

MyBatis延迟加载(以及可能会碰到的一些问题)

刚好学了延迟加载就来做个记录

延迟加载(懒加载) 首先需要配置Mybaits-config文件 

<!-- 延迟加载设置-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>

1.单端关联查询t添加select  需要在RoleDao中添加findRoleById方法,可无参数

Role findRoleById(int roleId); //RoleDao中添加
<!--    延迟加载(懒加载)-->
<resultMap id="lazyMap" type="com.demo.entity.User">
    <id column="id" property="id"/>
    <result column="username" property="username"/>
    <result column="password" property="password"/>
    <association property="role" column="role_id" select="com.demo.dao.RoleDao.findRoleById"> 需要在RoleDao里面添加findRoleById方法
    </association>
</resultMap>

<select id="findList" resultMap="lazyMap" >
    select id,
           username,
           password,
           role_id 对应association.column 
    from tb_users
</select>

对应的resultMap配置

<resultMap id="roleMap2" type="com.demo.entity.Role">
    <id column="id" property="id"/>
    <result column="role_name" property="roleName"/>
    <result column="role_state" property="roleState"/>
</resultMap>

<select id="findRoleById" resultMap="roleMap2">
    select id, role_name, role_state
    from tb_role
    where id = #{role_id}
</select>

测试 正常 输出关联对象会出现多条SQL

List<User> list = mapper.findList();
for (User user : list) {
    System.out.println(user.getId() + ", " + user.getUsername() + ", " + user.getPassword() );
    System.out.println(user.getRole().getId() + ", "+ user.getRole().getRoleName());
}

心得

使用MyBatis3.4.6版本会出现 lazy proxy.这是MyBatis版本问题,之后我把他换成3.5.1之后可以正常运行。

如:出现一些其他异常对应的column值写错了,要一一对应 初学者设置column和property最好使用复制粘贴的方式以免出现其他错误

优点:使用延迟加载能够在不需要关联数据的时候,仅执行一条sql 提高执行速度(我的理解,如有不对请多指点)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java基础详解之数据类型知识点总结

    java基础详解之数据类型知识点总结

    这篇文章主要介绍了java基础详解之数据类型知识点总结,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有很大的帮助,需要的朋友可以参考下
    2021-04-04
  • SpringBoot启动后启动内嵌浏览器的方法

    SpringBoot启动后启动内嵌浏览器的方法

    这篇文章主要介绍了SpringBoot启动后启动内嵌浏览器的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Docker使用Dockerfile自定义镜像方式

    Docker使用Dockerfile自定义镜像方式

    这篇文章主要介绍了Docker使用Dockerfile自定义镜像方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • SpringCloud zuul 网关如何解决跨域问题

    SpringCloud zuul 网关如何解决跨域问题

    这篇文章主要介绍了SpringCloud zuul网关解决跨域问题的具体实现方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java Swing编写一个简单的计算器软件

    Java Swing编写一个简单的计算器软件

    大家好,本篇文章主要讲的是Java Swing编写一个简单的计算器软件,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 教你怎么用SpringBoot整合Swagger作为API

    教你怎么用SpringBoot整合Swagger作为API

    这篇文章主要介绍了教你怎么用SpringBoot整合Swagger作为API,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • 浅谈Java解释器模式

    浅谈Java解释器模式

    这篇文章主要介绍了Java基于解释器模式实现定义一种简单的语言功能,简单描述了解释器模式的概念、功能及Java使用解释器模式定义一种简单语言的相关实现与使用技巧,需要的朋友可以参考下
    2021-10-10
  • Spring事件监听机制使用和原理解析

    Spring事件监听机制使用和原理解析

    Spring的监听机制基于观察者模式,就是就是我们所说的发布订阅模式,这种模式可以在一定程度上实现代码的解耦,本文将从原理上解析Spring事件监听机制,需要的朋友可以参考下
    2023-06-06
  • Spring的@Conditional详解

    Spring的@Conditional详解

    这篇文章主要介绍了Spring的@Conditional详解,给想要注入Bean增加限制条件,只有满足限制条件才会被构造并注入到Spring的IOC容器中,通常和@Bean注解一起使用,需要的朋友可以参考下
    2024-01-01
  • 计算机二级考试java软件操作教程 教大家如何学习java

    计算机二级考试java软件操作教程 教大家如何学习java

    如何成为一名知识丰富的Java程序员,顺利通过计算机二级Java考试,这篇文章主要主要教大家如何学习java,java的学习路线是什么,从何学起,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08

最新评论