news 2026/8/6 18:58:25

Mybatis的高级映射及延迟加载

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Mybatis的高级映射及延迟加载

MyBatis 的高级映射和延迟加载是优化数据库操作的重要特性,下面为你详细介绍:

一、高级映射

高级映射用于处理复杂的对象关系(如一对一、一对多、多对多),主要通过resultMap实现。

1. 一对一映射

通过association标签实现,适用于实体间的has-one关系。

示例:用户(User)和账户(Account)的一对一关系

<resultMap id="userResultMap"type="User"><id property="id"column="id"/><result property="username"column="username"/><association property="account"javaType="Account"><id property="id"column="account_id"/><result property="balance"column="balance"/></association></resultMap>
2. 一对多映射

通过collection标签实现,适用于实体间的has-many关系。

示例:订单(Order)和订单项(OrderItem)的一对多关系

<resultMap id="orderResultMap"type="Order"><id property="id"column="id"/><result property="orderNo"column="order_no"/><collection property="items"ofType="OrderItem"><id property="id"column="item_id"/><result property="productName"column="product_name"/></collection></resultMap>
3. 多对多映射

通过中间表关联,通常使用collection配合子查询或连接查询实现。

示例:用户(User)和角色(Role)的多对多关系

<resultMap id="userRoleResultMap"type="User"><id property="id"column="id"/><result property="username"column="username"/><collection property="roles"ofType="Role"><id property="id"column="role_id"/><result property="roleName"column="role_name"/></collection></resultMap>

二、延迟加载(Lazy Loading)

延迟加载允许在需要时才加载关联对象,避免一次性加载所有数据,提高性能。

1. 开启延迟加载

mybatis-config.xml中配置:

<settings><settingname="lazyLoadingEnabled"value="true"/><settingname="aggressiveLazyLoading"value="false"/><!-- 按需加载 --></settings>
2. 实现方式
  • 嵌套查询(子查询):通过select属性指定子查询。

    <resultMap id="userResultMap"type="User"><id property="id"column="id"/><result property="username"column="username"/><association property="account"column="id"select="selectAccountByUserId"fetchType="lazy"/><!--显式指定延迟加载--></resultMap><select id="selectAccountByUserId"parameterType="int"resultType="Account">SELECT*FROMaccountWHEREuser_id=#{id}</select>
  • 嵌套结果(连接查询):通过fetchType="lazy"指定延迟加载。

    <resultMap id="userResultMap"type="User"><id property="id"column="id"/><result property="username"column="username"/><association property="account"javaType="Account"fetchType="lazy"><id property="id"column="account_id"/><result property="balance"column="balance"/></association></resultMap>

三、高级映射与延迟加载的配合

通过resultMapfetchType结合,可灵活处理复杂关系的加载时机。

示例:按需加载用户的订单和订单详情

<resultMap id="userWithOrders"type="User"><id property="id"column="id"/><collection property="orders"column="id"select="selectOrdersByUserId"fetchType="lazy"/></resultMap>

四、注意事项

  1. N+1 查询问题:延迟加载可能导致多次查询(主查询 + N 个子查询),可通过<batch>模式或二级缓存优化。
  2. 会话生命周期:延迟加载需确保调用时 SqlSession 未关闭(可使用OpenSessionInView模式)。
  3. 性能权衡:避免过度延迟加载,对频繁访问的关联数据建议立即加载。

五、总结

  • 高级映射:通过resultMap处理复杂关系,支持嵌套查询和嵌套结果。
  • 延迟加载:按需加载关联对象,提升性能,但需注意 N+1 问题。

合理使用这两个特性,可显著优化 MyBatis 的查询效率和代码可维护性。

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

题解:洛谷 P5705 【深基2.例7】数字反转

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…

作者头像 李华
网站建设 2026/8/6 18:57:48

单片机毕设项目:基于 STM32 单片机的室内储物柜体智能化感知与执行系统设计 基于 STM32 单片机的人体感应开门与环境灯光联动系统设计(012002)

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

作者头像 李华
网站建设 2026/8/6 18:56:17

IT项目进度延迟:应对策略与实践指南

一、延迟原因分析是第一步当IT项目出现进度延迟时&#xff0c;项目经理切忌急于“救火”&#xff0c;而应首先系统性地分析延迟原因。常见原因包括需求变更频繁、资源瓶颈、技术复杂度超出预期、关键路径被低估、外部依赖延期&#xff0c;以及沟通不畅导致的返工等。只有准确识…

作者头像 李华
网站建设 2026/8/6 18:54:26

麒麟系统v10共享文件夹给win和统信

linux下应该应有一个类似windows下bat的批处理文件&#xff0c;只要运行就能一键解决各种系统文件、打印共享问题。以下是sh原料&#xff1a;一、麒麟系统默认自带samba二、配置服务器端samba的smb.conf文件输入sudo pluma /etc/samba/smb.conf在下边添加[share] comment kylin…

作者头像 李华
网站建设 2026/8/6 18:51:48

D3KeyHelper终极指南:5分钟掌握暗黑3智能宏配置

D3KeyHelper终极指南&#xff1a;5分钟掌握暗黑3智能宏配置 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专为《暗黑破坏神3》设…

作者头像 李华
网站建设 2026/8/6 18:50:11

PyTorch 入门实战(二):手写 CNN 实现 CIFAR-10 彩色图像分类

PyTorch 入门实战&#xff08;二&#xff09;&#xff1a;手写 CNN 实现 CIFAR-10 彩色图像分类 前言 本文会用 PyTorch 从零搭建一个卷积神经网络&#xff0c;在 CIFAR-10 彩色图像数据集上完成 10 分类任务。代码量不到 150 行&#xff0c;但覆盖了深度学习项目的完整流程&…

作者头像 李华