20. 如何在MyBatis中处理多表关联查询?常见的实现方式有哪些?
在MyBatis中处理多表关联查询是一项常见的需求,特别是在关系型数据库中存储复杂的实体关系时。MyBatis提供了多种方式来实现多表关联查询,常见的实现方式包括使用<association>和<collection>标签在<resultMap>中进行对象关系映射,以及通过嵌套查询和手动SQL语句来实现。
1. 使用 和 标签进行一对一关联查询
<association> 标签用于处理一对一关联关系(通常是主表和从表之间的一对一映射)。通过<association>标签,可以将从表的数据加载到主表的对应对象属性中。
1.1 示例:查询用户及其对应的地址信息(User与Address的一对一关系)
-
数据库表:
-
users表:存储用户信息,包含id、username、address_id等字段。 -
address表:存储地址信息,包含id、street、city等字段。
-
-
MyBatis映射配置:
<resultMap id="userResultMap" type="User"><id property="id" column="id" /><result property="username" column="username" /><association property="address" javaType="Address" column="address_id" select="selectAddressById" /> </resultMap> <select id="findUserById" resultMap="userResultMap">SELECT * FROM users WHERE id = #{id} </select> <select id="selectAddressById" resultType="Address">SELECT * FROM address WHERE id = #{id} </select> -
解释:
-
<association>:定义了一对一的关联关系,其中property是User对象的属性名,javaType是关联对象的类型,column是外键,select用于指定查询关联对象的SQL。 -
当查询用户时,MyBatis会首先执行
findUserById查询users表,然后根据address_id执行selectAddressById查询address表,并将结果映射到User对象的address属性中。
-
2. 使用 和 标签进行一对多关联查询
<collection> 标签用于处理一对多或多对多关联关系(如一个用户有多个订单的关系)。通过<collection>标签,可以将从表的多行数据映射为主表对象的一个集合属性。
2.1 示例:查询用户及其对应的订单信息(User与Orders的一对多关系)
-
数据库表:
-
users表:存储用户信息,包含id、username等字段。 -
orders表:存储订单信息,包含id、user_id、order_date等字段。
-
-
MyBatis映射配置:
<resultMap id="userResultMap" type="User"><id property="id" column="id" /><result property="username" column="username" /><collection property="orders" ofType="Order" column="id" select="selectOrdersByUserId" /> </resultMap> <select id="findUserById" resultMap="userResultMap">SELECT * FROM users WHERE id = #{id} </select> <select id="selectOrdersByUserId" resultType="Order">SELECT * FROM orders WHERE user_id = #{id} </select> -
解释:
-
<collection>:定义了一对多的关联关系,property是User对象的集合属性名,ofType是集合中元素的类型,column是关联键,select用于指定查询从表数据的SQL。 -
当查询用户时,MyBatis会先执行
findUserById查询users表,然后根据id执行selectOrdersByUserId查询orders表,并将结果映射为User对象的orders集合属性。
-
3. 通过嵌套查询实现多表关联
MyBatis支持通过在<resultMap>或SQL语句中嵌套查询的方式来实现多表关联。
3.1 示例:查询用户及其订单(嵌套查询实现)
-
嵌套查询:
<select id="findUserWithOrders" resultMap="userWithOrdersResultMap">SELECT u.id AS user_id, u.username, o.id AS order_id, o.order_dateFROM users uLEFT JOIN orders o ON u.id = o.user_idWHERE u.id = #{id} </select> <resultMap id="userWithOrdersResultMap" type="User"><id property="id" column="user_id"/><result property="username" column="username"/><collection property="orders" ofType="Order"><id property="id" column="order_id"/><result property="orderDate" column="order_date"/></collection> </resultMap> -
解释:
-
在这个例子中,
<collection>标签在<resultMap>中定义了orders集合,MyBatis会根据查询结果的多个行自动组装成User对象的orders集合。 -
SQL语句通过
LEFT JOIN直接关联了users和orders表,返回的结果集通过<resultMap>映射到对象属性。
-
4. 使用手动SQL拼接
在某些复杂的场景下,开发者可能希望完全控制SQL语句的生成,这时可以手动编写多表关联查询的SQL。
4.1 示例:手动SQL拼接
<select id="findUserWithOrders">SELECT u.id AS user_id, u.username, o.id AS order_id, o.order_dateFROM users uLEFT JOIN orders o ON u.id = o.user_idWHERE u.id = #{id}
</select>
-
解释:
-
手动SQL拼接方式适合更复杂的查询场景,可以完全利用SQL的能力来处理多表关联查询。这种方式下,MyBatis只负责执行SQL并将结果映射为对象,开发者需要确保SQL的正确性和优化。
-
5. 使用自定义映射器
在一些复杂的查询场景中,可能需要通过自定义映射器(即在Java代码中手动处理结果集)来实现多表关联查询。
5.1 示例:使用自定义映射器
public List<User> findUserWithOrders() {List<User> users = userMapper.findUsers();for (User user : users) {List<Order> orders = userMapper.findOrdersByUserId(user.getId());user.setOrders(orders);}return users;
}
-
解释:
-
这种方式完全在Java代码中控制多表关联的查询和映射,适合处理非常复杂的业务逻辑或需要进行额外的数据处理的场景。
-
总结
在MyBatis中处理多表关联查询的常见实现方式有以下几种:
-
<association>标签:处理一对一关联关系,将从表的数据映射到主表对象的一个属性。 -
<collection>标签:处理一对多或多对多关联关系,将从表的多行数据映射为主表对象的一个集合属性。 -
嵌套查询:通过嵌套查询实现复杂的关联关系查询,将结果映射到对象属性中。
-
手动SQL拼接:直接手写SQL,通过JOIN等操作进行多表关联查询,并映射结果。
-
自定义映射器:在Java代码中手动处理结果集,适合非常复杂的业务逻辑场景。
选择哪种方式应根据具体的需求和查询复杂度来决定,合理使用这些方式可以有效地处理数据库的多表关联查询,提高系统的性能和可维护性。
相关文章:
20. 如何在MyBatis中处理多表关联查询?常见的实现方式有哪些?
在MyBatis中处理多表关联查询是一项常见的需求,特别是在关系型数据库中存储复杂的实体关系时。MyBatis提供了多种方式来实现多表关联查询,常见的实现方式包括使用<association>和<collection>标签在<resultMap>中进行对象关系映射&…...
【百日算法计划】:每日一题,见证成长(013)
题目 回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 输入:head [1,2,2,1] 输出:true 思路 找到中间节点反转后半部分链表前后链表顺序比…...
PCL 读取和保存点云
目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、概述 1.1原理 PCL (Point Cloud Library) 是…...
js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】
js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】 描述 概述 在前端开发中,遇到TypeError: Cannot read properties of null (reading indexOf)这类错误并不罕见。这个错误通常表明你试图在一个null值上调用indexOf方法,…...
微信小程序-formData使用
作者:fyupeng 技术专栏:☞ https://github.com/fyupeng 项目地址:☞ https://github.com/fyupeng/distributed-blog-system-api 留给读者 一、介绍 在小程序中使用formdata上传数据,可实现多文件上传 跟浏览器中的FormData对象类…...
潜在语义分析(Latent Semantic Analysis,LSA)—无监督学习方法、非概率模型、判别模型、线性模型、非参数化模型、批量学习
定义 输入: X [ x 11 x 12 ⋯ x 1 n x 21 x 22 ⋯ x 2 n ⋮ ⋮ ⋮ ⋮ x m 1 x m 2 ⋯ x m n ] , 文本集合 D { d 1 , d 2 , ⋯ , d n } , 单词集合 W { ω 1 , ω 2 , ⋯ , ω m } , x i j : 单词 ω i 在文本 d j 中出现的频数或权值 X\left[ \begin{array}{cccc} x_{11} …...
【安全漏洞】MySQL 8.0.33 、CVE-2023-22102
mysql-connector-java:jar:8.0.33已经重新定位到mysql-connector-j:jar:8.0.33 安全漏洞描述 在SBOM扫描过程中,检测到mysql-connector-j:8.0.33存在如下高危安全漏洞: CVE-2023-22102:Oracle MySQL Connectors 8.1.0 版本之前存在安全漏洞&…...
Flutter 响应式框架
一、简介 响应式框架会自动使用户界面适应不同的屏幕大小。创建你的用户界面一次,让它显示完美的像素在移动,平板电脑和桌面! 1.1 问题 支持多种显示尺寸通常意味着要多次重新创建同一布局。在传统的Bootstrap方法下,构建响应式…...
电脑AE特效软件 After Effects软件2017中文版下载安装指南 (Win/Mac)
电脑ae特效软件 After Effects软件2017中文版下载安装win/... 电脑AE特效软件 After Effects软件2017中文版下载安装指南 (Win/Mac) Adobe After Effects 2017 是一款功能强大的视频后期处理软件,广泛应用于影视特效制作、动态图形设计、视觉效果合成等领域。其丰…...
C#中的装箱和拆箱是什么
在 C# 中,装箱(Boxing)和拆箱(Unboxing)是与值类型和引用类型相关的概念,涉及到值类型的数据在托管堆(Heap)上的存储方式。 装箱(Boxing) 装箱是指将值类型…...
在 Debian 12 上安装中文五笔输入法
在 Debian 12 上安装中文五笔输入法,你可以通过以下步骤进行: 更新系统包列表: 打开终端,首先更新你的系统包列表: sudo apt update安装输入法框架: 安装 fcitx5 输入法框架: sudo apt install …...
整流器制造5G智能工厂物联数字孪生平台,推进制造业数字化转型
整流器制造行业作为制造业的重要组成部分,也在积极探索数字化转型的新路径。整流器,作为电力电子领域的关键元件,广泛应用于通信、工业控制、新能源等多个领域,其制造过程的智能化升级不仅关乎产品性能的提升,更是推动…...
算法知识点——常用输入输出数据的方式
如果输入的每组数据的结果不相互干扰的话,就可以在本次操作的时候将该组数据的相关结果进行输出。 1、n组输入输出(n确定) scanf("%d",&n); while(n--) {scanf("%d %d",&a,&b); printf("%d %d\n",a,b);}cin…...
如何构建大数据治理平台,助力企业数据决策
建设背景 (1)什么是数据资产 资产由企业及组织拥有和控制,能够提供增值服务、带来经济利益的重要资源。 资产不但需要管理, 更需要运营。 (2)数据资产运营中的问题 数据资产运营中存在的问题主要包括以下…...
Playwright与Selenium的对比:谁是更适合你的自动化测试工具?
在自动化测试领域,Selenium 一直是行业的标杆工具。它功能强大、支持多浏览器、广泛应用于各类项目中。然而,随着技术的发展,新的工具不断涌现,Playwright 作为其中的佼佼者,以其现代化的设计和强大的特性吸引了越来越…...
Netty 相关问题
传统网络编程存在的问题 传统网络编程存在以下问题: 线程创建开销:在Java中,创建线程需要调用操作系统API,这会消耗资源和时间。内存占用高:线程本身占用内存,创建过多线程会导致内存资源紧张。CPU使用率…...
JAVA中线程池的详解
1.概念 顾名思义,线程池就是管理一系列线程的资源池,其提供了一种限制和管理线程资源的方式。每个线程池还维护一些基本统计信息,例如已完成任务的数量。 这里借用《Java 并发编程的艺术》书中的部分内容来总结一下使用线程池的好处&#x…...
【PyTorch单点知识】深入了解 nn.ModuleList和 nn.ParameterList模块:灵活构建动态网络结构
文章目录 0. 前言1. 为什么需要 nn.ModuleList 和 nn.ParameterList?2. nn.ModuleList:管理模块的列表2.1 什么是 nn.ModuleList?2.2 创建 nn.ModuleList2.3 动态添加或删除层 3. nn.ParameterList:管理参数列表3.1 什么是 nn.Par…...
vscode创建Python虚拟环境无法激活问题处理
系统环境 win7环境,Python3.7,VScode1.70.3 问题报错: PS C:\Users\Administrator\PycharmProjects\websites> .\venv\Scripts\activate 无法加载文件 C:\Users\Administrator\PycharmProjects\websites\venv\Scripts\Activate.ps1,因为在此系统中禁止执行脚本。有关…...
【Go】Go语言中的基本数据类型与类型转换
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
