news 2026/6/12 6:28:18

HoRain云--MyBatis关联映射全解析:轻松掌握数据库关系

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--MyBatis关联映射全解析:轻松掌握数据库关系

🎬 HoRain 云小助手:个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

目录

⛳️ 推荐

🔎 三种关联关系的实现

1. 一对一映射

2. 一对多映射

3. 多对多映射

⚖️ 两种策略对比与性能考量

💡 实践建议


MyBatis的关联关系映射是其最强大的特性之一,它能将数据库中的表关联关系优雅地映射到Java对象模型上。下面通过一个表格和详细说明来帮你全面掌握这个概念。

关联类型

适用场景

MyBatis 标签

Java 属性类型

关键属性

一对一​ (1:1)

一个人对应一个身份证

<association>

单个复杂对象

property,javaType

一对多​ (1:N)

一个部门对应多个员工

<collection>

集合 (如List)

property,ofType

多对多​ (N:N)

一个学生对应多门课程,一门课程对应多个学生

<collection>(需中间表)

集合 (如List)

property,ofType

🔎 三种关联关系的实现

1. 一对一映射

一对一关系很常见,比如一个人(Person)对应一张身份证(IdCard)。在MyBatis中,使用<association>标签来处理,主要有两种实现方式。

2. 一对多映射

一对多关系也很普遍,比如一个用户(User)有多个订单(Order)。这时需要使用<collection>标签 。

<resultMap id="UserResultMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <!-- 使用 collection 映射一对多关系,ofType 指定集合中元素的类型 --> <collection property="ordersList" ofType="Order"> <id property="id" column="order_id"/> <result property="number" column="order_number"/> </collection> </resultMap> <select id="selectUserWithOrders" resultMap="UserResultMap"> SELECT u.id, u.username, o.id as order_id, o.number as order_number FROM user u LEFT JOIN orders o ON u.id = o.user_id WHERE u.id = #{id} </select>

对应的Java类如下:

public class User { private Integer id; private String username; private List<Order> ordersList; // 一对多关系,使用集合 // ... getters and setters }
3. 多对多映射

多对多关系(如订单和商品)需要通过一个中间表来维护。在映射时,本质上可以看作是两个一对多关系的组合,因此仍然使用<collection>标签 。

<resultMap id="OrderResultMap" type="Order"> <id property="id" column="id"/> <result property="number" column="number"/> <!-- 通过中间表关联到商品 --> <collection property="productList" ofType="Product"> <id property="id" column="product_id"/> <result property="name" column="product_name"/> <result property="price" column="price"/> </collection> </resultMap> <select id="selectOrderWithProducts" resultMap="OrderResultMap"> SELECT o.id, o.number, p.id as product_id, p.name as product_name, p.price FROM orders o LEFT JOIN order_item oi ON o.id = oi.order_id -- 通过中间表关联 LEFT JOIN product p ON oi.product_id = p.id -- 关联到商品表 WHERE o.id = #{id} </select>

⚖️ 两种策略对比与性能考量

嵌套结果映射和嵌套查询两种策略各有优劣,是理解和优化MyBatis关联查询的关键 。

特性

嵌套结果映射

嵌套查询

SQL数量

1条(多表JOIN)

N+1条(1条主查询 + N条关联查询)

性能

(网络开销小)

潜在风险(可能引发N+1查询问题)

代码复杂度

SQL较复杂

SQL简单,配置清晰

延迟加载

不支持

支持,可有效缓解N+1问题

N+1查询问题是嵌套查询模式的主要风险。当查询一个用户列表(返回N条记录)时,如果立即加载每个用户的订单,就会产生1(查询用户)+ N(查询每个用户的订单)条SQL语句,对数据库造成巨大压力 。

解决方案是启用延迟加载。在MyBatis配置文件中(mybatis-config.xml)进行如下设置:

<settings> <!-- 开启延迟加载 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 按需加载,避免加载所有关联对象 --> <setting name="aggressiveLazyLoading" value="false"/> </settings>

开启后,关联对象(如订单)只有在代码真正访问它(如调用user.getOrdersList())时才会被查询,从而避免不必要的数据库访问 。

💡 实践建议

  1. 首选嵌套结果映射:对于关联数据量不大、且需要立即使用的场景,优先使用嵌套结果映射(JOIN查询)以获得最佳性能 。

  2. 善用延迟加载:对于关联数据量大、或不是每次都需要的场景(如查询用户基本信息时不一定需要他的订单列表),使用嵌套查询并开启延迟加载 。

  3. 注意列名别名:在多表JOIN时,如果不同表有相同列名(如id),务必使用别名(AS)区分,否则会导致映射错误 。

  4. 考虑使用注解:对于简单的关联映射,可以使用@Results@One@Many等注解在Mapper接口上直接配置,使代码更简洁 。

希望这份详细的解释能帮助你更好地理解和应用MyBatis的关联映射。如果你在实际编码中遇到具体问题,比如某个配置不生效,我很乐意帮你进一步分析。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 13:09:49

摆脱论文困扰!千笔,王者级的降AI率平台

在AI技术深度渗透学术写作的今天&#xff0c;越来越多的学生开始借助AI工具提升论文撰写效率。然而&#xff0c;随着知网、维普、万方等查重系统对AI生成内容的识别能力不断提升&#xff0c;以及Turnitin等国际平台对AIGC&#xff08;人工智能生成内容&#xff09;的严格审查&a…

作者头像 李华
网站建设 2026/6/8 20:16:12

告别论文焦虑!百考通AI:你的12000字本科毕业论文智能写作伙伴

对于每一位本科生而言&#xff0c;毕业论文都是一场必须通过的历练。从令人头疼的选题开题&#xff0c;到浩如烟海的文献搜集&#xff0c;再到长达万字的填充撰写&#xff0c;以及最后繁琐的格式调整与查重降重&#xff0c;每一个环节都足以消耗大量的时间和心力。你是否也曾在…

作者头像 李华
网站建设 2026/6/9 23:50:02

百考通AI PPT:用技术告别熬夜,让每一场汇报都专业出彩

你是否也有过这样的经历&#xff1a;为了准备一份开题报告或年终总结的PPT&#xff0c;四处搜寻模板、反复调整格式、熬夜填充内容&#xff0c;整个周末都被吞噬其中&#xff1f;PPT作为学习、工作和学术汇报中最常使用的工具&#xff0c;本应是高效表达的利器&#xff0c;却往…

作者头像 李华
网站建设 2026/6/10 15:40:52

AI写论文权威推荐!4款AI论文生成工具,提升你的论文撰写效率!

你还在为写期刊论文而烦恼吗&#xff1f;面对繁杂的文献、各式各样的格式要求&#xff0c;再加上反复的修订&#xff0c;许多学者都觉得效率低下是常态。不过不用害怕&#xff0c;接下来要给大家推荐的四款AI论文写作工具&#xff0c;经过真实测试&#xff0c;能够从论文文献的…

作者头像 李华
网站建设 2026/6/5 10:40:56

低查重AI教材编写秘籍!专业工具,让教材生成更简单!

编写教材需要依靠大量资料&#xff0c;但传统的资料整合方式已经无法满足现今的需求。过去&#xff0c;从课程标准、学术论文到教学案例&#xff0c;这些信息分散在不同的渠道上&#xff0c;如知网和教研平台&#xff0c;筛选有用信息往往耗时数天。即使资料收集齐全&#xff0…

作者头像 李华