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

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;可以避免不必要的数据库查询。 具体来说…...

【Android开发】安卓手机APP拍照并使用机器学习进行OCR文字识别

前言:点击手机APP上的拍照后,调取手机设备相机拍照并获取图片显示到手机APP页面,进行提取照片内的文字,并将识别结果显示在界面上,在离线模式下也可用。文末工程链接下载 演示视频: 目录 1.新建java项目 2.添加依赖 3. MainActivity.java文件 4.activity_main.xml 文…...

力扣 15.三数之和

题目&#xff1a; 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k&#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的…...

机器学习:二分类和多分类

1. 二分类(Binary Classification) 定义 二分类是指将输入样本分成两个互斥的类别。例如: 邮件 spam 或不是 spam。病人是有病或健康。物品是正品或假货。实现方法 二分类任务可以通过多种算法实现,包括: 逻辑回归(Logistic Regression):通过sigmoid函数将输出值映射…...

安科瑞光伏发电防逆流解决方案——守护电网安全,提升能源效率

安科瑞 华楠 18706163979 在当今大力发展清洁能源的时代背景下&#xff0c;光伏发电作为一种可持续的能源解决方案&#xff0c; 正得到越来越广泛的应用。然而&#xff0c;光伏发电过程中出现的逆流问题&#xff0c;给电网的安全稳定 运行带来了诸多挑战。若不能有效解决&…...

ml5.js框架实现AI图片识别

ml5.js ml5.js 提供了简单的接口来加载和使用机器学习模型&#xff0c;如图像分类、文本生成、姿态估计等&#xff0c;不需要深入理解底层的数学原理或复杂的编程技巧 ml5.js 构建在 TensorFlow.js 之上&#xff0c;提供了一系列预训练模型和简易的 API 接口 图片识别 先进行一…...

HDFS应用-后端存储cephfs-文件存储和对象存储数据双向迁移

DistCp&#xff08;分布式拷贝&#xff09;是用于大规模集群内部和集群之间拷贝的工具。 它使用Map/Reduce实现文件分发&#xff0c;错误处理和恢复&#xff0c;以及报告生成。 它把文件和目录的列表作为map任务的输入&#xff0c;每个任务会完成源列表中部分文件的拷贝 配置/…...

关于atomic 是否是线程安全的问题

在 Objective - C 里&#xff0c;atomic 特性并不能保证对象是完全线程安全的&#xff0c;下面从其基本原理、部分线程安全场景以及局限性来详细说明&#xff1a; 先看一个例子 #import <Foundation/Foundation.h>interface MyClass : NSObject property (atomic, assi…...

在实体机和wsl2中安装docker、使用GPU

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

HTTP3.0:QUIC协议详解

文章目录 HTTP3.0:QUIC协议详解QUIC是什么QUIC为什么这么快**连接建立快&#xff1a;一见钟情型协议****拥抱UDP&#xff1a;轻装上阵****多路复用&#xff1a;一条路走到黑****更智能的丢包处理****内置加密****网络切换无压力****拥塞控制更智能** 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收集网络数据--爬虫基础

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

代码随想录二叉树篇(含源码)

二叉树与递归 前言226.翻转二叉树算法思路及代码solution 1 用分解问题的思路来解决solution 2 用遍历的思路来解决 101.对称二叉树算法思路及代码solution 104.二叉树的最大深度算法思路及代码solution 1 遍历solution 2 分解问题 111.二叉树的最小深度算法思路及代码solution…...

网络安全检测思路

对于主机的安全检测&#xff0c;我们通常直接采用nmap或者类似软件进行扫描&#xff0c;然后针对主机操作系统及其 开放端口判断主机的安全程度&#xff0c;这当然是一种方法&#xff0c;但这种方法往往失之粗糙&#xff0c;我仔细考虑了一下&#xff0c;觉 得按下面的流程进行…...

ios通过xib创建控件

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

跟着李沐老师学习深度学习(八)

数值稳定性 模型初始化和激活函数 数值稳定性 神经网络的梯度 考虑如下d层的神经网络&#xff08;t代表层&#xff09; 计算损失 l 关于参数 Wt 的梯度&#xff1a; 这样的矩阵乘法带来的问题&#xff1a; &#xff08;1&#xff09;梯度爆炸 &#xff08;2&#xff09;梯度…...

元宵小花灯

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

算法——搜索算法:原理、类型与实战应用

搜索算法&#xff1a;开启高效信息检索的钥匙 在信息爆炸的时代&#xff0c;搜索算法无疑是计算机科学领域中熠熠生辉的存在&#xff0c;它就像一把神奇的钥匙&#xff0c;为我们打开了高效信息检索的大门。无论是在日常生活中&#xff0c;还是在专业的工作场景里&#xff0c;…...

告别传统测量:三维扫描仪测量工件尺寸

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

win32汇编环境,对话框程序使用跟踪条(滑块)控件示例一

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

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...