MyBatis关联映射深度解析

Alt

文章目录

    • 关联映射基础
      • 一对一关联映射
      • 一对多关联映射
      • 多对多关联映射
    • 延迟加载
      • 如何配置延迟加载
    • 结语

🎈个人主页:程序员 小侯
🎐CSDN新晋作者
🎉欢迎 👍点赞✍评论⭐收藏
✨收录专栏:MyBatis
✨文章内容:映射
🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗

MyBatis作为一款强大的Java持久层框架,提供了丰富的关联映射功能,使得处理数据库中的关联关系变得更加容易。在本文中,我们将深入研究如何在MyBatis中进行关联映射,并详细解释一对一、一对多和多对多的关联映射。此外,我们还将介绍MyBatis中的延迟加载,以及如何进行配置。

关联映射基础

在MyBatis中,关联映射通过嵌套查询和嵌套结果映射来实现。以下是一个简单的例子,展示了如何在MyBatis中进行一对一的关联映射。

一对一关联映射

<!-- AuthorMapper.xml -->
<mapper namespace="com.example.AuthorMapper">
    <resultMap id="authorMap" type="Author">
        <id property="id" column="author_id" />
        <result property="name" column="author_name" />
        <result property="bio" column="author_bio" />
        <!-- 嵌套查询 -->
        <select property="address" column="author_address_id" resultMap="com.example.AddressMapper.addressMap"/>
    </resultMap>

    <select id="getAuthorWithAddress" resultMap="authorMap">
        SELECT
            a.id AS author_id,
            a.name AS author_name,
            a.bio AS author_bio,
            a.address_id AS author_address_id
        FROM authors a
        WHERE a.id = #{id}
    </select>
</mapper>

在这个例子中,我们定义了一个authorMap的结果映射,其中通过<select>元素进行了嵌套查询,实现了一对一的关联映射。getAuthorWithAddress方法通过调用这个嵌套查询来获取作者和地址的关联信息。

一对多关联映射

一对多关联映射通常涉及到集合的使用,以下是一个例子:

<!-- BlogMapper.xml -->
<mapper namespace="com.example.BlogMapper">
    <resultMap id="blogMap" type="Blog">
        <id property="id" column="blog_id" />
        <result property="title" column="blog_title" />
        <result property="content" column="blog_content" />
        <!-- 嵌套结果映射 -->
        <collection property="comments" ofType="Comment" resultMap="com.example.CommentMapper.commentMap"/>
    </resultMap>

    <select id="getBlogWithComments" resultMap="blogMap">
        SELECT
            b.id AS blog_id,
            b.title AS blog_title,
            b.content AS blog_content,
            c.id AS comment_id,
            c.content AS comment_content
        FROM blogs b
        LEFT JOIN comments c ON b.id = c.blog_id
        WHERE b.id = #{id}
    </select>
</mapper>

在这个例子中,blogMap中使用了<collection>元素进行了嵌套结果映射,实现了一对多的关联映射。getBlogWithComments方法通过调用这个嵌套查询来获取博客和其评论的关联信息。

多对多关联映射

多对多关联映射通常涉及到两个集合的使用,以下是一个例子:

<!-- StudentMapper.xml -->
<mapper namespace="com.example.StudentMapper">
    <resultMap id="studentMap" type="Student">
        <id property="id" column="student_id" />
        <result property="name" column="student_name" />
        <!-- 嵌套集合 -->
        <collection property="courses" ofType="Course" resultMap="com.example.CourseMapper.courseMap"/>
    </resultMap>

    <select id="getStudentWithCourses" resultMap="studentMap">
        SELECT
            s.id AS student_id,
            s.name AS student_name,
            c.id AS course_id,
            c.name AS course_name
        FROM students s
        LEFT JOIN student_courses sc ON s.id = sc.student_id
        LEFT JOIN courses c ON sc.course_id = c.id
        WHERE s.id = #{id}
    </select>
</mapper>

在这个例子中,studentMap中使用了<collection>元素进行了嵌套集合,实现了多对多的关联映射。getStudentWithCourses方法通过调用这个嵌套查询来获取学生和其课程的关联信息。

延迟加载

MyBatis中的延迟加载是一项非常有用的特性,它允许在需要时再加载关联对象,而不是在查询主对象时就立即加载关联对象。这对于提高性能和减少不必要的数据库查询非常有帮助。

如何配置延迟加载

在MyBatis中,延迟加载可以通过lazyLoadingEnabledaggressiveLazyLoading等配置来实现。以下是一个简单的例子:

<!-- MyBatis配置文件 -->
<configuration>
    <settings>
        <!-- 启用延迟加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 激进的延迟加载,仅对嵌套查询有效 -->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
</configuration>

在这个例子中,我们通过配置文件启用了延迟加载,并设置了是否使用激进的延迟加载。激进的延迟加载仅对嵌套查询有效,如果设置为true,则在加载主对象时会立即加载关联对象。

结语

MyBatis的关联映射提供了灵活而强大的功能,使得处理数据库中的关联关系变得更加容易。通过嵌套查询和嵌套结果映射,我们能够轻松实现一对一、一对多和多对多的关联映射。同时,延迟加载的特性能够有效提高性能,减少不必要的数据库查询。在实际项目中,根据具体的业务需求和性能优化的要求,合理使用关联映射和延迟加载将对数据库操作产生积极的影响。

后记 👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

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

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

相关文章

如何在 Linux 上部署 RabbitMQ

如何在 Linux 上部署 RabbitMQ 文章目录 如何在 Linux 上部署 RabbitMQ安装 Erlang从预构建的二进制包安装从源代码编译 Erlang RabbitMQ 的安装使用 RabbitMQ Assistant 连接 RabbitMQ Assistant 是一款优秀的RabbitMQ 可视化管理工具&#xff0c;提供丰富的管理功能。下载地址…

【python】OpenCV—Rectangle, Circle, Selective Search(1.2)

文章目录 1 画框画圈1.1 画矩形框1.2 画圆 / 点1.3 椭圆 2 Selective Search3 Resize 1 画框画圈 1.1 画矩形框 # Copy the image img_rgb_copy img_rgb.copy()# Draw a rectangle cv2.rectangle(img_rgb_copy, pt1 (405, 90), pt2 (740, 510),color (255, 0, 0), thickne…

hash路由模式

hash模式 hash模式是一种把前端路由的路径用井号 # 拼接在浏览器 URL 后面的模式。 一个完整的 URL 包括&#xff1a;协议、域名、端口、虚拟目录、文件名、参数、锚。 https://www.wangyuegyq.top/utils/index.html?name123&phone123#home协议&#xff1a;https域名&am…

关于400G光模块的常见问题解答

最近在后台收到了很多用户咨询关于400G光模块的信息&#xff0c;那400G光模块作为当下主流的光模块类型&#xff0c;有哪些问题是备受关注的呢&#xff1f;下面来看看小易的详细解答&#xff01; 1、什么是400G QSFP-DD光模块&#xff1f; 答&#xff1a;400G光模块是指传输速…

《011.SpringBoot之餐厅点餐系统》

《011.SpringBoot之餐厅点餐系统》【界面简洁功能简单】 项目简介 需要源码及数据库的私信… [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatisPlus; 前台&#xff1a;Layuivue; …

如何批量在文件名中加标点符号?

如何批量在文件名中加标点符号&#xff1f;标点符号在文件名中的作用通常是用来分隔不同部分的内容&#xff0c;或者用来表示特定的含义。例如&#xff0c;下划线"_" 可以用来连接文件名的不同部分&#xff0c;使得文件名更易于阅读和理解。另外&#xff0c;使用连字…

苏宁API:一键搜索,海量商品任你选!

使用苏宁API按关键字搜索商品&#xff0c;可以在API的搜索参数中设置关键字。 例如&#xff0c;在搜索商品时&#xff0c;可以在API的请求参数中设置q关键字。例如&#xff0c;要搜索“鞋子”&#xff0c;可以将q设置为“鞋子”。 另外&#xff0c;还可以设置其他的搜索参数&…

九、Nacos集群搭建

Nacos集群搭建 1.集群结构图 官方给出的Nacos集群图&#xff1a; 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。 我们计划的集群结构&#xff1a; 三个nacos节点的地址&#xff1a; 节点ipportnacos1192.168.150.18845n…

八、Nacos配置管理(统一配置管理、配置热更新、配置共享)

目录 一、新增配置 二、配置的获取 三、配置自动刷新 3、实现配置的热更新 方式一&#xff1a;在controller上添加注解&#xff0c;并重启服务 方式二&#xff1a;使用configuration注解 四、多环境配置共享 五、多环境配置优先级 一、新增配置 配置创建成功 二、配置的…

所有社区工作者!能救一个是一个

救命啊&#xff0c;这东西我怎么早不知道呢&#xff01; 社区人到年底了各种要写的东西很烦啊&#xff01;突然看到这个&#xff0c;真的救我大命了啊&#xff01; 谁懂啊&#xff1f;&#xff01;&#xff01;平时写个东西起码两三天&#xff0c;试了一下这东西&#xff01;…

CDR最新CorelDRAWX8安装步骤教程

CorelDRAW Graphics Suite非凡的设计能力广泛地应用于商标设计、标志制作、模型绘制、插图描画、排版及分色输出等等诸多领域。作为一个强大的绘图软件&#xff0c;它被喜爱的程度可用事实说明&#xff1a;用作商业设计和美术设计的PC机几乎都安装了 。CorelDRAW让您轻松应对创…

LeetCode(22)N 字形变换【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; N 字形变换 1.题目 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a; P A …

硬链接和软链接的区别

硬链接&#xff1a; 硬链接指向计数器&#xff0c;计数器指向原始文件&#xff0c;计数器标记使用的链接的数量 软链接&#xff1a; 软链接是指向硬链接的链接&#xff0c;软链接是绝对地址&#xff0c;软链接也叫符号链接&#xff1b;软链接创建后计数器的值不会变&#xff…

sqli-labs(Less-4) extractvalue闯关

extractvalue() - Xpath类型函数 1. 确认注入点如何闭合的方式 2. 爆出当前数据库的库名 http://127.0.0.1/sqlilabs/Less-4/?id1") and extractvalue(1,concat(~,(select database()))) --3. 爆出当前数据库的表名 http://127.0.0.1/sqlilabs/Less-4/?id1") …

一言成文大模型:大模型实践落地之路

百度CEO&#xff0c;李彦宏指出、深度学习技术&#xff0c;大语言模型具备了理解、生成、逻辑、记忆等人工智能的核心基础能力&#xff0c;为通用人工智能带来曙光。 元宇宙_一言成文大模型 一言成文大模型&#xff1a;大模型实践落地之路

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏2(附项目源码)

文章目录 先看本次实现的最终效果前言敌人生命值扣血测试&#xff0c;敌人死亡控制敌人动画敌人死亡动画敌人转向问题源码完结 先看本次实现的最终效果 前言 本期紧接着上一篇&#xff0c;主要内容是实现本期主要内容是实现敌人血条、动画和行为逻辑。 敌人生命值 绘制血条U…

15 万奖金!开放原子开源大赛OpenAnolis 赛题@你报名

8 月 29 日&#xff0c;2023 开源和信息消费大赛新闻发布会在北京召开&#xff0c;首届“开放原子开源大赛”正式启动报名。大赛由工业和信息化部、江苏省人民政府、湖南省人民政府共同主办&#xff0c;开源赛道拟由开放原子开源基金会、央视网、江苏省工业和信息化厅、无锡市人…

掌握这个技巧,你也能成为资产管理高手!

资产管理是企业管理中至关重要的一环&#xff0c;涉及到对公司财务、物资和信息等各个方面的有效监控和管理。 随着企业规模的扩大和业务复杂性的增加&#xff0c;采用先进的资产管理系统成为确保企业高效运营的必要条件之一。 客户案例 医疗机构 温州某医疗机构拥有大量的医…

超越传统:明懿金汇定义现代金融服务

量化交易的新纪元&#xff1a;明懿金汇引领创新浪潮 在数字化时代的飞速发展下&#xff0c;明懿金汇凭借其独特的跟单平台和卓越的金融服务&#xff0c;成为互联网金融行业的佼佼者。自2020年起&#xff0c;公司重点投资于互联网金融行业&#xff0c;并通过与国内知名证券软件开…

xxl-job配置须知

执行器也有自己的一个接口等 配置xxl-job YAML xxl:job:admin:addresses: http://localhost:8080/xxl-job-admin/executor:appname: media-process-serviceaddress:ip:port: 9999logpath: /data/applogs/xxl-job/jobhandlerlogretentiondays: 30accessToken: default_token--…