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

news2025/2/11 15:44:40

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 和延迟加载配置来实现的。

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

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

相关文章

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. 总…

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

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

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

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

知识库升级新思路:用生成式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;根据感测的外力调节机械手的动作。位置…

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

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

python 语音识别方案对比

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

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

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

【Git】ssh如何配置gitlab+github

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

Docker 部署 MinIO | 国内阿里镜像

一、导读 Minio 是个基于 Golang 编写的开源对象存储套件&#xff0c;基于Apache License v2.0开源协议&#xff0c;虽然轻量&#xff0c;却拥有着不错的性能。它兼容亚马逊S3云存储服务接口。可以很简单的和其他应用结合使用&#xff0c;例如 NodeJS、Redis、MySQL等。 二、…

【R语言】相关系数

一、cor()函数 cor()函数是R语言中用于计算相关系数的函数&#xff0c;相关系数用于衡量两个变量之间的线性关系强度和方向。 常见的相关系数有皮尔逊相关系数&#xff08;Pearson correlation coefficient&#xff09;、斯皮尔曼秩相关系数&#xff08;Spearmans rank corre…

DeepSeek-R1技术报告快速解读

相关论文链接如下&#xff1a; DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language ModelsDeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 文章目录 一、论文脑图二、论文解读2.1 研究背景2.2 研究方法2.3 …