MyBatis(15)MyBatis 的延迟加载是如何实现

MyBatis 的延迟加载(懒加载)特性允许在需要使用关联对象数据时才进行加载,而不是在执行主查询时就加载所有相关数据。这种机制可以提高应用程序的性能,特别是当关联数据庞大或关联层次较深时。我们将通过以下几个方面来深入了解MyBatis的延迟加载实现机制。

配置延迟加载

要在MyBatis中启用延迟加载,需要在配置文件mybatis-config.xml中进行相关设置:

<settings><!-- 开启全局的延迟加载 --><setting name="lazyLoadingEnabled" value="true"/><!-- 将积极加载改为消极加载(即延迟加载) --><setting name="aggressiveLazyLoading" value="false"/><!-- 当开启延迟加载时,每个属性都会延迟加载 --><setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
  • lazyLoadingEnabled 控制是否启用延迟加载。
  • aggressiveLazyLoading 控制是否对所有关联对象进行加载,设置为 false 可以避免加载不必要的关联对象。
  • lazyLoadTriggerMethods 指定哪些方法触发加载属性,通常保持默认即可。

实现原理

MyBatis 的延迟加载主要依赖于代理对象。当配置了延迟加载后,MyBatis 会为需要延迟加载的属性生成一个代理对象,当访问这个属性时,代理对象负责执行实际的加载操作。

步骤概述
  1. 结果映射: 在结果映射时,对于配置了延迟加载的关联属性,MyBatis 不会立即执行关联查询,而是为该属性创建一个代理对象。
  2. 代理触发: 当访问这个属性的方法时,比如get方法,代理对象会触发实际的关联查询。
  3. 查询加载: 代理对象执行关联查询,并将查询结果设置到目标对象的属性中,替换掉自身。
代码演示

以一对多关系为例,配置延迟加载:

<resultMap id="blogResultMap" type="Blog"><collection property="posts" ofType="Post" select="selectPostsForBlog" column="id" fetchType="lazy"/>
</resultMap><select id="selectBlog" resultMap="blogResultMap">SELECT * FROM blog WHERE id = #{id}
</select><select id="selectPostsForBlog" parameterType="int" resultType="Post">SELECT * FROM post WHERE blog_id = #{id}
</select>

这里,<collection> 中的 fetchType="lazy" 指示MyBatis为 posts 属性创建代理对象,以实现延迟加载。

源码解析

在MyBatis中,延迟加载的实现涉及到以下几个关键类:

  • SqlSessionManager: 作为SQL会话的管理器,它负责创建SqlSession
  • Configuration: 包含了MyBatis的所有配置信息,包括延迟加载的设置。
  • Executor: 执行器,负责执行SQL命令,延迟加载的触发最终会调用执行器来执行关联查询。
  • ProxyFactory: 代理工厂,用于创建延迟加载的代理对象。

延迟加载的代理对象主要通过Java的动态代理实现。在访问代理对象的方法时,动态代理会拦截这个调用,并判断是否需要触发延迟加载。如果需要,则执行实际的查询并加载数据,然后将结果设置到目标对象中。

以下是一个简化的示例来说明代理对象如何拦截方法调用并触发加载:

public class LazyLoadingProxy implements InvocationHandler {private Object target;private boolean loaded;public LazyLoadingProxy(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (!loaded && isLoadMethod(method)) {loadObject();loaded = true;}return method.invoke(target, args);}private boolean isLoadMethod(Method method) {// 判断方法是否触发加载return "getPosts".equals(method.getName());}private void loadObject() {// 执行加载逻辑,比如执行SQL查询}
}

在上面的代码中,LazyLoadingProxy 是一个动态代理类,它在方法调用时判断是否需要加载数据,并在必要时进行加载。这个简化的例子演示了延迟加载的基本思想。

总结

MyBatis的延迟加载特性通过动态代理和配置控制,实现了按需加载关联数据的能力。通过延迟加载,可以优化应用程序的性能,特别是在处理复杂关系和大量数据时。虽然延迟加载增加了实现的复杂度,但MyBatis通过提供灵活的配置和强大的映射机制,使得管理这种复杂度成为可能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/38439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第13天|MindNLP ChatGLM-6B StreamChat

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) MindNLP ChatGLM-6B StreamChat 本案例基于MindNLP和ChatGLM-6B实现一个聊天应用。 1 环境配置 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspo…

[知识点篇]《计算机组成原理》之数据信息的表示

1、数据表示的作用 &#xff08;1&#xff09;定义&#xff1a;将数据按照某种方式组织&#xff0c;以便机器硬件能直接识别和使用。现代计算机采用二进制进行数据表示。 &#xff08;2&#xff09;数据表示考虑因素&#xff1a; 数据的类型&#xff1a; 数值/非数值、小数、…

读AI新生:破解人机共存密码笔记17不确定性和概率

1. 前向搜索 1.1. 通过前向搜索&#xff0c;通过考虑各种可能的动作序列的结果&#xff0c;来选择动作&#xff0c;是智能系统的基本能力 1.2. 如果一家卡车运输公司想要优化其100辆卡车在美国的运输&#xff0c;那么该公司可能需要考虑的状态数量将是10^700个 1.3. 几乎所有…

Linux之masscan工具安装和使用

一、masscan简介 Masscan是一款快速、高效且开源的端口扫描工具,被广泛用于网络安全领域。它的设计目标是实现极高的扫描速度,使其能够在极短的时间内扫描整个互联网的IPv4地址空间。以下是masscan的主要特性和功能: 极高的扫描速度:Masscan的设计目标是快速和灵活,它能够…

网络爬虫的特点

网络爬虫的特点 网络爬虫的特点在于其高度的自动化、灵活性和可扩展性。这些特点使得网络爬虫在互联网信息的获取、处理和分析中发挥着举足轻重的作用。 首先&#xff0c;网络爬虫的高度自动化是其最为显著的特点之一。一旦设置好爬取的目标和规则&#xff0c;爬虫便可以自动…

vue3记个坑关于router的特点

我的问题有一下几点 1. router-view 在使用name进行命名 这个命名&#xff0c;我再三确定没有命名错误的情况下。我的组件死活出不来。仔细排查了之后&#xff0c;也反复看了官方文档。终于发现 <router-view name"login"></router-view>这个是路由上的…

数据赋能(134)——开发:数据转换——技术方法、主要工具

数据类型转换&#xff1a; 数据类型转换包括自动类型转换、强制类型转换和包装类转换。自动类型转换发生在两种类型兼容且目标类型大于源类型时&#xff0c;如将整数转换为浮点数。强制类型转换则需要将范围大的数据类型转换为范围小的数据类型&#xff0c;如将浮点数转换为整数…

el-form表单中的el-upload的文件表单验证

el-form表单中的el-upload的文件表单验证 常规el-form中的表单验证&#xff1a; el-form的el-form-item中&#xff1a; <el-form :model"ruleForm" :rules"rules" ref"ruleForm" label-width"100px" class"demo-ruleForm"…

uni-app的来龙去脉,技术要点及技术难点,语法结构及应用场景,其实前端也很难,顶级的前端比后端都重要,感觉第一,理性第二

Uni-App 的来龙去脉 Uni-App 是由 DCloud 推出的一款跨平台前端框架&#xff0c;用于开发一次性代码并可以同时在 iOS、Android、H5、微信小程序、支付宝小程序、百度小程序、字节跳动小程序和 QQ 小程序等多个平台上运行的应用。Uni-App 的出现应对了移动互联网时代多平台应用…

解决Install/Remove of the Service Denied报错

1、问题概述&#xff1f; 在Windows系统中安装MySQL5.7.43的时候&#xff0c;运行mysqld install命令提示报错&#xff1a;Install/Remove of the Service Denied 意思是&#xff1a;安装/删除服务被拒绝 问题原因所在&#xff1a;就是你当前的权限不够&#xff0c;以管理员…

Linux【环境 CenOS7】部分软件安装链接整理

优质博文&#xff1a;IT-BLOG-CN 一、开启网络 【问题】&#xff1a; 刚安装完CentOS&#xff0c;当ping www.baidu.com时&#xff0c;ping不通&#xff1b; 【解决】&#xff1a; 进入cd /etc/sysconfig/network-scripts/我这里修改的是ifcfg-ens33文件&#xff0c;将ONBOOT…

p2p、分布式,区块链笔记:试用ZeroTier组网

ZeroTier 是一种用于创建和管理虚拟局域网&#xff08;Virtual Local Area Network&#xff0c;VLAN&#xff09;的软件定义网络&#xff08;SDN&#xff09;解决方案。它可以通过互联网将多个设备安全地连接在一起&#xff0c;就像它们在同一个本地网络上一样。主要开发语言为…

hadoop 3.X 分布式HA集成Kerbos(保姆级教程)

前提&#xff1a;先安装Kerbos 1、创建keytab目录 在每台机器上上提前创建好对应的kertab目录 [hadooptv3-hadoop-01 ~]$ sudo mkdir -p /BigData/run/hadoop/keytab/ [hadooptv3-hadoop-01 ~]$ sudo mkdir -p /opt/security/ [hadooptv3-hadoop-01 ~]$ sudo chown hadoop:had…

【Python从入门到进阶】59、Pandas库中Series对象的操作(二)

接上篇《58、Pandas库中Series对象的操作(一)》 上一篇我们讲解了Pandas库中Series对象的基本概念、对象创建和操作&#xff0c;本篇我们来继续学习Series对象的运算、函数应用、时间序列操作&#xff0c;以及Series的案例实践。 一、Series对象的运算 1. 数值型数据的算术运…

1、音视频解封装流程---解复用

对于一个视频文件(mp4格式/flv格式)&#xff0c;audio_pkt或者video_pkt是其最基本的数据单元&#xff0c;即视频文件是由独立的视频编码包或者音频编码包组成的。 解复用就是从视频文件中把视频包/音频包单独读取出来保存成独立文件&#xff0c;那么如何得知packet是视频包还是…

指针赋值与引用传递:C语言的基础知识与实践技巧

指针赋值与引用传递&#xff1a;C语言的基础知识与实践技巧 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; **1. **引言 在C语言中&#xff0c;指针是一种强…

Vue CLI VS Vite

Vue CLI与Vite区别&#xff1a; Vue CLI与Vite之间存在明显的区别&#xff0c;这些区别主要体现在实现原理、优化策略、开发环境速度、构建速度、依赖关系分析和插件系统等方面。以下是关于Vue CLI和Vite区别的详细分析&#xff1a; 实现原理&#xff1a; Vue CLI&#xff1a…

【Spring Boot】Spring Boot简介

1、概述 Spring Boot是一个用于创建独立、生产级别的基于Spring的应用程序的开发框架。旨在简化Spring应用的初始搭建和开发过程。它通过自动配置和大量默认配置&#xff0c;使得开发者能够快速搭建一个独立的Spring应用&#xff0c;无需进行大量的手动配置。 2、主要特点 快…

【一篇搞懂】操作系统期末大题:进程同步与互斥 PV操作

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;☀️☀️☀️题型一&#xff1a;利用信号量实现前驱关系题型二&#xff1a;利用信号量实现资源同步与互斥 一、前言&#x1f680;&#x1f680;&#x1f680; 本文简介&#xff1a;这是一篇基于b…

无人机远程控制:北斗短报文技术详解

无人机&#xff08;UAV&#xff09;技术的快速发展和应用&#xff0c;使得远程控制成为了一项关键技术。无人机远程控制涉及无线通信、数据处理等多个方面&#xff0c;其中北斗短报文技术以其独特的优势&#xff0c;在无人机远程控制领域发挥着重要作用。本文将详细解析无人机远…