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实现Huffman编码的示例代码

    Java实现Huffman编码的示例代码

    Huffman编码是一种编码方式,本文主要介绍了Java实现Huffman编码的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • SpringBoot操作Mongodb的实现示例

    SpringBoot操作Mongodb的实现示例

    本文主要介绍了SpringBoot操作Mongodb的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • maven的5种打包方式小结

    maven的5种打包方式小结

    本文主要介绍了maven的5种打包方式小结,主要是几种插件打包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • Mybatis的动态拼接条件方式

    Mybatis的动态拼接条件方式

    这篇文章主要介绍了Mybatis的动态拼接条件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • SpringBoot Web开发之系统任务启动与路径映射和框架整合

    SpringBoot Web开发之系统任务启动与路径映射和框架整合

    这篇文章主要介绍了SpringBoot Web开发中的系统任务启动与路径映射和Servlet、Filter、Listener框架整合,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Spring基于xml文件配置Bean过程详解

    Spring基于xml文件配置Bean过程详解

    这篇文章主要介绍了spring基于xml文件配置Bean过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 完美解决java double数相加和相减的方案

    完美解决java double数相加和相减的方案

    这篇文章主要介绍了完美解决java double数相加和相减的方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 详解JAVA中implement和extends的区别

    详解JAVA中implement和extends的区别

    这篇文章主要介绍了详解JAVA中implement和extends的区别的相关资料,extends是继承接口,implement是一个类实现一个接口的关键字,需要的朋友可以参考下
    2017-08-08
  • spring boot请求异常处理并返回对应的html页面

    spring boot请求异常处理并返回对应的html页面

    这篇文章主要介绍了spring boot处理请求异常并返回对应的html页面,包括404异常处理和500异常处理,需要的朋友可以参考下
    2017-07-07
  • java虚拟机jvm方法区实例讲解

    java虚拟机jvm方法区实例讲解

    在本篇文章里小编给大家整理的是一篇关于java虚拟机jvm方法区实例讲解内容,有兴趣的朋友们可以学习下。
    2021-02-02

最新评论