news 2026/2/2 10:56:27

HoRain云--MyBatis关联映射全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--MyBatis关联映射全解析

🎬 HoRain 云小助手:个人主页

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


⛳️ 推荐

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

目录

⛳️ 推荐

MyBatis关联关系映射详解

一、关联映射概述

二、一对一(1:1)映射

场景示例

实现方式一:嵌套结果映射(多表连接)

实现方式二:嵌套查询(子查询)

Java实体类示例

三、一对多(1:N)映射

场景示例

实现方式

Java实体类示例

四、多对一(N:1)映射

场景示例

实现方式

Java实体类示例

五、多对多(N:N)映射

场景示例

实现方式

Java实体类示例

六、最佳实践和注意事项

1. 避免N+1查询问题

2. 合理选择映射方式

3. 使用驼峰命名转换

4. 复杂查询的优化

七、总结


MyBatis关联关系映射详解

在实际开发中,数据库表之间通常存在复杂的关联关系。MyBatis通过<resultMap>提供了强大的对象关系映射能力,支持一对一(1:1)、一对多(1:N)、多对一(N:1)和多对多(N:N)四种经典关系的映射。本文将结合代码示例,系统讲解各种关联关系的实现方式。

一、关联映射概述

在关系型数据库中,表与表之间存在三种基本关联关系:

MyBatis实现关联关系映射主要有两种方式:多表连接子查询

二、一对一(1:1)映射

场景示例

实现方式一:嵌套结果映射(多表连接)

<!-- UserMapper.xml --> <resultMap id="userWithIdCard" type="User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <!-- 一对一关联 --> <association property="idCard" javaType="IdCard"> <id property="id" column="card_id"/> <result property="number" column="card_number"/> </association> </resultMap> <select id="selectUserWithIdCard" resultMap="userWithIdCard"> SELECT u.user_id, u.username, c.card_id, c.card_number FROM user u LEFT JOIN id_card c ON u.user_id = c.user_id WHERE u.user_id = #{id} </select>

实现方式二:嵌套查询(子查询)

<resultMap id="userWithIdCard2" type="User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <!-- 通过执行另一个SQL映射语句来返回预期的复杂类型 --> <association property="idCard" column="card_id" select="com.example.mapper.IdCardMapper.selectById"/> </resultMap> <select id="selectUserWithIdCard2" resultMap="userWithIdCard2"> SELECT * FROM user WHERE user_id = #{id} </select>

Java实体类示例

// User.java public class User { private Integer id; private String username; private IdCard idCard; // 一对一关联属性 // getter和setter方法... } // IdCard.java public class IdCard { private Integer id; private String number; // getter和setter方法... }

三、一对多(1:N)映射

场景示例

实现方式

<!-- UserMapper.xml --> <resultMap id="userWithRoles" type="User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <!-- 一对多关联,使用collection标签 --> <collection property="roles" ofType="Role"> <id property="id" column="role_id"/> <result property="name" column="role_name"/> </collection> </resultMap> <select id="selectUserWithRoles" resultMap="userWithRoles"> SELECT u.user_id, u.username, r.role_id, r.role_name FROM user u LEFT JOIN user_role ur ON u.user_id = ur.user_id LEFT JOIN role r ON ur.role_id = r.role_id WHERE u.user_id = #{id} </select>

Java实体类示例

// User.java public class User { private String id; private String username; private List<Role> roles; // 一对多关联属性 // getter和setter方法... } // Role.java public class Role { private String id; private String name; // getter和setter方法... }

四、多对一(N:1)映射

场景示例

实现方式

<!-- StudentMapper.xml --> <resultMap id="studentWithClass" type="Student"> <id property="id" column="student_id"/> <result property="name" column="student_name"/> <!-- 多对一关联,使用association标签 --> <association property="clazz" javaType="Class"> <id property="id" column="class_id"/> <result property="name" column="class_name"/> </association> </resultMap> <select id="selectStudentWithClass" resultMap="studentWithClass"> SELECT s.student_id, s.student_name, c.class_id, c.class_name FROM student s LEFT JOIN class c ON s.class_id = c.class_id WHERE s.student_id = #{id} </select>

Java实体类示例

// Student.java public class Student { private Integer id; private String name; private Class clazz; // 多对一关联属性 // getter和setter方法... } // Class.java public class Class { private Integer id; private String name; // getter和setter方法... }

五、多对多(N:N)映射

场景示例

实现方式

多对多关系通常通过一个**关联表(中间表)**来实现。

<!-- StudentMapper.xml --> <resultMap id="studentWithCourses" type="Student"> <id property="id" column="student_id"/> <result property="name" column="student_name"/> <!-- 多对多关联,使用collection标签 --> <collection property="courses" ofType="Course"> <id property="id" column="course_id"/> <result property="name" column="course_name"/> </collection> </resultMap> <select id="selectStudentWithCourses" resultMap="studentWithCourses"> SELECT s.student_id, s.student_name, c.course_id, c.course_name FROM student s LEFT JOIN student_course sc ON s.student_id = sc.student_id LEFT JOIN course c ON sc.course_id = c.course_id WHERE s.student_id = #{id} </select>

Java实体类示例

// Student.java public class Student { private Integer id; private String name; private List<Course> courses; // 多对多关联属性 // getter和setter方法... } // Course.java public class Course { private Integer id; private String name; // getter和setter方法... }

六、最佳实践和注意事项

1. 避免N+1查询问题

在使用嵌套查询(子查询)方式时,容易产生N+1查询问题。例如,查询10个用户及其角色,会先执行1次查询用户,然后对每个用户再执行1次查询角色的SQL,总共11次查询。

解决方案

2. 合理选择映射方式

3. 使用驼峰命名转换

在MyBatis配置文件中开启驼峰命名转换,可以简化映射配置:

<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>

4. 复杂查询的优化

对于复杂的关联查询,可以考虑:

七、总结

MyBatis的关联映射功能为开发者提供了强大的数据访问层支持。通过<resultMap><association><collection>标签,可以灵活地处理各种复杂的对象关系映射。在实际开发中,应根据具体业务场景选择合适的映射方式,并注意性能优化,以构建高效、稳定的数据访问层。

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

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

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

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

【计算机毕业设计案例】基于SSM框架的教学管理系统基于SSM的专业课程教学过程管理系统(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/2 10:53:29

SEW变频器MCF40A0750-503-4-0T 08274398

SEW 变频器 MCF40A0750-503-4-0T 08274398 详细介绍 1. 概述与产品定位 SEW MCF40A0750-503-4-0T (序列号 08274398) 是 SEW-EURODRIVE 公司生产的 MOVIFLEX MCF40A 系列 中的一款通用型变频器。MOVIFLEX 是 SEW 旗下的变频器品牌&#xff0c;以其高性能、可靠性和灵活性在工…

作者头像 李华
网站建设 2026/2/2 10:49:25

SXW-300微机控制钢绞线松弛试验机

SXW-300微机控制钢绞线松弛试验机一、产品简介SXW-300微机控制钢绞线松弛试验机在设计过程中&#xff0c;吸收了德国、意大利等著名松弛试验机公司的设计理念和结构特点&#xff0c;并依据钢绞线松弛试验的相关国家标准研制而成的&#xff0c;专用于钢绞线、镀锌钢丝及螺纹钢筋…

作者头像 李华
网站建设 2026/2/2 10:46:08

告别内卷!2026 程序员转行方向推荐:高薪赛道 + 技能提升手册

对于程序员转行方向的推荐&#xff0c;可以基于当前的技术趋势、市场需求以及程序员的个人技能和兴趣来综合考虑。以下是一些推荐的转行方向&#xff1a; 伴随着社会的发展&#xff0c;网络安全被列为国家安全战略的一部分&#xff0c;因此越来越多的行业开始迫切需要网安人员&…

作者头像 李华
网站建设 2026/2/2 10:44:48

最新2025年政府产业引导基金数据

最新2025年政府产业引导基金数据 数据一共七万多条 包括以下字段信息&#xff1a;所属省 所属市 被投资企业 政府机关 政府机关持股投资机构的比例 政府机关持股投资机构的路径 基金简称 基金代码 负责人类型 负责人名称 投资机构 投资机构持股投资企业的比例 完整图谱 所属省…

作者头像 李华
网站建设 2026/2/2 10:42:38

【小程序毕设全套源码+文档】基于springboot+协同过滤算法的音乐推荐系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华