当前位置: 首页 > news >正文

Mybatis 支持延迟加载的详细内容

  1. 延迟加载的概念深入

    • 延迟加载是一种在处理复杂对象关系时非常有用的策略。在企业级应用开发中,数据库中的表之间往往存在着各种关联关系,如一对多(一个用户有多个订单)、多对多(一个学生可以选多门课程,一门课程可以被多个学生选)等。在传统的查询方式中,如果查询主对象(如用户),同时把与之关联的所有对象(如用户的所有订单)都查询出来,可能会导致大量不必要的数据传输和内存占用。特别是当关联对象的数据量较大或者查询频率较低时,这种提前加载所有关联数据的方式会浪费系统资源。
    • 例如,在一个内容管理系统中,一篇文章(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>

  • 在这个配置中,productImagesProduct实体类中的一个集合属性,用于存放商品图片对象。select属性指定了一个在ProductImageMapper接口中的方法,这个方法用于从数据库中获取指定商品 ID 的所有商品图片。column属性指定了传递给查询方法的参数,在这里就是商品的 ID。通过这种配置,当查询商品信息时,productImages这个关联对象会以延迟加载的方式处理。
  1. 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 支持延迟加载的详细内容

延迟加载的概念深入 延迟加载是一种在处理复杂对象关系时非常有用的策略。在企业级应用开发中&#xff0c;数据库中的表之间往往存在着各种关联关系&#xff0c;如一对多&#xff08;一个用户有多个订单&#xff09;、多对多&#xff08;一个学生可以选多门课程&#xff0c;一门…...

word文档使用技巧笔记

中文和数字断开到第二行 word一串数字断开_百度知道 下划线对齐 word下划线怎么固定长度一致-百度经验...

使用docker-compose部署搜索引擎ElasticSearch6.8.10

背景 Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它被广泛用于实时数据搜索、日志分析、全文检索等应用场景。 Elasticsearch 支持高效的全文搜索&#xff0c;并提供了强大的聚合功能&#xff0c;可以处理大规模的数据集并进行快速…...

bugku-web-login2

不知道为啥用bp始终登不上hackbar可以 随便输入个账号密码bp抓包&#xff0c;发现个小tip是base64加密的解密 $sql"SELECT username,password FROM admin WHERE username".$username.""; if (!empty($row) && $row[password]md5($password)){ } …...

【 AI技术赋能有限元分析与材料科学应用实践】Neo-Hookean 材料与深度学习结合的有限元分析

Neo-Hookean 材料模型是用于描述非线性弹性材料&#xff08;如软组织和橡胶等&#xff09;的经典模型&#xff0c;特别适用于大变形问题。其基本思想是通过应变能密度函数来描述材料的弹性行为。在该模型中&#xff0c;材料的应力-应变关系不仅依赖于应变能&#xff0c;还通过变…...

StarRocks关于ConcurrentModificationException 问题的解决

背景 本文基于 StarRocks 3.1.7 目前在基于Starrocks做一些数据分析的操作(主要是做一些简单的查询)&#xff0c;同事遇到了一些并发的问题: ontent:2024-11-27 07:04:34,048 WARN (starrocks-mysql-nio-pool-214933|3593819) [StmtExecutor.execute():643] execute Exceptio…...

网络安全防护指南:筑牢网络安全防线(5/10)

一、网络安全的基本概念 &#xff08;一&#xff09;网络的定义 网络是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息收集、存储、传输、交换、处理的系统。在当今数字化时代&#xff0c;网络已经成为人们生活和工作中不可或缺的一部分。它连接了世…...

替代FTP最佳跨网文件传输解决方案——FileLink

在传统的企业文件传输中&#xff0c;FTP&#xff08;文件传输协议&#xff09;曾因其便捷性和高效性被广泛应用。然而&#xff0c;其固有的安全漏洞、对大文件传输支持的局限性、易受网络攻击等问题&#xff0c;已逐渐暴露出FTP在现代企业环境下的不足。针对这一问题&#xff0…...

Cesium在vue2中的引入和注意事项

在Vue2中&#xff0c;可以使用npm包管理工具来安装Cesium&#xff0c;并通过import语句将其引入到项目中。下面是在Vue2中引入Cesium的步骤和注意事项&#xff1a; 步骤&#xff1a; 首先&#xff0c;打开终端并进入Vue项目的根目录。 运行以下命令来安装Cesium&#xff1a; …...

CentOS 9 配置静态IP

文章目录 1_问题原因2_nmcli 配置静态IP3_使用配置文件固定IP4_重启后存在的问题5_nmcli 补充 1_问题原因 CentOS 7 于 2014年6月发布&#xff0c;基于 RHEL 7&#xff0c;并在 2024年6月30日 结束维护。 CentOS 9 作为目前的最新版本&#xff0c;今天闲来闲来无事下载下来后…...

深入解析 Webhook:从原理到实践的全面指南

1. 引言 1.1 什么是 Webhook&#xff1f; Webhook 是一种基于 HTTP 回调的轻量级通信机制&#xff0c;它允许一个系统实时向另一个系统发送数据。当特定事件发生时&#xff0c;Webhook 会主动向指定的 URL 发送 HTTP 请求&#xff0c;通常携带事件相关的数据。这种被动接收通…...

基于springboot+vue实现的创新创业学分管理系统 (源码+L文+ppt)4-111

4 系统总体设计 4.1系统功能结构设计图 根据需求说明设计系统各功能模块。采用模块化设计方法实现一个复杂结构进行简化&#xff0c;分成一个个小的容易解决的板块&#xff0c;然后再将小的板块继续分化成功能单一的更小模块。模块化设计方法使测试调试、维护更容易&#xff…...

如何高效地架构一个Java项目

引言 Java是企业级应用开发的主流语言之一&#xff0c;而我们作为使用Java语言的程序员&#xff0c;职称有初级、中级、高级、资深、经理、架构&#xff0c;但我们往往只是慢慢通过经验的积累迭代了自己的等级&#xff0c;如果没有保持学习的习惯&#xff0c;大多数程序员会停留…...

Scala的模式匹配(8)

package hfdobject Test35_1 { //需求:现在有一个数组Array(1,2,3,4)。我希望能定义三个变量&#xff0c;他们的值分别是数组中的第1&#xff0c;2&#xff0c;3个元素的值 def main(args: Array[String]): Unit {val arr Array(1,2,3,4,5)//第一个元素的值&#xff1a;arr(0…...

nodejs30: CSS 剪辑路径clip-path导致伪元素不可见问题及解决方法

相关问题 应用圆角裁剪时无法显示::after 取消clip-path设置&#xff1a; 完整问题代码 <!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

点击进入靶场 查看源代码 有个显眼的紫色文件夹&#xff0c;点击 点击secret看看 既然这样&#xff0c;那就回去查看源代码吧 好像没什么用 抓个包 得到一个文件名 404 如果包含"../"、"tp"、"input"或"data"&#xff0c;则输出"…...

Android 获取数字键盘和输入类型

在Android中&#xff0c;获取数字键盘可以通过为EditText设置输入类型为number或numberPassword来实现。以下是一个简单的例子&#xff1a; <!-- 在XML布局文件中 --> <EditText android:id"id/editTextNumber" android:layout_width"match_parent…...

8. 一分钟读懂“代理模式”

8.1 模式介绍 代理模式是一种结构型设计模式&#xff0c;它通过提供一个代理对象来替代对另一个对象&#xff08;真实对象&#xff09;的访问。代理对象与真实对象实现相同的接口&#xff0c;并通过代理类对真实对象的访问进行控制&#xff0c;可以在调用前后执行附加操作&…...

【实战攻略】如何从零开始快速实现深度学习新想法?——四步走战略

标题 【实战攻略】如何从零开始快速实现深度学习新想法&#xff1f;——四步走战略 【核心结论】 通过四步走战略&#xff0c;即找到baseline论文、深入baseline代码、搭建自己的pipeline、融入核心算法&#xff0c;新手也能快速实现深度学习新想法。 【通俗解释&#xff0…...

Creating Server TCP listening socket *:6379: bind: No error

启动redis报错&#xff1a;Creating Server TCP listening socket *:6379: bind: No error 解决方案&#xff1a; 1、直接在命令行中输入 redis-cli.exe 2、输入shutdown&#xff0c;关闭 3、输exit&#xff0c;退出 4、重新输入 redis-server.exe redis.windows.conf&…...

Go热加载工具air-使用说明-win11问题解决指南

写web程序 每次都要ctrlc 然后go run .非常但疼 用一下这个热加载工具air Live reload for Go apps 贴个github地址&#xff1a;https://github.com/air-verse/air 1. go版本1.23先install一下 go install github.com/air-verse/airlatest下载完发现输入air windows还是报…...

华为HarmonyOS 让应用快速拥有账号能力 -- 2 获取用户头像昵称

场景介绍 如应用需要完善用户头像昵称信息&#xff0c;可使用Account Kit提供的头像昵称授权能力&#xff0c;用户允许应用获取头像昵称后&#xff0c;可快速完成个人信息填写。以下只针对Account kit提供的头像昵称授权能力进行介绍&#xff0c;若要获取头像还可通过场景化控…...

oracle表迁移至postgre

第一步: 导出表结构 进入脚本 第二步: 删除spool相关和prompt相关(不需要表空间的情况下) 类似以下语句 第三步: 修改数据类型 VARCHAR2 --> VARCHAR VARCHAR2(200 CHAR) --> VARCHAR(200) NUMBER(10,2) --> numeric(10,2…...

【PlantUML系列】类图(一)

目录 一、类 二、接口 三、抽象类 四、泛型类 五、类之间的关系 六、添加注释 七、包图 八、皮肤参数 一、类 使用class关键字定义类&#xff0c;类名后跟大括号&#xff0c;声明类的属性和方法。 属性&#xff1a;格式为{visibility} attributeName : AttributeType…...

Unity AssetBundles(AB包)

目录 前言 AB包是什么 AB包有什么作用 1.相对Resources下的资源AB包更好管理资源 2.减小包体大小 3.热更新 官方提供的打包工具:Asset Bundle Browser AB包资源加载 AB包资源管理模块代码 前言 在现代游戏开发中&#xff0c;资源管理是一项至关重要的任务。随着游戏内容…...

腾讯面试:如何解决哈希冲突?

我们面试时经常被问到HashMap是怎么解决哈希冲突的&#xff0c;很多同学对其含糊其词、一知半解。因此小编对相关知识进行了总结&#xff0c;希望帮助读者加深对其理解。 哈希表就是通过散列函数将键映射到定值&#xff0c;简单来说就是一个键对应一个值。 而通过散列函数映射…...

【动手学运动规划】 4.5 A*算法

我宁愿永远做我自己&#xff0c;也不愿成为别人&#xff0c;即使那个人比你更快乐。 —《成为简奥斯汀》 &#x1f3f0;代码及环境配置&#xff1a;请参考 环境配置和代码运行! 4.5.1 概述 Dijkstra算法是基于广度优先搜索策略来遍历空间内的所有节点&#xff0c;最终计算出…...

Spring Boot 3.4.0 发布:功能概览与示例

Spring Boot 3.4.0 带来了许多增强功能&#xff0c;使现代应用开发更加高效、便捷和强大。以下是最新功能的完整概述&#xff0c;以及一些帮助您快速入门的代码示例。 1. 应用程序版本管理 Spring Boot 引入了 spring.application.version 属性&#xff0c;方便开发者设置和访…...

【48】Android通过libjpeg-turbo库实现图片压缩

&#xff08;1&#xff09;公司为节约图片占用服务器存储资源成本&#xff0c;需要对Android手机客户端所传递到云存储服务器中的图片进行压缩&#xff0c;在不影响图片失真程度的情况下&#xff0c;最大限度的压缩图片以节省图片所占用的存储空间。 &#xff08;2&#xff09;…...