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顺时针打印矩阵,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • Java深入讲解AWT实现事件处理流程

    Java深入讲解AWT实现事件处理流程

    AWT的事件处理是一种委派式事件处理方式:普通组件(事件源)将整个事件处理委托给特定的对象(事件监听器);当该事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件
    2022-04-04
  • springMVC中HttpMessageConverter的具体使用

    springMVC中HttpMessageConverter的具体使用

    HttpMessageConverter,报文信息转换器,将请求报文转换为Java对象,本文主要介绍了springMVC中HttpMessageConverter的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • 基于Java的MathML转图片的方法(示例代码)

    基于Java的MathML转图片的方法(示例代码)

    最近接到一个新需求mathML转图片怎么实现呢?刚开始还真是蒙圈了,不知道怎么实现,今天小编记录一种基于Java的MathML转图片的方法,感兴趣的朋友一起看看吧
    2021-06-06
  • Springboot静态资源的访问方法介绍

    Springboot静态资源的访问方法介绍

    最近在做SpringBoot项目的时候遇到了“白页”问题,通过查资料对SpringBoot访问静态资源做了总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Spring Boot console log 格式自定义方式

    Spring Boot console log 格式自定义方式

    这篇文章主要介绍了Spring Boot console log 格式自定义方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 详解Java虚拟机(JVM)运行时

    详解Java虚拟机(JVM)运行时

    JVM(Java虚拟机)是一个抽象的计算模型。这篇文章主要介绍了Java虚拟机(JVM)运行时的相关知识,需要的朋友可以参考下
    2018-10-10
  • 微信小程序获取手机号,后端JAVA解密流程代码

    微信小程序获取手机号,后端JAVA解密流程代码

    这篇文章主要介绍了微信小程序获取手机号,后端JAVA解密流程的代码,帮助大家更好的利用Java开发,感兴趣的朋友可以了解下
    2020-09-09
  • java交换排序之奇偶排序实现方法

    java交换排序之奇偶排序实现方法

    这篇文章主要介绍了java交换排序之奇偶排序实现方法,实例分析了奇偶排序的原理与具体实现技巧,非常具有实用价值,需要的朋友可以参考下
    2015-02-02
  • MyBatis 和 jeesite多表查询示例详解

    MyBatis 和 jeesite多表查询示例详解

    这篇文章主要介绍了MyBatis 和 jeesite多表查询,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04

最新评论