Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别

MyBatis 是一个用于简化数据库操作的框架,它可以帮助开发人员通过映射语句轻松执行 SQL 查询,并且能够方便地实现对象与数据库表之间的映射。MyBatis 支持一对一、一对多和多对多等关联查询。下面我们来探讨一下 MyBatis 如何实现一对一、一对多的关联查询,并了解它们的实现方式及区别。

一、MyBatis中的关联查询

在 MyBatis 中,关联查询通常是通过 映射嵌套结果(Nested Result Mapping)和 嵌套选择(Nested Select)来实现的。你可以在 MyBatis 的映射文件中配置 <resultMap><association><collection> 等标签来处理这些关联。

二、实现一对一和一对多关联查询的方式

1. 一对一关联查询

一对一关联查询的场景是一个表的记录与另一个表的记录一一对应,通常通过外键关系来实现。

1.1 使用 <association> 标签

在 MyBatis 中,你可以使用 <association> 标签来进行一对一关联查询。它用于将查询结果中的一个字段映射到另一个对象的属性上。

示例:

假设我们有两个表 useraddress,其中 user 表包含一个外键 address_id,指向 address 表。

<!-- UserMapper.xml --> <resultMap id="userResultMap" type="User"> <id property="id" column="user_id"/> <result property="name" column="user_name"/> <association property="address" javaType="Address"> <id property="id" column="address_id"/> <result property="street" column="address_street"/> <result property="city" column="address_city"/> </association> </resultMap> <select id="findUserById" resultMap="userResultMap"> SELECT u.user_id, u.user_name, a.address_id, a.address_street, a.address_city FROM user u LEFT JOIN address a ON u.address_id = a.address_id WHERE u.user_id = #{userId} </select>

在上述示例中,<association> 标签用于将 useraddress 之间的关联关系映射到 User 类中的 address 属性上。当查询用户时,useraddress 数据会被映射到 User 对象及其嵌套的 Address 对象中。

2. 一对多关联查询

一对多关联查询的场景是一个表的记录与另一个表的多条记录相关联。通常可以通过子查询或者联合查询来实现。

2.1 使用 <collection> 标签

在 MyBatis 中,<collection> 标签用于表示一对多关系。它可以将查询结果中的多条记录映射到一个集合(如 ListSet)中。

示例:

假设我们有两个表 authorbook,其中 author 表和 book 表存在一对多关系,即一个作者可能写多本书。

<!-- AuthorMapper.xml --> <resultMap id="authorResultMap" type="Author"> <id property="id" column="author_id"/> <result property="name" column="author_name"/> <collection property="books" ofType="Book"> <id property="id" column="book_id"/> <result property="title" column="book_title"/> </collection> </resultMap> <select id="findAuthorWithBooks" resultMap="authorResultMap"> SELECT a.author_id, a.author_name, b.book_id, b.book_title FROM author a LEFT JOIN book b ON a.author_id = b.author_id WHERE a.author_id = #{authorId} </select>

在上述示例中,<collection> 标签用于将查询结果中的 book 数据映射到 Author 类的 books 属性中。<collection> 会将多条记录映射成一个集合,通常是 List 类型。

2.2 使用嵌套查询(<select> 标签)

另一种实现一对多关联查询的方式是使用嵌套查询,即在父查询的结果映射中使用 <select> 标签来查询子表的记录。

示例:

<!-- AuthorMapper.xml --> <resultMap id="authorResultMap" type="Author"> <id property="id" column="author_id"/> <result property="name" column="author_name"/> <select property="books" resultType="Book"> SELECT b.book_id, b.book_title FROM book b WHERE b.author_id = #{id} </select> </resultMap> <select id="findAuthorWithBooks" resultMap="authorResultMap"> SELECT a.author_id, a.author_name FROM author a WHERE a.author_id = #{authorId} </select>

在这个例子中,<select> 标签嵌套在 <resultMap> 中,用于查询与父对象 author 关联的 book 数据。这种方式通过执行两次 SQL 查询来获取一对多的关系。

三、关联查询的实现方式对比

1. 使用 <association> vs <collection>
  • <association> 标签用于一对一关系,表示一个父对象包含一个子对象,适用于数据库中一对一的场景。
  • <collection> 标签用于一对多关系,表示一个父对象包含多个子对象,适用于数据库中的一对多场景。
2. 联合查询 vs 嵌套查询
  • 联合查询(JOIN)通常是将两个表的数据合并成一行来查询。这种方式通常效率较高,但需要注意关联表的数据重复问题(比如一对多关系会导致数据重复)。
  • 嵌套查询<select>)是通过额外的查询来获取关联数据,通常适用于复杂的查询场景,特别是当需要处理一对多或多对多关系时。这种方式可能会导致较高的查询开销,但可以提供更灵活的查询结构。

四、总结

  • 一对一查询:可以通过 <association> 标签来实现,它适用于一个表的记录与另一个表的记录一一对应的情况。
  • 一对多查询:可以通过 <collection> 标签来实现,或者使用嵌套查询(<select> 标签)来执行一对多的查询。
  • 区别
    • <association> 用于映射一对一的关系,而 <collection> 用于映射一对多的关系。
    • 联合查询一般适用于一对多的一次性查询,但在复杂查询中可能会出现数据重复或性能问题;嵌套查询则可以将父子表分开处理,但可能会导致多个查询的执行,影响性能。

选择合适的实现方式,主要根据查询的复杂度、性能要求和实际业务需求来决定

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【原生js案例】ajax的简易封装实现后端数据交互

ajax是前端与后端数据库进行交互的最基础的工具&#xff0c;第三方的工具库比如jquery,axios都有对ajax进行第二次的封装&#xff0c;fecth是浏览器原生自带的功能&#xff0c;但是它与ajax还是有区别的&#xff0c;总结如下&#xff1a; ajax与fetch对比 实现效果 代码实现 …

Hive其四,Hive的数据导出,案例展示,表类型介绍

目录 一、Hive的数据导出 1&#xff09;导出数据到本地目录 2&#xff09;导出到hdfs的目录下 3&#xff09;直接将结果导出到本地文件中 二、一个案例 三、表类型 1、表类型介绍 2、内部表和外部表转换 3、两种表的区别 4、练习 一、Hive的数据导出 数据导出的分类&…

uniApp使用腾讯地图提示未添加maps模块

uniApp使用腾讯地图&#xff0c;打包提示未添加maps模块解决方案 这是报错信息&#xff0c;在标准基座运行的时候是没问题的&#xff0c;但是打包后会提示未添加&#xff0c;可以通过在mainfest里面把地图插件上腾讯地图的key更换高德地图的key&#xff0c;定位服务可以继续用腾…

OpenCV 学习记录:首篇

最近在学习机器视觉&#xff0c;希望能通过记录博客的形式来鞭策自己坚持学完&#xff0c;同时也把重要的知识点记录下来供参考学习。 1. OpenCV 介绍与模块组成 什么是 OpenCV&#xff1f; OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软…

白嫖内网穿透之神卓互联Linux安装教程(树莓派)

最近家里有一个树莓派&#xff0c;捣鼓来去不知道干嘛&#xff0c;于是打算作为内网穿透盒子用&#xff0c;于是百度了一下&#xff0c;发现神卓互联还不错&#xff0c;可以让外网请求通过各种复杂的路由和防火墙访问到内网的服务。 以下是在Linux树莓派系统上安装神卓互联客户…

C语言入门(一):A + B _ 基础输入输出

前言 本专栏记录C语言入门100例&#xff0c;这是第&#xff08;一&#xff09;例。 目录 一、【例题1】 1、题目描述 2、代码详解 二、【例题2】 1、题目描述 2、代码详解 三、【例题3】 1、题目描述 2、代码详解 四、【例题4】 1、题目描述 2、代码详解 一、【例…

深度学习实验十七 优化算法比较

目录 一、优化算法的实验设定 1.1 2D可视化实验&#xff08;被优化函数为&#xff09; 1.2 简单拟合实验 二、学习率调整 2.1 AdaGrad算法 2.2 RMSprop算法 三、梯度修正估计 3.1 动量法 3.2 Adam算法 四、被优化函数变为的2D可视化 五、不同优化器的3D可视化对比 …

【计算机组成1】计算机系统

一、计算机的发展 1、计算机硬件的发展 第一代计算机(1946— 1957 年 )——电子管时代。 第二代计算机(1958 — 1964年)——晶体管时代 第三代计算机(1965— 197 1 年) ——中小规模集成电路时代 第四代计算机(1972年至今)——超大规模集成电路时代 计算机硬件的发展就是逻辑元…

指南: 如何在 MEV 项目中使用 Yul

这对我来说是一个反复出现的故事。我学习了一些 Solidity&#xff0c;发现了一个我想要研究的服务。代码看起来是这样的&#xff1a; Seaport Core: BasicOrderFulfiller.sol Solidity 代码在哪里&#xff1f;人们似乎不再使用普通的 Solidity 代码了 &#x1f972; 这种在智能…

每日十题八股-2024年12月19日

1.Bean注入和xml注入最终得到了相同的效果&#xff0c;它们在底层是怎样做的&#xff1f; 2.Spring给我们提供了很多扩展点&#xff0c;这些有了解吗&#xff1f; 3.MVC分层介绍一下&#xff1f; 4.了解SpringMVC的处理流程吗&#xff1f; 5.Handlermapping 和 handleradapter有…

kkfileview代理配置,Vue对接kkfileview实现图片word、excel、pdf预览

kkfileview部署 官网&#xff1a;https://kkfileview.keking.cn/zh-cn/docs/production.html 这个是官网部署网址&#xff0c;这里推荐大家使用docker镜像部署&#xff0c;因为我是直接找运维部署的&#xff0c;所以这里我就不多说明了&#xff0c;主要说下nginx代理配置&am…

SQL语句整理五-StarRocks

文章目录 查看版本号&#xff1a;SPLIT&#xff1a;insert 和 update 结合 select&#xff1a;报错&#xff1a;1064 - StarRocks planner use long time 3000 ms in memo phase&#xff1a;字段增删改&#xff1a; 查看版本号&#xff1a; select current_version(); current…

使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动

使用Turtle库实现&#xff0c;鼠标左键绘制路径&#xff0c;用鼠标右键结束绘制&#xff0c;小海龟并沿路径移动 Turtle库是Python标准库的一部分&#xff0c;它提供了一种基于命令的图形绘制方式。Turtle模块通过一个“海龟”&#xff08;Turtle&#xff09;对象在屏幕上移动…

centos-stream9系统安装docker

如果之前安装过docker需要删除之前的。 sudo dnf -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安装yum-utils工具&#xff1a; dnf -y install yum-utils dnf-plugin…

Spark优化----Spark 数据倾斜

目录 数据倾斜的表现&#xff1a; 定位数据倾斜问题&#xff1a; 解决方案一&#xff1a;聚合原数据 避免 shuffle 过程 缩小 key 粒度&#xff08;增大数据倾斜可能性&#xff0c;降低每个 task 的数据量&#xff09; 增大 key 粒度&#xff08;减小数据倾斜可能性&#xff0c…

视频点播系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

从想法到实践:Excel 转 PPT 应用的诞生之旅

2024 年 11 月&#xff0c;我着手开发了一款exe应用&#xff0c;其主要功能是读取 Excel 文件中的数据&#xff0c;并生成 PPT 文件。 这款应用看似简单&#xff0c;却给我的商业认知带来了深刻的启发。此前&#xff0c;我与一位老师合作&#xff0c;为其处理 Excel 转 PPT 的…

LabVIEW深海气密采水器测控系统

LabVIEW的深海气密采水器测控系统通过高性价比的硬件选择与自主开发的软件&#xff0c;实现了高精度的温度、盐度和深度测量&#xff0c;并在实际海上试验中得到了有效验证。 项目背景 深海气密采水器是进行海底科学研究的关键工具&#xff0c;用LabVIEW开发了一套测控系统&am…

Fastdfs V6.12.1集群部署(arm/x86均可用)

文章目录 一、 Fastdfs 介绍二、部署 信息三、步骤tracker/storage 机器的 compose 内容storage 机器的 composetracker 与 storage 启动目录层级与配置文件测试测试集群扩容与缩减注意事项 一、 Fastdfs 介绍 FastDFS 是一款高性能的分布式文件系统&#xff0c;特别适合用于存…

使用Miniforge构建数据科学环境

一、背景 最近&#xff0c;有不少公司因为员工在工作电脑上安装和使用Anaconda和Miniconda存在商业风险而禁用这两个软件&#xff0c;员工需要找到一个替代方案&#xff0c;Miniforge成为首选&#xff08;对习惯使用conda管理python环境的同学&#xff09; 但实际安装过程中&…