MyBatis(14)MyBatis 如何实现多对一和一对多的映射关系

MyBatis 中实现多对一和一对多的映射主要依赖于映射文件中的 <association><collection> 标签。这两种映射关系的实现,是通过嵌套查询或嵌套结果映射来完成的。在源码层面,MyBatis 使用相应的处理器来处理这些标签,最终实现复杂关系对象的装配。

多对一映射(Association)

多对一映射通常用于关联查询中的“多”的一端关联到“一”的一端的情形。在MyBatis中,可以通过 <association> 标签来实现。

映射文件配置

假设有订单(Order)和用户(User)两个实体,其中订单属于某一个用户,即多对一的关系。

首先,定义用户和订单的实体类,然后在订单的映射文件中使用 <association> 来映射用户信息:

<mapper namespace="com.example.OrderMapper"><resultMap id="OrderResultMap" type="Order"><id column="order_id" property="id"/><result column="order_number" property="orderNumber"/><result column="order_date" property="orderDate"/><association property="user" javaType="User"><id column="user_id" property="id"/><result column="username" property="username"/><result column="email" property="email"/></association></resultMap><select id="selectOrderById" resultMap="OrderResultMap">SELECT o.order_id, o.order_number, o.order_date,u.user_id, u.username, u.emailFROM orders oJOIN users u ON o.user_id = u.user_idWHERE o.order_id = #{id}</select>
</mapper>

在上面的示例中,<association> 标签用于映射订单到用户的多对一关系。property 属性指定了目标对象中的属性名,而 javaType 属性指定了关联对象的类型。

源码解析

在解析 <association> 标签时,MyBatis 将创建一个 ResultMapping 对象来存储与关联有关的元数据。解析过程主要由 XMLMapperBuilderResultMapResolver 完成。

当执行查询时,MyBatis 调用 DefaultResultSetHandler 类来处理结果集。如果存在嵌套查询,则可能先执行主查询,然后根据主查询的结果执行嵌套查询。对于嵌套结果映射,MyBatis 会在处理结果集的过程中根据配置直接填充关联的对象。

一对多映射(Collection)

一对多映射通常用于关联查询中的“一”的一端关联到“多”的一端的情形。在MyBatis中,可以通过 <collection> 标签来实现。

映射文件配置

假设用户(User)和订单(Order)之间的关系,用户可以拥有多个订单,即一对多的关系。

在用户的映射文件中使用 <collection> 来映射订单信息:

<mapper namespace="com.example.UserMapper"><resultMap id="UserResultMap" type="User"><id column="user_id" property="id"/><result column="username" property="username"/><result column="email" property="email"/><collection property="orders" ofType="Order"><id column="order_id" property="id"/><result column="order_number" property="orderNumber"/><result column="order_date" property="orderDate"/></collection></resultMap><select id="selectUserWithOrders" resultMap="UserResultMap">SELECT u.user_id, u.username, u.email,o.order_id, o.order_number, o.order_dateFROM users uLEFT JOIN orders o ON u.user_id = o.user_idWHERE u.user_id = #{id}</select>
</mapper>

在上面的示例中,<collection> 标签用于映射用户到订单的一对多关系。property 属性指定了目标对象中的集合属性名,而 ofType 属性指定了集合中元素的类型。

源码解析

<association> 类似,MyBatis 在解析 <collection> 标签时也会创建一个 ResultMapping 对象。解析过程同样主要由 XMLMapperBuilderResultMapResolver 完成。

在执行查询并处理结果集时,MyBatis 使用 DefaultResultSetHandler 类并采用与 <association> 类似的处理逻辑。不同之处在于,MyBatis 会将每条记录映射到子对象中,并将这些子对象收集到父对象的集合属性中,从而实现一对多的关系映射。

总结

MyBatis 通过 <association><collection> 标签提供了强大的关系映射能力,允许开发者以相对简单的方式实现复杂的关系映射。在底层,MyBatis 通过解析配置文件中的映射定义,创建相应的映射和结果处理器来实现这些关系映射。这种方式不仅简化了SQL的编写,还为实现复杂的关系数据提取提供了强有力的支持。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch-6.8.23的集群搭建过程

三个节点的 ElasticSearch 集群搭建步骤 准备三台机器&#xff1a;28.104.87.98、28.104.87.100、28.104.87.101 和 ElasticSearch 的安装包 elasticsearch-6.8.23.tar.gz ----------------------------- 28.104.87.98&#xff0c;使用 root 用户操作 ----------------------…

Java | Leetcode Java题解之第206题反转链表

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode newHead reverseList(head.next);head.next.next head;head.next null;return newHead;} }

SpringBoot学习04-[定制SpringMVC]

定制SpringMVC 定制SpringMvc的自动配置定制springmvc-configurePathMatch配置定制SpringMVC-拦截器Interceptor定制SpringMVC-CORS配置全局cors配置针对某个方法加跨域解决 WebMvcConfigurer原理定制SpringMVC-JSONJSON开发jackson的使用定制化json序列化和反序列化 JSON国际化…

CriticGPT: 用 GPT-4 找出 GPT-4 的错误

CriticGPT 是 OpenAI 发布的一个基于 GPT-4 的模型&#xff0c;它可以帮助我们人类 Review 并纠正 ChatGPT 在生成代码时的错误。使用 CriticGPT 审查代码时&#xff0c;有 60% 的概率生成的代码更好更正确。

最近写javaweb出现的一个小bug---前端利用 form 表单传多项数据,后端 Servlet 取出的各项数据均为空

目录&#xff1a; 一. 问题引入二 解决问题 一. 问题引入 近在写一个 java web 项目时&#xff0c;遇到一个让我头疼了晚上的问题&#xff1a;前端通过 post 提交的 form 表单数据可以传到后端&#xff0c;但当我从 Servlet 中通过 request.getParameter(“name”) 拿取各项数…

【小沐学AI】Python实现语音识别(faster-whisper-webui)

文章目录 1、简介1.1 whisper1.2 faster-whisper 2、安装3、测试结语 1、简介 1.1 whisper https://github.com/openai/whisper Whisper 是一种通用语音识别模型。它是在各种音频的大型数据集上训练的&#xff0c;也是一个多任务模型&#xff0c;可以执行多语言语音识别、语音…

软考初级网络管理员_04_硬件单选题

1.进程是程序的一次执行&#xff0c;()是进程存在的唯一标志。 程序 数据 进程控制块 进程标识符 2.(请作答此空)是计算机内部运算部件一次能同时处理的二进制数据位数。计算机的运行速度使用每秒钟所能执行的()指令数目来评估。 字长 带宽 内存 寄存器 3.某银行的一…

安装ant-design-vue的报错集合

20240629vue版本&#xff1a;4.x vue/cli5.x运行项目报错error Replace xxx with xxx prettier/prettier 解决办法_replace 路路路路路路路路 with 路路路路-CSDN博客 Ant Design 使用出现 Error_ Can‘t resolve ‘_antd_dist_antd.css‘-CSDN博客

【JVM基础篇】垃圾回收

文章目录 垃圾回收常见内存管理方式手动回收&#xff1a;C内存管理自动回收(GC)&#xff1a;Java内存管理自动、手动回收优缺点 应用场景垃圾回收器需要对哪些部分内存进行回收&#xff1f;不需要垃圾回收器回收需要垃圾回收器回收 方法区的回收代码测试手动调用垃圾回收方法Sy…

Matlab|分时电价环境下用户负荷需求响应分析方法

主要内容 本程序复现《分时电价环境下用户负荷需求响应分析方法》文献中的方法&#xff0c;通过用户对不同时间下用电需求的自弹性和交叉弹性系数分析获得用户需求响应矩阵&#xff0c;进而利用该矩阵对用户在实行基于电价的需求侧管理后的负荷变化情况进行快速分析。 1.1…

Linux 文件系统详解:ext4、XFS、Btrfs

1. 引言 Linux 操作系统支持多种文件系统&#xff0c;其中 ext4、XFS 和 Btrfs 是最为常用的三种。它们各自具有独特的特点和优势&#xff0c;适用于不同的使用场景。本文将详细介绍这三种文件系统的概念、结构、使用场景以及常用命令&#xff0c;帮助读者更好地理解和使用这些…

ONLYOFFICE8.1版本桌面编辑器简单测评

ONLYOFFICE官网链接&#xff1a;在线PDF查看器和转换器 | ONLYOFFICE ONLYOFFICE介绍&#xff1a;https://www.onlyoffice.com/zh/office-suite.aspx OnlyOffice 是一款免费且开源的 Office 协作办公套件&#xff0c;支持桌面端和移动端等多平台&#xff0c;由一家领先的 IT 公…

【python】OpenCV—Aruco

文章目录 Detect ArucoGuess Aruco Type Detect Aruco 学习参考来自&#xff1a;OpenCV基础&#xff08;19&#xff09;使用 OpenCV 和 Python 检测 ArUco 标记 更多使用细节可以参考&#xff1a;【python】OpenCV—Color Correction 源码&#xff1a; 链接&#xff1a;http…

在Ubuntu 18.04上安装和配置GitLab的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 GitLab 是一个开源应用程序&#xff0c;主要用于托管 Git 仓库&#xff0c;并提供额外的与开发相关的功能&#xff0c;如问题跟踪…

为什么IP地址会被列入黑名单?

您是否曾经历过网站访客数量骤减或电子邮件投递失败的困扰&#xff1f;这背后或许隐藏着一个常被忽略的原因&#xff1a;您的IP地址可能已经被列入了黑名单内。尽管您并没有进行任何违法的网络操作&#xff0c;但这个问题依然可能出现。那么&#xff0c;究竟黑名单是什么&#…

PostgreSQL 性能优化与调优(六)

1. 索引优化 1.1 创建索引 索引可以显著提高查询性能。创建索引的基本语法如下&#xff1a; CREATE INDEX index_name ON table_name (column_name);例如&#xff0c;为 users 表的 username 列创建索引&#xff1a; CREATE INDEX idx_username ON users (username); 1.2 …

【VMware】VMware 开启的虚拟机无法联网的解决方案

目录 &#x1f30a;1. 问题说明 &#x1f30a;2. 解决方案 &#x1f30d;2.1 查看虚拟网络编辑器 &#x1f30d;2.2 设置 vmnet &#x1f30d;2.3 设置虚拟机网络 &#x1f30d;2.4 Xshell连接虚拟机 &#x1f30a;1. 问题说明 虚拟机 ping 其他网页显示失败,比如&#…

数据质量管理-时效性管理

前情提要 根据GB/T 36344-2018《信息技术 数据质量评价指标》的标准文档&#xff0c;当前数据质量评价指标框架中包含6评价指标&#xff0c;在实际的数据治理过程中&#xff0c;存在一个关联性指标。7个指标中存在4个定性指标&#xff0c;3个定量指标&#xff1b; 定性指标&am…

Linux内存管理--系列文章陆——可执行文件的装载

应届生面试时&#xff0c;经常会有人问程序和进程有什么区别。简单来讲&#xff0c;程序是一个静态物品&#xff0c;就是存放在磁盘上的一些预先编译好的指令和数据的文件。而进程是一种运行的实例&#xff0c;它是程序在操作系统中的一次运行活动&#xff0c;具有生命周期。进…

汇编语言中的内存管理与寻址方式

在计算机科学中&#xff0c;内存管理是确保程序和数据能够高效、安全地存储和访问的关键环节。汇编语言&#xff0c;作为最接近硬件的编程语言&#xff0c;为程序员提供了直接控制内存的能力。 内存管理基础 内存管理涉及到数据如何在内存中存储、访问和操作。在汇编语言层面…