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

mybatis 是否支持延迟加载?延迟加载的原理是什么?

1. MyBatis 是否支持延迟加载?

是的,MyBatis 支持延迟加载。延迟加载的主要功能是推迟数据加载的时机,直到真正需要时再去加载。这种方式能提高性能,尤其是在处理关系型数据时,可以避免不必要的数据库查询。

具体来说,MyBatis 支持在关联对象(association)和关联集合(collection)上进行延迟加载。通常,association 用于一对一的关联查询,collection 用于一对多的关联查询。

配置延迟加载

要启用延迟加载功能,您需要在 MyBatis 的配置文件中设置 lazyLoadingEnabledtrue

<settings><setting name="lazyLoadingEnabled" value="true"/>
</settings>

通过这种方式,MyBatis 在查询主表数据时,关联表的数据不会立即加载,而是等到访问关联属性时再去查询。

下面来详细说明一下:

举例:

假设有两个表 UserAddress,它们之间有一对一的关系,一个用户对应一个地址。

public class User {private Integer id;private String name;private Address address; // 延迟加载// getters and setters
}public class Address {private Integer id;private String street;// getters and setters
}

 如果在 User 类中的 address 属性上启用延迟加载,则在查询 User 时,address 这一关联数据不会立即加载,而是等到我们访问 address 时才会去查询 Address 表。

2. 表结构的关系

User 类和 Address 类代表了数据库中的两张表,User 表和 Address 表。在实际的数据库设计中,User 表和 Address 表之间通常会有外键关联,例如 Address 表可能会有一个字段 user_id,用来表示 AddressUser 的一对一关系。

假设我们的数据库表结构如下:

  • User 表

    CREATE TABLE user (id INT PRIMARY KEY,name VARCHAR(100)
    );
    
  • Address 表

    CREATE TABLE address (id INT PRIMARY KEY,street VARCHAR(100),user_id INT,  -- 关联到 User 表FOREIGN KEY (user_id) REFERENCES user(id)
    );
    

这里,Address 表中的 user_id 字段是一个外键(即使数据库表没有外键约束,MyBatis 依然可以根据配置的 SQL 查询进行延迟加载。外键约束只是保证了数据完整性,并不影响 MyBatis 如何进行延迟加载。),指向 User 表中的 id 字段,表示每个地址属于某个用户。

3. MyBatis 中如何关联表

在 MyBatis 中,User 类的 address 属性是延迟加载的,即当我们访问 user.getAddress() 时,MyBatis 会根据 user_id 来查询 Address 表中的数据。这是通过 MyBatis 的映射配置 来实现的。

MyBatis 映射配置

在 MyBatis 中,我们可以通过 映射文件(Mapper XML)注解 来指定如何加载 UserAddress 之间的关联数据。

假设我们使用的是 XML 配置,可能会在 User 类和 Address 类之间进行关联配置。

例如,定义一个查询 User 对象时,同时懒加载它的 Address 属性:

<!-- UserMapper.xml -->
<resultMap id="userResultMap" type="User"><id property="id" column="id"/><result property="name" column="name"/><!-- 延迟加载 address --><association property="address" column="id" select="selectAddressByUserId" fetchType="lazy"/>
</resultMap><select id="getUserById" resultMap="userResultMap">SELECT id, name FROM user WHERE id = #{id}
</select><!-- 查询 address -->
<select id="selectAddressByUserId" resultType="Address">SELECT * FROM address WHERE user_id = #{userId}
</select>

在这里:

  • resultMap 配置了如何将数据库查询结果映射到 User 对象。address 属性是通过关联查询来获取的(association)。
  • selectAddressByUserId 这个 SQL 查询通过 user_id 字段来查找关联的 Address 数据。

4. 延迟加载的实际流程

  • 当你查询 User 对象时(例如 SELECT id, name FROM user WHERE id = #{id}),只会查询 User 表,address 字段不会被立即加载。
  • User 对象被加载后,如果你访问 user.getAddress(),MyBatis 会检查 address 是否已经加载。如果没有加载,MyBatis 会发起一个新的查询,查询与当前 user 关联的 Address 数据。

具体来说,代理对象会拦截你对 user.getAddress() 的调用,然后执行 selectAddressByUserId 查询:

SELECT * FROM address WHERE user_id = #{userId}

#{userId} 会被替换为你查询的 User 对象的 id,然后执行查询,返回的 Address 对象会被设置到 User 对象的 address 属性中。

5. 总结:

  • 在数据库中,Address 表通过 user_id 字段与 User 表关联。
  • MyBatis 在映射文件中配置了 UserAddress 之间的关系,并且配置了延迟加载。
  • 初次查询 User 数据时,只会查询 User 表的数据,address 不会立即加载。
  • 当你访问 user.getAddress() 时,MyBatis 会触发一个新的查询(SELECT * FROM address WHERE user_id = #{userId}),加载 Address 数据并返回给你。

因此,SELECT * FROM address WHERE user_id = #{userId} 这个查询是由 MyBatis 根据 User 对象的 id 字段动态生成的,目的是通过外键 user_id 查询到与该 User 对象关联的 Address 数据。这是通过映射文件中的 association 和延迟加载配置来实现的。

相关文章:

mybatis 是否支持延迟加载?延迟加载的原理是什么?

1. MyBatis 是否支持延迟加载&#xff1f; 是的&#xff0c;MyBatis 支持延迟加载。延迟加载的主要功能是推迟数据加载的时机&#xff0c;直到真正需要时再去加载。这种方式能提高性能&#xff0c;尤其是在处理关系型数据时&#xff0c;可以避免不必要的数据库查询。 具体来说…...

collabora online+nextcloud+mariadb在线文档协助

1、环境 龙蜥os 8.9 docker 2、安装docker dnf -y install dnf-plugins-core dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sed -i shttps://download.docker.comhttps://mirrors.tuna.tsinghua.edu.cn/docker-ce /etc/yum.repos.…...

深度学习中的Checkpoint是什么?

诸神缄默不语-个人CSDN博文目录 文章目录 引言1. 什么是Checkpoint&#xff1f;2. 为什么需要Checkpoint&#xff1f;3. 如何使用Checkpoint&#xff1f;3.1 TensorFlow 中的 Checkpoint3.2 PyTorch 中的 Checkpoint3.3 transformers中的Checkpoint 4. 在 NLP 任务中的应用5. 总…...

字符串高频算法:无重复字符的最长子串

题目 3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 解题思路 思路 方法: 滑动窗口 [!简单思路] [^1]以示例一中的字符串 abcabcbb 为例&#xff0c;找出从每一个字符开始的&#xff0c;不包含重复字符的最长子串&#xff0c;其中最长的那个字符串即为答…...

用深度学习模型构建海洋动物图像分类保姆教程

使用深度学习模型构建深度学习海洋动物图像分类模型的完整步骤如下&#xff0c;分为关键阶段和详细操作说明&#xff1a; 1. 数据准备与预处理 1.1 数据集组织 按类别分文件夹存储图像&#xff0c;例如&#xff1a;dataset/train/class1/class2/...val/class1/class2/...test…...

51单片机俄罗斯方块计分函数

/************************************************************************************************************** * 名称&#xff1a;scoring * 功能&#xff1a;计分 * 参数&#xff1a;NULL * 返回&#xff1a;NULL * 备注&#xff1a;采用非阻塞延时 ****************…...

Android开发获取缓存,删除缓存

Android开发获取缓存&#xff0c;删除缓存 app设置中往往有清理缓存的功能。会显示当前缓存时多少&#xff0c;然后可以点击清理缓存 直接上代码&#xff1a; object CacheHelper {/*** 获取缓存大小* param context* return* throws Exception*/JvmStaticfun getTotalCache…...

npm无法加载文件 因为此系统禁止运行脚本

安装nodejs后遇到问题&#xff1a; 在项目里【node -v】可以打印出来&#xff0c;【npm -v】打印不出来&#xff0c;显示npm无法加载文件 因为此系统禁止运行脚本。 但是在winr&#xff0c;cmd里【node -v】,【npm -v】都也可打印出来。 解决方法&#xff1a; cmd里可以打印出…...

NLP_[2]-认识文本预处理

文章目录 1 认识文本预处理1 文本预处理及其作用2. 文本预处理中包含的主要环节2.1 文本处理的基本方法2.2 文本张量表示方法2.3 文本语料的数据分析2.4 文本特征处理2.5数据增强方法2.6 重要说明 2 文本处理的基本方法1. 什么是分词2 什么是命名实体识别3 什么是词性标注 1 认…...

知识库升级新思路:用生成式AI打造智能知识助手

在当今信息爆炸的时代&#xff0c;企业和组织面临着海量数据的处理和管理挑战。知识库管理系统&#xff08;Knowledge Base Management System, KBMS&#xff09;作为一种有效的信息管理工具&#xff0c;帮助企业存储、组织和检索知识。然而&#xff0c;传统的知识库系统往往依…...

蚂蚁爬行最短问题

初二数学问题记录 分析过程 考点&#xff1a;2点之间直线最短。 思考过程&#xff1a;将EBCF以BC为边翻折&#xff0c;EF边翻折后为&#xff0c;则A为蚂蚁需要爬行的最小距离。...

【电机控制器】STC8H1K芯片——低功耗

【电机控制器】STC8H1K芯片——低功耗 文章目录 [TOC](文章目录) 前言一、芯片手册说明二、IDLE模式三、PD模式四、PD模式唤醒五、实验验证1.接线2.视频&#xff08;待填&#xff09; 六、参考资料总结 前言 使用工具&#xff1a; 1.STC仿真器烧录器 提示&#xff1a;以下是本…...

【专题】2024-2025人工智能代理深度剖析:GenAI 前沿、LangChain 现状及演进影响与发展趋势报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p39630 在科技飞速发展的当下&#xff0c;人工智能代理正经历着深刻的变革&#xff0c;其能力演变已然成为重塑各行业格局的关键力量。从早期简单的规则执行&#xff0c;到如今复杂的自主决策与多智能体协作&#xff0c;人工智能代理…...

SAP-ABAP:SAP的第一行REPORT后面后缀作用详解

在SAP ABAP中&#xff0c;REPORT 语句是定义报表程序的核心语句&#xff0c;其后可以跟多个后缀&#xff08;参数&#xff09;&#xff0c;用于控制报表的行为和属性。以下是常见的 REPORT 后缀及其作用的详解&#xff1a; 程序名称 • 语法&#xff1a;REPORT <program_nam…...

25/2/8 <机器人基础> 阻抗控制

1. 什么是阻抗控制&#xff1f; 阻抗控制旨在通过调节机器人与环境的相互作用&#xff0c;控制其动态行为。阻抗可以理解为一个力和位移之间的关系&#xff0c;涉及力、速度和位置的协同控制。 2. 阻抗控制的基本概念 力控制&#xff1a;根据感测的外力调节机械手的动作。位置…...

java-list深入理解(流程图)

List源码学习: 此篇文章使用流程图和源码方式,理解List的源码,方便记忆 核心逻辑流程图: #mermaid-svg-BBrPrDuqUdLMtHvj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BBrPrDuqUdLMtHvj .error-icon{fill:#…...

Sparse4D v3:推进端到端3D检测和跟踪

论文地址&#xff1a;2311.11722 (arxiv.org) 代码地址&#xff1a;HorizonRobotics/Sparse4D (github.com) 在自动驾驶感知系统中&#xff0c;3D 检测和跟踪是两项基本任务。本文在 Sparse4D 框架的基础上更深入地探讨了这一领域。作者引入了两个辅助训练任务&#xff08;Temp…...

LeetCode781 森林中的兔子

问题描述 在一片神秘的森林里&#xff0c;住着许多兔子&#xff0c;但是我们并不知道兔子的具体数量。现在&#xff0c;我们对其中若干只兔子进行提问&#xff0c;问题是 “还有多少只兔子与你&#xff08;指被提问的兔子&#xff09;颜色相同&#xff1f;” 我们将每只兔子的…...

M系列/Mac安装配置Node.js全栈开发环境(nvm+npm+yarn)

一、安装 nvm&#xff08;Node Version Manager&#xff09; 打开终端&#xff0c;使用 curl 在 M 系列 Mac 上安装 nvm&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash对于非 M 系列的 Intel Mac&#xff0c;上述命令同样适…...

Dify使用

1. 概述 官网:Dify.AI 生成式 AI 应用创新引擎 文档:欢迎使用 Dify | Dify GITHUB:langgenius/dify: Dify is an open-source LLM app development platform. Difys intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, ob…...

借助 Cursor 快速实现小程序前端开发

借助 Cursor 快速实现小程序前端开发 在当今快节奏的互联网时代&#xff0c;小程序因其便捷性、高效性以及无需下载安装的特点&#xff0c;成为众多企业和开发者关注的焦点。然而&#xff0c;小程序的开发往往需要耗费大量的时间和精力&#xff0c;尤其是在前端开发阶段。幸运…...

python 语音识别方案对比

目录 一、语音识别 二、代码实践 2.1 使用vosk三方库 2.2 使用SpeechRecognition 2.3 使用Whisper 一、语音识别 今天识别了别人做的这个app,觉得虽然是个日记app 但是用来学英语也挺好的,能进行语音识别,然后矫正语法,自己说的时候 ,实在不知道怎么说可以先乱说,然…...

Hanoi ( 2022 ICPC Southeastern Europe Regional Contest )

Hanoi &#xff08; 2022 ICPC Southeastern Europe Regional Contest &#xff09; The original problem “Towers of Hanoi” is about moving n n n circular disks of distinct sizes between 3 3 3 rods. In one move, the player can move only the top disk from on…...

革新在线购物体验:CatV2TON引领虚拟试穿技术新纪元

在这个数字化飞速发展的时代&#xff0c;图像与视频合成技术正以前所未有的速度重塑着我们的生活&#xff0c;尤其在在线零售领域&#xff0c;一场关于购物体验的革命正在悄然上演。想象一下&#xff0c;无需亲自试穿&#xff0c;仅凭一张照片或一段视频&#xff0c;就能精准预…...

【Git】ssh如何配置gitlab+github

当我们工作项目在gitlab上&#xff0c;又希望同时能更新自己个人的github项目时&#xff0c;可能因为隐私问题&#xff0c;不能使用同一′密钥。就需要在本地电脑上分别配置两次ssh。 1、分别创建ssh key 在用户主目录下&#xff0c;查询是否存在“.ssh”文件&#xff1a; 如…...

全国路网矢量shp数据(分不同类型分省份)

科研练习数据 全国路网矢量shp数据&#xff08;分不同类型分省份&#xff09; 有需要的自取 数据格式&#xff1a;shp&#xff08;线&#xff09; 数据包含类型&#xff1a;城市主干道、城市次干道、城市快速路、城市支路、高速公路、内部道路、人行道、乡村道路、自行车道路…...

音频进阶学习十二——Z变换一(Z变换、收敛域、性质与定理)

文章目录 前言一、Z变换1.Z变换的作用2.Z变换公式3.Z的状态表示1&#xff09; r 1 r1 r12&#xff09; 0 < r < 1 0<r<1 0<r<13&#xff09; r > 1 r>1 r>1 4.关于Z的解释 二、收敛域1.收敛域的定义2.收敛域的表示方式3.ROC的分析1&#xff09;当 …...

使用Redis解决使用Session登录带来的共享问题

在学习项目的过程中遇到了使用Session实现登录功能所带来的共享问题&#xff0c;此问题可以使用Redis来解决&#xff0c;也即是加上一层来解决问题。 接下来介绍一些Session的相关内容并且采用Session实现登录功能&#xff08;并附上代码&#xff09;&#xff0c;进行分析其存在…...

STM32F1学习——USART串口通信

一、USART通用同步异步收发机 USART的全称是Universal Synchronous/Asynchronous Receiver Transmitter &#xff0c; 通用同步异步收发机&#xff0c;但由于他主要以异步通信为主&#xff0c;所以他也叫UART。它遵循TTL电平标准&#xff0c;是一种全双工异步通信标准&#xff…...

[概率论] 随机变量

Kolmogorov 定义的随机变量是基于测度论和实变函数的。这是因为随机变量的概念需要精确地定义其可能的取值、发生的概率以及这些事件之间的依赖关系。 测度论&#xff1a;在数学中&#xff0c;测度论是用来研究集合大小的理论&#xff0c;特别是无穷可数集和无界集的大小。对于…...