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

20. 如何在MyBatis中处理多表关联查询?常见的实现方式有哪些?

在MyBatis中处理多表关联查询是一项常见的需求,特别是在关系型数据库中存储复杂的实体关系时。MyBatis提供了多种方式来实现多表关联查询,常见的实现方式包括使用<association><collection>标签在<resultMap>中进行对象关系映射,以及通过嵌套查询和手动SQL语句来实现。

1. 使用 和 标签进行一对一关联查询

<association> 标签用于处理一对一关联关系(通常是主表和从表之间的一对一映射)。通过<association>标签,可以将从表的数据加载到主表的对应对象属性中。

1.1 示例:查询用户及其对应的地址信息(User与Address的一对一关系)

  • 数据库表

    • users表:存储用户信息,包含idusernameaddress_id等字段。

    • address表:存储地址信息,包含idstreetcity等字段。

  • 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>:定义了一对一的关联关系,其中propertyUser对象的属性名,javaType是关联对象的类型,column是外键,select用于指定查询关联对象的SQL。

    • 当查询用户时,MyBatis会首先执行findUserById查询users表,然后根据address_id执行selectAddressById查询address表,并将结果映射到User对象的address属性中。

2. 使用 和 标签进行一对多关联查询

<collection> 标签用于处理一对多或多对多关联关系(如一个用户有多个订单的关系)。通过<collection>标签,可以将从表的多行数据映射为主表对象的一个集合属性。

2.1 示例:查询用户及其对应的订单信息(User与Orders的一对多关系)

  • 数据库表

    • users表:存储用户信息,包含idusername等字段。

    • orders表:存储订单信息,包含iduser_idorder_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>:定义了一对多的关联关系,propertyUser对象的集合属性名,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直接关联了usersorders表,返回的结果集通过<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中处理多表关联查询的常见实现方式有以下几种:

  1. <association> 标签:处理一对一关联关系,将从表的数据映射到主表对象的一个属性。

  2. <collection> 标签:处理一对多或多对多关联关系,将从表的多行数据映射为主表对象的一个集合属性。

  3. 嵌套查询:通过嵌套查询实现复杂的关联关系查询,将结果映射到对象属性中。

  4. 手动SQL拼接:直接手写SQL,通过JOIN等操作进行多表关联查询,并映射结果。

  5. 自定义映射器:在Java代码中手动处理结果集,适合非常复杂的业务逻辑场景。

选择哪种方式应根据具体的需求和查询复杂度来决定,合理使用这些方式可以有效地处理数据库的多表关联查询,提高系统的性能和可维护性。

相关文章:

20. 如何在MyBatis中处理多表关联查询?常见的实现方式有哪些?

在MyBatis中处理多表关联查询是一项常见的需求&#xff0c;特别是在关系型数据库中存储复杂的实体关系时。MyBatis提供了多种方式来实现多表关联查询&#xff0c;常见的实现方式包括使用<association>和<collection>标签在<resultMap>中进行对象关系映射&…...

【百日算法计划】:每日一题,见证成长(013)

题目 回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 思路 找到中间节点反转后半部分链表前后链表顺序比…...

PCL 读取和保存点云

目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、概述 1.1原理 PCL (Point Cloud Library) 是…...

js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】

js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】 描述 概述 在前端开发中&#xff0c;遇到TypeError: Cannot read properties of null (reading indexOf)这类错误并不罕见。这个错误通常表明你试图在一个null值上调用indexOf方法&#xff0c…...

微信小程序-formData使用

作者&#xff1a;fyupeng 技术专栏&#xff1a;☞ https://github.com/fyupeng 项目地址&#xff1a;☞ https://github.com/fyupeng/distributed-blog-system-api 留给读者 一、介绍 在小程序中使用formdata上传数据&#xff0c;可实现多文件上传 跟浏览器中的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扫描过程中&#xff0c;检测到mysql-connector-j:8.0.33存在如下高危安全漏洞&#xff1a; CVE-2023-22102&#xff1a;Oracle MySQL Connectors 8.1.0 版本之前存在安全漏洞&…...

Flutter 响应式框架

一、简介 响应式框架会自动使用户界面适应不同的屏幕大小。创建你的用户界面一次&#xff0c;让它显示完美的像素在移动&#xff0c;平板电脑和桌面&#xff01; 1.1 问题 支持多种显示尺寸通常意味着要多次重新创建同一布局。在传统的Bootstrap方法下&#xff0c;构建响应式…...

电脑AE特效软件 After Effects软件2017中文版下载安装指南 (Win/Mac)

电脑ae特效软件 After Effects软件2017中文版下载安装win/... 电脑AE特效软件 After Effects软件2017中文版下载安装指南 (Win/Mac) Adobe After Effects 2017 是一款功能强大的视频后期处理软件&#xff0c;广泛应用于影视特效制作、动态图形设计、视觉效果合成等领域。其丰…...

C#中的装箱和拆箱是什么

在 C# 中&#xff0c;装箱&#xff08;Boxing&#xff09;和拆箱&#xff08;Unboxing&#xff09;是与值类型和引用类型相关的概念&#xff0c;涉及到值类型的数据在托管堆&#xff08;Heap&#xff09;上的存储方式。 装箱&#xff08;Boxing&#xff09; 装箱是指将值类型…...

在 Debian 12 上安装中文五笔输入法

在 Debian 12 上安装中文五笔输入法&#xff0c;你可以通过以下步骤进行&#xff1a; 更新系统包列表&#xff1a; 打开终端&#xff0c;首先更新你的系统包列表&#xff1a; sudo apt update安装输入法框架&#xff1a; 安装 fcitx5 输入法框架&#xff1a; sudo apt install …...

整流器制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

整流器制造行业作为制造业的重要组成部分&#xff0c;也在积极探索数字化转型的新路径。整流器&#xff0c;作为电力电子领域的关键元件&#xff0c;广泛应用于通信、工业控制、新能源等多个领域&#xff0c;其制造过程的智能化升级不仅关乎产品性能的提升&#xff0c;更是推动…...

算法知识点——常用输入输出数据的方式

如果输入的每组数据的结果不相互干扰的话&#xff0c;就可以在本次操作的时候将该组数据的相关结果进行输出。 1、n组输入输出(n确定&#xff09; scanf("%d",&n); while(n--) {scanf("%d %d",&a,&b); printf("%d %d\n",a,b);}cin…...

如何构建大数据治理平台,助力企业数据决策

建设背景 &#xff08;1&#xff09;什么是数据资产 资产由企业及组织拥有和控制&#xff0c;能够提供增值服务、带来经济利益的重要资源。 资产不但需要管理&#xff0c; 更需要运营。 &#xff08;2&#xff09;数据资产运营中的问题 数据资产运营中存在的问题主要包括以下…...

Playwright与Selenium的对比:谁是更适合你的自动化测试工具?

在自动化测试领域&#xff0c;Selenium 一直是行业的标杆工具。它功能强大、支持多浏览器、广泛应用于各类项目中。然而&#xff0c;随着技术的发展&#xff0c;新的工具不断涌现&#xff0c;Playwright 作为其中的佼佼者&#xff0c;以其现代化的设计和强大的特性吸引了越来越…...

Netty 相关问题

传统网络编程存在的问题 传统网络编程存在以下问题&#xff1a; 线程创建开销&#xff1a;在Java中&#xff0c;创建线程需要调用操作系统API&#xff0c;这会消耗资源和时间。内存占用高&#xff1a;线程本身占用内存&#xff0c;创建过多线程会导致内存资源紧张。CPU使用率…...

JAVA中线程池的详解

1.概念 顾名思义&#xff0c;线程池就是管理一系列线程的资源池&#xff0c;其提供了一种限制和管理线程资源的方式。每个线程池还维护一些基本统计信息&#xff0c;例如已完成任务的数量。 这里借用《Java 并发编程的艺术》书中的部分内容来总结一下使用线程池的好处&#x…...

【PyTorch单点知识】深入了解 nn.ModuleList和 nn.ParameterList模块:灵活构建动态网络结构

文章目录 0. 前言1. 为什么需要 nn.ModuleList 和 nn.ParameterList&#xff1f;2. nn.ModuleList&#xff1a;管理模块的列表2.1 什么是 nn.ModuleList&#xff1f;2.2 创建 nn.ModuleList2.3 动态添加或删除层 3. nn.ParameterList&#xff1a;管理参数列表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语言中的基本数据类型与类型转换

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

【CH32V307实战】4P OLED屏I2C驱动移植与快速显示指南

1. CH32V307与4P OLED屏的硬件连接指南 第一次拿到CH32V307开发板和4P OLED屏时&#xff0c;最让我头疼的就是接线问题。这种4线制OLED&#xff08;通常标注为4P或4PIN&#xff09;相比传统的7线制简化了不少&#xff0c;但引脚定义各家厂商可能略有差异。经过多次实测&#xf…...

完整实战指南:使用N_m3u8DL-RE高效解决流媒体下载难题

完整实战指南&#xff1a;使用N_m3u8DL-RE高效解决流媒体下载难题 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE …...

使用mcp-maker快速构建AI工具调用服务器:从协议原理到工程实践

1. 项目概述与核心价值最近在折腾AI应用开发&#xff0c;特别是想给大语言模型&#xff08;LLM&#xff09;装上更强大的“手脚”&#xff0c;让它能直接操作我电脑上的各种软件和工具。这听起来很酷&#xff0c;对吧&#xff1f;但实际操作起来&#xff0c;你会发现一个核心痛…...

量子私有信息检索(QPIR)技术解析与应用前景

1. 量子私有信息检索技术概述量子私有信息检索&#xff08;Quantum Private Information Retrieval, QPIR&#xff09;是密码学领域的一项突破性技术&#xff0c;它允许用户从数据库中检索特定条目而不泄露被查询的是哪个条目。这项技术的核心价值在于解决了隐私保护与数据获取…...

Shell脚本加固实战:用shellguard提升脚本健壮性与安全性

1. 项目概述&#xff1a;一个为Shell脚本穿上“防弹衣”的守护者 在运维开发、自动化部署乃至日常的系统管理工作中&#xff0c;Shell脚本是我们最忠实、最高效的伙伴。从简单的日志清理到复杂的CI/CD流水线&#xff0c;Shell脚本无处不在。然而&#xff0c;脚本的安全性、健壮…...

Mantic.sh:AI驱动的智能命令行工具,让自然语言生成终端命令

1. 项目概述&#xff1a;一个为开发者打造的智能终端伴侣 如果你和我一样&#xff0c;每天有超过一半的工作时间是在终端&#xff08;Terminal&#xff09;里度过的&#xff0c;那你一定对效率有着近乎偏执的追求。敲命令、查日志、管理进程、部署服务……这些重复且琐碎的操作…...

认识Python数据包套接字

如你所知&#xff0c;数据包格式套接字&#xff08;Datagram Sockets&#xff09;也叫“无连接的套接字”&#xff0c;在代码中使用 SOCK_DGRAM 表示。可以将 SOCK_DGRAM 比喻成高速移动的摩托车快递&#xff0c;它有以下特征&#xff1a;强调快速传输而非传输顺序&#xff1b;…...

工控一体机电脑核心性能特征解析:从选型到部署的实战指南

1. 项目概述&#xff1a;为什么我们需要重新审视工控一体机电脑&#xff1f;在工业自动化、智能制造、智慧零售乃至边缘计算这些听起来高大上的领域里&#xff0c;有一类设备常常是幕后的“无名英雄”&#xff0c;它不像机器人手臂那样引人注目&#xff0c;也不像云端服务器那样…...

3个技巧让SD-PPP插件提升Photoshop设计效率300%

3个技巧让SD-PPP插件提升Photoshop设计效率300% 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp 还在为Photoshop和AI工具之间的频繁切换而烦恼吗&#xff1f;每次都要导出PSD、上传到AI平台、等待生成、再导回Phot…...

基于BLE信号强度的寻物游戏:用CircuitPython实现无线接近探测

1. 项目概述&#xff1a;一个用蓝牙信号“捉迷藏”的硬件游戏几年前我第一次接触Adafruit的Circuit Playground系列开发板时&#xff0c;就被它那种“开箱即玩”的理念吸引了。它把LED、按钮、传感器都集成在一块板子上&#xff0c;让你不用焊接就能快速验证想法。后来出的Circ…...