Mybatis 支持延迟加载的详细内容
-
延迟加载的概念深入
- 延迟加载是一种在处理复杂对象关系时非常有用的策略。在企业级应用开发中,数据库中的表之间往往存在着各种关联关系,如一对多(一个用户有多个订单)、多对多(一个学生可以选多门课程,一门课程可以被多个学生选)等。在传统的查询方式中,如果查询主对象(如用户),同时把与之关联的所有对象(如用户的所有订单)都查询出来,可能会导致大量不必要的数据传输和内存占用。特别是当关联对象的数据量较大或者查询频率较低时,这种提前加载所有关联数据的方式会浪费系统资源。
- 例如,在一个内容管理系统中,一篇文章(Article)可能有多个评论(Comment)。当用户只是想查看文章的标题、作者和摘要等基本信息时,并不需要马上加载所有评论。延迟加载就可以在这种情况下发挥作用,只有当用户真正点击查看评论按钮或者在业务逻辑中需要处理评论数据时,才去数据库中查询评论信息。
Mybatis 中延迟加载的配置细节
- 全局配置参数含义:
lazyLoadingEnabled:这个参数是 Mybatis 延迟加载的核心开关。当设置为true时,开启延迟加载功能,告诉 Mybatis 对于关联对象的加载要采用延迟的方式。从 Mybatis 的内部实现角度来看,这会改变其对关联对象处理的逻辑流程。当设置为false时,Mybatis 会采用立即加载的方式,即查询主对象时,同时把所有关联对象的数据都查询出来,就像没有启用延迟加载功能一样。aggressiveLazyLoading:这个参数控制着延迟加载的激进程度。当设置为true时,虽然lazyLoadingEnabled可能已经开启了延迟加载,但在实际操作中,只要加载主对象,就会把所有关联对象的代理对象都加载进来。这意味着即使没有实际访问关联对象的数据,它们的代理对象也会被创建并加载到内存中。这种方式可能会导致一些不必要的代理对象创建和资源占用。当设置为false时,Mybatis 会严格按照延迟加载的原则,只有在真正访问关联对象的方法时,才会触发关联对象的加载。
- 映射文件中的配置细节:
- 在
Mapper.xml文件中,对于关联关系的映射部分,如<collection>(用于一对多关系)和<association>(用于一对一关系)标签,fetchType属性起着关键作用。当设置为lazy时,明确表示对该关联对象采用延迟加载策略。以一个电子商务系统中的商品(Product)和商品图片(ProductImage)的一对多关系为例,在ProductMapper.xml中可能有如下配置:
- 在
<resultMap id="productResultMap" type="com.example.entity.Product"><id property="id" column="product_id"/><collection property="productImages"ofType="com.example.entity.ProductImage"select="com.example.dao.ProductImageMapper.getProductImagesByProductId"column="product_id"fetchType="lazy"/>
</resultMap>
- 在这个配置中,
productImages是Product实体类中的一个集合属性,用于存放商品图片对象。select属性指定了一个在ProductImageMapper接口中的方法,这个方法用于从数据库中获取指定商品 ID 的所有商品图片。column属性指定了传递给查询方法的参数,在这里就是商品的 ID。通过这种配置,当查询商品信息时,productImages这个关联对象会以延迟加载的方式处理。
-
Mybatis 延迟加载的实现原理详细解析
(1)代理对象机制的深入探讨
- 代理对象的生成:Mybatis 使用代理对象来实现延迟加载是基于 Java 的代理机制。当开启延迟加载并且配置正确后,对于需要延迟加载的关联对象,Mybatis 会创建一个代理对象。这个代理对象是在运行时动态生成的,它的生成过程涉及到 Java 的反射机制。以 Java 动态代理为例,Mybatis 会实现一个
InvocationHandler接口,在这个接口的invoke方法中,会处理对代理对象方法的调用。 - 方法拦截原理:当外部代码调用代理对象的方法时,实际上是调用了
InvocationHandler接口的invoke方法。在invoke方法中,代理对象会首先检查关联对象是否已经被加载。这个检查过程是通过判断一个标志位或者查看缓存来实现的。如果关联对象还没有被加载,代理对象就会触发加载过程。例如,假设代理对象是一个List类型的关联对象的代理(如前面提到的商品图片集合),当调用list.size()方法时,invoke方法会检测到如果关联对象(真实的商品图片列表)还没有被加载,就会执行加载操作。 - 代理对象与真实对象的替换:在关联对象加载完成后,代理对象会将自己替换为真实的对象。这个替换过程需要考虑到对象的类型兼容性和引用一致性。例如,在 Java 中,如果代理对象是
ArrayList的代理,加载完成后的真实对象也是ArrayList,那么代理对象会将自己在内存中的引用替换为真实的ArrayList对象的引用。这样,在后续的方法调用中,就可以直接使用真实对象,而不会再经过代理对象的拦截。
(2)加载过程的详细步骤
- 查询语句的构建与执行:当代理对象检测到需要加载关联对象时,它会根据在映射文件中配置的信息构建查询语句。这个过程涉及到解析
select属性指定的查询方法以及column属性指定的参数。以之前的商品和商品图片的例子来说,代理对象会从ProductImageMapper.getProductImagesByProductId这个方法签名和product_id这个参数构建出一个完整的 SQL 查询语句,然后通过 Mybatis 的SqlSession对象执行这个查询语句。在执行查询语句时,Mybatis 会使用配置好的数据源、数据库驱动等组件,将 SQL 语句发送到数据库服务器进行查询。 - 数据的映射与填充:数据库返回查询结果后,Mybatis 会根据结果集和实体类的映射关系(通常在
resultMap中定义)将数据填充到关联对象中。这个映射过程类似于普通的查询结果映射,但在延迟加载场景下,需要将数据填充到之前未加载的关联对象中。例如,对于商品图片的查询结果,Mybatis 会根据ProductImage实体类的属性和结果集的列名、列值的对应关系,将数据逐一填充到ProductImage对象中,然后将这些对象添加到关联对象(如productImages集合)中。 - 加载过程中的异常处理:在加载过程中,可能会出现各种异常情况,如数据库连接失败、SQL 语法错误、查询结果为空等。Mybatis 会对这些异常进行处理。如果是数据库连接失败等严重错误,会将异常向上抛出,可能导致整个操作失败。如果是查询结果为空,会根据具体的配置和业务需求进行处理,可能是返回一个空的关联对象(如空集合),也可能是抛出一个轻微的警告信息。
(3)缓存机制在延迟加载中的作用
- 一级缓存的影响:Mybatis 的一级缓存是基于
SqlSession的缓存。在延迟加载场景下,当一个SqlSession内首次加载关联对象后,数据可能会被缓存到一级缓存中。如果在同一个SqlSession内再次访问相同的关联对象,就可以直接从缓存中获取数据,而不需要再次执行查询语句。例如,在一个事务处理过程中,第一次加载了商品的图片关联对象,之后在同一事务(同一个SqlSession)中再次访问商品图片时,就可以利用一级缓存提高性能。 - 二级缓存的作用(如果启用):二级缓存是基于
Mapper的缓存,范围比一级缓存更广。如果在配置中启用了二级缓存,并且关联对象的查询符合二级缓存的规则,那么在不同的SqlSession之间也可以共享缓存数据。这对于频繁访问的关联对象来说,可以大大减少数据库查询次数。不过,在使用二级缓存时,需要注意缓存的一致性问题,因为不同的SqlSession可能会对数据进行修改,导致缓存数据与数据库中的实际数据不一致。在延迟加载场景下,二级缓存的更新策略和缓存清除机制需要谨慎设计,以确保缓存数据的准确性和及时性。
- 代理对象的生成:Mybatis 使用代理对象来实现延迟加载是基于 Java 的代理机制。当开启延迟加载并且配置正确后,对于需要延迟加载的关联对象,Mybatis 会创建一个代理对象。这个代理对象是在运行时动态生成的,它的生成过程涉及到 Java 的反射机制。以 Java 动态代理为例,Mybatis 会实现一个
相关文章:
Mybatis 支持延迟加载的详细内容
延迟加载的概念深入 延迟加载是一种在处理复杂对象关系时非常有用的策略。在企业级应用开发中,数据库中的表之间往往存在着各种关联关系,如一对多(一个用户有多个订单)、多对多(一个学生可以选多门课程,一门…...
word文档使用技巧笔记
中文和数字断开到第二行 word一串数字断开_百度知道 下划线对齐 word下划线怎么固定长度一致-百度经验...
使用docker-compose部署搜索引擎ElasticSearch6.8.10
背景 Elasticsearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建。它被广泛用于实时数据搜索、日志分析、全文检索等应用场景。 Elasticsearch 支持高效的全文搜索,并提供了强大的聚合功能,可以处理大规模的数据集并进行快速…...
bugku-web-login2
不知道为啥用bp始终登不上hackbar可以 随便输入个账号密码bp抓包,发现个小tip是base64加密的解密 $sql"SELECT username,password FROM admin WHERE username".$username.""; if (!empty($row) && $row[password]md5($password)){ } …...
【 AI技术赋能有限元分析与材料科学应用实践】Neo-Hookean 材料与深度学习结合的有限元分析
Neo-Hookean 材料模型是用于描述非线性弹性材料(如软组织和橡胶等)的经典模型,特别适用于大变形问题。其基本思想是通过应变能密度函数来描述材料的弹性行为。在该模型中,材料的应力-应变关系不仅依赖于应变能,还通过变…...
StarRocks关于ConcurrentModificationException 问题的解决
背景 本文基于 StarRocks 3.1.7 目前在基于Starrocks做一些数据分析的操作(主要是做一些简单的查询),同事遇到了一些并发的问题: ontent:2024-11-27 07:04:34,048 WARN (starrocks-mysql-nio-pool-214933|3593819) [StmtExecutor.execute():643] execute Exceptio…...
网络安全防护指南:筑牢网络安全防线(5/10)
一、网络安全的基本概念 (一)网络的定义 网络是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息收集、存储、传输、交换、处理的系统。在当今数字化时代,网络已经成为人们生活和工作中不可或缺的一部分。它连接了世…...
替代FTP最佳跨网文件传输解决方案——FileLink
在传统的企业文件传输中,FTP(文件传输协议)曾因其便捷性和高效性被广泛应用。然而,其固有的安全漏洞、对大文件传输支持的局限性、易受网络攻击等问题,已逐渐暴露出FTP在现代企业环境下的不足。针对这一问题࿰…...
Cesium在vue2中的引入和注意事项
在Vue2中,可以使用npm包管理工具来安装Cesium,并通过import语句将其引入到项目中。下面是在Vue2中引入Cesium的步骤和注意事项: 步骤: 首先,打开终端并进入Vue项目的根目录。 运行以下命令来安装Cesium: …...
CentOS 9 配置静态IP
文章目录 1_问题原因2_nmcli 配置静态IP3_使用配置文件固定IP4_重启后存在的问题5_nmcli 补充 1_问题原因 CentOS 7 于 2014年6月发布,基于 RHEL 7,并在 2024年6月30日 结束维护。 CentOS 9 作为目前的最新版本,今天闲来闲来无事下载下来后…...
深入解析 Webhook:从原理到实践的全面指南
1. 引言 1.1 什么是 Webhook? Webhook 是一种基于 HTTP 回调的轻量级通信机制,它允许一个系统实时向另一个系统发送数据。当特定事件发生时,Webhook 会主动向指定的 URL 发送 HTTP 请求,通常携带事件相关的数据。这种被动接收通…...
基于springboot+vue实现的创新创业学分管理系统 (源码+L文+ppt)4-111
4 系统总体设计 4.1系统功能结构设计图 根据需求说明设计系统各功能模块。采用模块化设计方法实现一个复杂结构进行简化,分成一个个小的容易解决的板块,然后再将小的板块继续分化成功能单一的更小模块。模块化设计方法使测试调试、维护更容易ÿ…...
如何高效地架构一个Java项目
引言 Java是企业级应用开发的主流语言之一,而我们作为使用Java语言的程序员,职称有初级、中级、高级、资深、经理、架构,但我们往往只是慢慢通过经验的积累迭代了自己的等级,如果没有保持学习的习惯,大多数程序员会停留…...
Scala的模式匹配(8)
package hfdobject Test35_1 { //需求:现在有一个数组Array(1,2,3,4)。我希望能定义三个变量,他们的值分别是数组中的第1,2,3个元素的值 def main(args: Array[String]): Unit {val arr Array(1,2,3,4,5)//第一个元素的值:arr(0…...
nodejs30: CSS 剪辑路径clip-path导致伪元素不可见问题及解决方法
相关问题 应用圆角裁剪时无法显示::after 取消clip-path设置: 完整问题代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, i…...
Git分布式版本控制工具 Git基本概念、Git工作流程、Git常用命令、Git远程仓库、IDEA操作Git
目录 1.Git基本概念 1.1 概述 1.1.1 开发中的实际场景 1.1.2 版本控制器的方式 1.1.2.1 集中式版本控制工具(SVN) 1.1.2.2 分布式版本控制工具(Git) 2.概述git工作流程 3.Git常用命令 3.1 Git环境配置 3.1.1 下载与安装 3.1.2 基本配置 3.1.3 为常用指令配置别名&…...
十,[极客大挑战 2019]Secret File1
点击进入靶场 查看源代码 有个显眼的紫色文件夹,点击 点击secret看看 既然这样,那就回去查看源代码吧 好像没什么用 抓个包 得到一个文件名 404 如果包含"../"、"tp"、"input"或"data",则输出"…...
Android 获取数字键盘和输入类型
在Android中,获取数字键盘可以通过为EditText设置输入类型为number或numberPassword来实现。以下是一个简单的例子: <!-- 在XML布局文件中 --> <EditText android:id"id/editTextNumber" android:layout_width"match_parent…...
8. 一分钟读懂“代理模式”
8.1 模式介绍 代理模式是一种结构型设计模式,它通过提供一个代理对象来替代对另一个对象(真实对象)的访问。代理对象与真实对象实现相同的接口,并通过代理类对真实对象的访问进行控制,可以在调用前后执行附加操作&…...
【实战攻略】如何从零开始快速实现深度学习新想法?——四步走战略
标题 【实战攻略】如何从零开始快速实现深度学习新想法?——四步走战略 【核心结论】 通过四步走战略,即找到baseline论文、深入baseline代码、搭建自己的pipeline、融入核心算法,新手也能快速实现深度学习新想法。 【通俗解释࿰…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
