news 2026/4/23 11:34:23

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/4/23 12:57:30

数据库日期类型字段兼容性选择

一、问题背景与重要性1.1 跨数据库兼容性的现实需求在当今的软件开发环境中&#xff0c;跨数据库兼容性已成为许多项目的硬性要求。企业级应用可能面临以下场景&#xff1a;多客户部署&#xff1a;为不同客户部署时&#xff0c;客户可能使用不同的数据库系统云原生策略&#xf…

作者头像 李华
网站建设 2026/4/12 11:34:45

模型持久化(二):从 KingbaseES 加载模型,实现离线预测

模型持久化&#xff08;二&#xff09;&#xff1a;从 KingbaseES 加载模型&#xff0c;实现离线预测 ——别再让模型“睡在库房”&#xff0c;它该上生产线了 大家好&#xff0c;我是那个总在凌晨被叫醒、因为线上预测服务挂了&#xff0c;又不得不手动从 KES 里捞出模型临时…

作者头像 李华
网站建设 2026/4/23 11:33:04

AI写教材必备工具!快速生成低查重教材,节省大量时间精力!

利用 AI 工具高效编写教材 在编写教材的过程中&#xff0c;我总能把握住其中的“慢节奏”&#xff0c;时常面临各种难题。虽然框架和资料都准备得差不多&#xff0c;却总在内容撰写上陷入困境——一句话反复琢磨半小时&#xff0c;始终觉得不够合适&#xff1b;章节间的衔接问…

作者头像 李华
网站建设 2026/4/23 13:10:49

逻辑运算(C++): 从入门到精通,轻松应对各类考试真题

C 逻辑运算&#xff1a;从入门到精通&#xff0c;轻松应对各类考试真题 C 中的逻辑运算符是考试和面试中出现频率极高的部分&#xff0c;尤其是选择题、填空题、程序阅读题、程序填空题、判断题&#xff0c;几乎每套试卷都会涉及。 下面按照从基础到高阶的顺序系统讲解&#…

作者头像 李华
网站建设 2026/4/12 1:32:14

从此告别拖延,AI论文工具 千笔ai写作 VS 笔捷Ai,本科生专属神器!

随着人工智能技术的迅猛发展&#xff0c;AI辅助写作工具已逐渐成为高校学生完成毕业论文的重要帮手。从开题报告到文献综述&#xff0c;从框架搭建到内容生成&#xff0c;越来越多的学生开始借助AI工具提升写作效率、降低学术压力。然而&#xff0c;面对市场上功能各异、质量参…

作者头像 李华
网站建设 2026/4/23 13:11:25

摆脱论文困扰! 10个降AIGC工具测评:自考降AI率必备神器

在当今学术写作日益依赖AI技术的背景下&#xff0c;论文的AIGC率问题成为了自考学生和研究者不得不面对的挑战。无论是初稿撰写还是最终定稿&#xff0c;如何有效降低AI痕迹、避免查重率过高&#xff0c;已经成为一项关键技能。而随着AI降重工具的不断成熟&#xff0c;越来越多…

作者头像 李华