mybatis 是否支持延迟加载?延迟加载的原理是什么?
1. MyBatis 是否支持延迟加载?
是的,MyBatis 支持延迟加载。延迟加载的主要功能是推迟数据加载的时机,直到真正需要时再去加载。这种方式能提高性能,尤其是在处理关系型数据时,可以避免不必要的数据库查询。
具体来说,MyBatis 支持在关联对象(association
)和关联集合(collection
)上进行延迟加载。通常,association
用于一对一的关联查询,collection
用于一对多的关联查询。
配置延迟加载
要启用延迟加载功能,您需要在 MyBatis 的配置文件中设置 lazyLoadingEnabled
为 true
。
<settings><setting name="lazyLoadingEnabled" value="true"/>
</settings>
通过这种方式,MyBatis 在查询主表数据时,关联表的数据不会立即加载,而是等到访问关联属性时再去查询。
下面来详细说明一下:
举例:
假设有两个表 User
和 Address
,它们之间有一对一的关系,一个用户对应一个地址。
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
,用来表示 Address
和 User
的一对一关系。
假设我们的数据库表结构如下:
-
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) 或 注解 来指定如何加载 User
和 Address
之间的关联数据。
假设我们使用的是 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 在映射文件中配置了
User
和Address
之间的关系,并且配置了延迟加载。 - 初次查询
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 是否支持延迟加载? 是的,MyBatis 支持延迟加载。延迟加载的主要功能是推迟数据加载的时机,直到真正需要时再去加载。这种方式能提高性能,尤其是在处理关系型数据时,可以避免不必要的数据库查询。 具体来说…...
【Android开发】安卓手机APP拍照并使用机器学习进行OCR文字识别
前言:点击手机APP上的拍照后,调取手机设备相机拍照并获取图片显示到手机APP页面,进行提取照片内的文字,并将识别结果显示在界面上,在离线模式下也可用。文末工程链接下载 演示视频: 目录 1.新建java项目 2.添加依赖 3. MainActivity.java文件 4.activity_main.xml 文…...
力扣 15.三数之和
题目: 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的…...
机器学习:二分类和多分类
1. 二分类(Binary Classification) 定义 二分类是指将输入样本分成两个互斥的类别。例如: 邮件 spam 或不是 spam。病人是有病或健康。物品是正品或假货。实现方法 二分类任务可以通过多种算法实现,包括: 逻辑回归(Logistic Regression):通过sigmoid函数将输出值映射…...

安科瑞光伏发电防逆流解决方案——守护电网安全,提升能源效率
安科瑞 华楠 18706163979 在当今大力发展清洁能源的时代背景下,光伏发电作为一种可持续的能源解决方案, 正得到越来越广泛的应用。然而,光伏发电过程中出现的逆流问题,给电网的安全稳定 运行带来了诸多挑战。若不能有效解决&…...
ml5.js框架实现AI图片识别
ml5.js ml5.js 提供了简单的接口来加载和使用机器学习模型,如图像分类、文本生成、姿态估计等,不需要深入理解底层的数学原理或复杂的编程技巧 ml5.js 构建在 TensorFlow.js 之上,提供了一系列预训练模型和简易的 API 接口 图片识别 先进行一…...
HDFS应用-后端存储cephfs-文件存储和对象存储数据双向迁移
DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具。 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝 配置/…...
关于atomic 是否是线程安全的问题
在 Objective - C 里,atomic 特性并不能保证对象是完全线程安全的,下面从其基本原理、部分线程安全场景以及局限性来详细说明: 先看一个例子 #import <Foundation/Foundation.h>interface MyClass : NSObject property (atomic, assi…...

在实体机和wsl2中安装docker、使用GPU
正常使用docker和gpu,直接命令行安装dcoker和,nvidia-container-toolkit。区别在于,后者在于安装驱动已经cuda加速时存在系统上的差异。 1、安装gpu驱动 在实体机中,安装cuda加速包,我们直接安装 driver 和 cuda 即可…...

HTTP3.0:QUIC协议详解
文章目录 HTTP3.0:QUIC协议详解QUIC是什么QUIC为什么这么快**连接建立快:一见钟情型协议****拥抱UDP:轻装上阵****多路复用:一条路走到黑****更智能的丢包处理****内置加密****网络切换无压力****拥塞控制更智能** QUIC的应用场景QUIC未来会取…...

【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA
【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA data source1: BH coordination tabledata source2:BH layer tableprocess 1:Collect BH List To Layer Tableprocess 2:match Reduced Level from "Layer"+"BH"data source1: BH coordination…...

【数据处理】使用python收集网络数据--爬虫基础
我们经常需要获取大量的网络数据用于分析,靠人工获取效率太低,所以用代码获取成为大多数人的主要选择,这里简单介绍下使用python进行网络数据爬取的方法 数据获取 由于我们没有各个平台的内部数据和接口,要想获取数据只能从网页…...

代码随想录二叉树篇(含源码)
二叉树与递归 前言226.翻转二叉树算法思路及代码solution 1 用分解问题的思路来解决solution 2 用遍历的思路来解决 101.对称二叉树算法思路及代码solution 104.二叉树的最大深度算法思路及代码solution 1 遍历solution 2 分解问题 111.二叉树的最小深度算法思路及代码solution…...
网络安全检测思路
对于主机的安全检测,我们通常直接采用nmap或者类似软件进行扫描,然后针对主机操作系统及其 开放端口判断主机的安全程度,这当然是一种方法,但这种方法往往失之粗糙,我仔细考虑了一下,觉 得按下面的流程进行…...

ios通过xib创建控件
之前写过ios动态创建控件及添加事件,纯手工代码写控件,虽然比较灵活,但是就是代码量比较多。这次我们通过xib来创建app下载列表项 AppView.xib。一个imageview,一个label,一个button构成 1.创建AppView.xib 2.再创建xib对应的mode࿰…...

跟着李沐老师学习深度学习(八)
数值稳定性 模型初始化和激活函数 数值稳定性 神经网络的梯度 考虑如下d层的神经网络(t代表层) 计算损失 l 关于参数 Wt 的梯度: 这样的矩阵乘法带来的问题: (1)梯度爆炸 (2)梯度…...

元宵小花灯
吃完饭散步回来的路上,看到一个小朋友拿着元宵小灯,后面的家长也闲适的哼着歌。 想起前阵子看到说,大人爱看小孩玩,也是共享那份天真快乐吧。 我小时候每年的元宵节,也有自己的小灯,那是九几年,…...

算法——搜索算法:原理、类型与实战应用
搜索算法:开启高效信息检索的钥匙 在信息爆炸的时代,搜索算法无疑是计算机科学领域中熠熠生辉的存在,它就像一把神奇的钥匙,为我们打开了高效信息检索的大门。无论是在日常生活中,还是在专业的工作场景里,…...

告别传统测量:三维扫描仪测量工件尺寸
在现代制造业中,精确测量工件尺寸是确保产品质量和生产效率的关键环节。然而,传统测量方法往往存在效率低下、精度不足以及操作复杂等问题,难以满足高精度和复杂形状工件的测量需求。 传统工件尺寸测量主要依赖于卡尺、千分尺、三坐标测量仪…...

win32汇编环境,对话框程序使用跟踪条(滑块)控件示例一
;运行效果 ;win32汇编环境,对话框程序使用跟踪条控件示例一 ;生成2条横的跟踪条,分别设置不同的数值范围,设置不同的进度副度的例子 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>>…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...