当前位置: 首页 > article >正文

在 MyBatis 的映射元素 <resultMap> 中,<id> 和 <result> 都用于将查询结果集的列映射到 Java 对象的属性

在 MyBatis 的resultMap中id和result都用于将查询结果集的列映射到 Java 对象的属性但它们的语义和内部处理机制有本质区别。下面从多个维度详细讲解。1.resultMap简介resultMap是 MyBatis 中最重要的映射元素之一用于定义如何将 SQL 查询结果集的列映射到 Java 对象的属性。它支持简单的属性映射result主键标识id关联映射association集合映射collection鉴别器discriminator当结果集包含多表关联时resultMap能够精确控制对象的嵌套结构。2.id的作用id标签用于映射主键列或逻辑上的唯一标识列其核心作用是告诉 MyBatis 该字段是对象的唯一标识。MyBatis 会在内部利用这个标识进行优化2.1 对象复用与缓存在嵌套查询或关联映射如association或collection中如果结果集包含多行数据MyBatis 会根据id映射的值来判断某个对象是否已经创建过如果同一主键值已经实例化了一个对象MyBatis 会复用该对象而不是为每一行都创建一个新的对象实例。这避免了对象重复创建节省内存也保证了对象引用的正确性例如多个结果行引用同一个父对象时父对象只有一个实例。示例假设有user和role两个实体一个用户可能有多个角色。查询结果返回如下user_iduser_namerole_idrole_name1张三1管理员1张三2普通用户如果没有id标识主键MyBatis 可能会创建两个独立的User对象即使它们的user_id相同导致内存浪费且对象引用不一致。有了id columnuser_id propertyid/MyBatis 会在第一次遇到user_id1时创建User对象第二次遇到时直接复用该对象并将角色添加到已有的User对象的角色集合中。2.2 性能优化在延迟加载中MyBatis 需要判断对象是否已被加载过id提供了这个依据。在嵌套查询时避免了重复查询相同主键的关联数据。2.3 与result的区别虽然id和result都完成列到属性的映射但id额外承担了“对象标识”的角色因此映射作用相同都能将列值赋给属性。内部处理不同MyBatis 会将id标记的字段作为对象缓存的键CacheKey的一部分用于判断对象是否已存在。3.result的作用result标签用于映射普通列非主键列仅完成列到属性的值复制不参与对象复用的判断。一个resultMap中可以包含多个result分别对应不同的属性。主键列通常也使用result映射但更推荐使用id。4. 两者的对比特性idresult用途标识主键/唯一键映射普通列是否参与对象复用是否性能影响提升嵌套/关联映射性能无特殊影响使用建议结果集中包含主键列时必须使用用于其他所有列能否同时存在主键列只需一个id不应重复使用result可与其他result共存5. 内部实现机制MyBatis 在执行嵌套查询时会维护一个结果集对象缓存ResultMap级别的CacheKey。当解析一行数据时根据id列的值生成CacheKey。如果该CacheKey已存在则直接从缓存中取出对象并继续映射该行的其他列。如果不存在则创建新对象放入缓存然后映射所有列。若未定义idMyBatis 会回退使用整行的所有列值作为缓存键通过Object.equals这可能导致即使主键相同只要其他列有差异如关联表的数据不同也会被认为是不同的对象。缓存命中率低可能创建大量重复对象。因此为结果集指定主键id是使用 MyBatis 高级映射的最佳实践。6. 示例说明6.1 没有id时的问题xmlresultMap iduserRoleMap typecom.example.User result columnuser_id propertyid/ result columnuser_name propertyname/ collection propertyroles ofTypecom.example.Role result columnrole_id propertyid/ result columnrole_name propertyname/ /collection /resultMap假设查询返回两行数据user_id都是1但role_id不同。由于没有idMyBatis 会为每一行都创建一个新的User对象尽管它们的id相同然后将角色分别添加到两个不同的User对象中。最终结果可能是用户对象被重复创建角色也错误地分散在不同实例中。6.2 使用id修正xmlresultMap iduserRoleMap typecom.example.User id columnuser_id propertyid/ result columnuser_name propertyname/ collection propertyroles ofTypecom.example.Role id columnrole_id propertyid/ result columnrole_name propertyname/ /collection /resultMap此时当 MyBatis 处理第一行时创建User对象并缓存键为user_id1。第二行遇到相同的user_id直接从缓存中取出该User对象然后将第二个角色添加到同一个User的roles集合中。最终得到一个正确的User对象其roles包含两个角色。7. 最佳实践始终为结果集的主键列或唯一标识列使用id标签即使当前映射中没有嵌套对象。这有助于未来扩展也能让 MyBatis 内部优化更高效。避免同时为同一列使用id和result虽然不会报错但会造成冗余且可能引起混淆尤其是在 IDE 的映射提示中。如果表没有主键但结果集中存在逻辑上的唯一标识如联合唯一键也可以使用id映射该组合列可通过id的多个列定义即id columncol1 /和id columncol2 /。8. 总结id和result都是列与属性的映射但id额外承担了“对象标识”的语义用于 MyBatis 内部的缓存和对象复用。在复杂映射尤其是关联查询中正确使用id可以避免重复对象创建保证内存效率和对象引用的正确性。无论是否涉及嵌套为结果集的主键列使用id是一个良好的编码习惯。

相关文章:

在 MyBatis 的映射元素 <resultMap> 中,<id> 和 <result> 都用于将查询结果集的列映射到 Java 对象的属性

在 MyBatis 的 <resultMap> 中&#xff0c;<id> 和 <result> 都用于将查询结果集的列映射到 Java 对象的属性&#xff0c;但它们的语义和内部处理机制有本质区别。下面从多个维度详细讲解。 1. <resultMap> 简介 <resultMap> 是 MyBatis 中最重…...

如何实现固定翼无人机编队飞行?PX4开源方案深度解析与实践指南

如何实现固定翼无人机编队飞行&#xff1f;PX4开源方案深度解析与实践指南 【免费下载链接】PX4-Autopilot PX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot 多无人机编队飞行技术正从实验室走向实际应用&#xff0c;在测绘、农业、…...

Git 本地版本控制极简使用笔记(Qt 项目专用)

核心原则全程仅需掌握5 个核心命令&#xff0c;满足日常开发、版本记录、回滚修复的全部需求&#xff0c;无需复杂操作&#xff0c;适配传感器环筛管理平台项目一、基础准备&#xff08;已完成&#xff0c;备查&#xff09;1. 仓库初始化&#xff08;仅执行 1 次&#xff09;# …...

像素皇城·灵蛇贺岁效果展示:红白机美学融合皇城大门的AI春联生成作品

像素皇城灵蛇贺岁效果展示&#xff1a;红白机美学融合皇城大门的AI春联生成作品 1. 项目概览 Pixel Couplet Gen是一款基于ModelScope大模型开发的创新型春联生成工具。与传统春联设计不同&#xff0c;我们大胆采用了8-bit像素游戏风格&#xff0c;将经典红白机视觉元素与中国…...

Graphormer惊艳案例:从SMILES到三维构象倾向性预测的延伸应用探索

Graphormer惊艳案例&#xff1a;从SMILES到三维构象倾向性预测的延伸应用探索 1. 模型概述 Graphormer是微软研究院开发的一款基于纯Transformer架构的图神经网络模型&#xff0c;专门为分子图&#xff08;原子-键结构&#xff09;的全局结构建模与属性预测而设计。与传统图神…...

21.【RTL_Synthesis】Analyzing Synthesis Results(综合结果分析)

&#x1f50d; 分析综合结果&#xff1a;从数字到洞察 我们已经学会了用 Yosys 把 RTL 综合成门级网表&#xff0c;也知道了如何用脚本批量处理不同工艺角。但综合工具跑完之后&#xff0c;我们得到了一堆数字&#xff1a;多少门、多少触发器、面积多大……这些数字到底意味着什…...

开源工具Cursor Free VIP:突破AI编程限制的高效使用指南

开源工具Cursor Free VIP&#xff1a;突破AI编程限制的高效使用指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your t…...

OpenMS全面解析:开源质谱数据分析平台的实战指南

OpenMS全面解析&#xff1a;开源质谱数据分析平台的实战指南 【免费下载链接】OpenMS The codebase of the OpenMS project 项目地址: https://gitcode.com/gh_mirrors/op/OpenMS OpenMS是一款功能全面的开源质谱数据分析平台&#xff0c;专为液相色谱-质谱(LC-MS)数据管…...

5分钟打造现代化Windows提示界面:ModernFlyouts彻底改变你的系统体验

5分钟打造现代化Windows提示界面&#xff1a;ModernFlyouts彻底改变你的系统体验 【免费下载链接】ModernFlyouts A modern Fluent Design replacement for the old Metro themed flyouts present in Windows. 项目地址: https://gitcode.com/gh_mirrors/mo/ModernFlyouts …...

SecGPT-14B提示工程:提升OpenClaw安全报告可读性的秘诀

SecGPT-14B提示工程&#xff1a;提升OpenClaw安全报告可读性的秘诀 1. 当安全报告遇上OpenClaw&#xff1a;我的真实痛点 上周五凌晨2点&#xff0c;我被OpenClaw的告警邮件惊醒——它发现我的个人服务器存在一个高危漏洞。但当我打开那份自动生成的安全报告时&#xff0c;眼…...

面试复盘(Debrief)的艺术:挂了面试不可怕,如何通过感谢信获取真实Feedback并为下次“埋伏笔”?

在2026年竞争极其激烈的北美科技求职市场中&#xff0c;即使是背景最优秀的候选人&#xff0c;也必然会经历面试失败。在工业界的招聘漏斗中&#xff0c;由于技术栈匹配度、团队预算&#xff08;Headcount&#xff09;变动或单纯的竞争者过强&#xff0c;收到拒信&#xff08;R…...

FanControl:Windows系统下深度自定义风扇控制的终极指南

FanControl&#xff1a;Windows系统下深度自定义风扇控制的终极指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/…...

django做动态【个人主页】

一、项目概述与目标动态个人主页的定义与核心功能&#xff08;博客展示、项目集、联系表单等&#xff09;Django框架的优势&#xff08;MTV模式、ORM、Admin后台等&#xff09;技术栈预览&#xff08;Python 3.x, Django 3.x, Bootstrap 5, SQLite/PostgreSQL&#xff09;二、环…...

2025届必备的六大AI学术工具解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 有一种人工智能开题报告辅助工具&#xff0c;它借助先进的自然语言处理技术与知识图谱技术构…...

ZeroOmega:下一代浏览器代理管理的架构革命

ZeroOmega&#xff1a;下一代浏览器代理管理的架构革命 【免费下载链接】ZeroOmega Manage and switch between multiple proxies quickly & easily. 项目地址: https://gitcode.com/gh_mirrors/ze/ZeroOmega 在当今复杂的网络环境中&#xff0c;代理管理已成为开发…...

基于CubeMX与HAL库:STM32F302串口重定向Printf的工程化实践

1. 为什么需要串口重定向Printf 在嵌入式开发中&#xff0c;调试信息输出是排查问题的生命线。想象一下你正在调试一个复杂的传感器数据采集系统&#xff0c;突然发现数据异常&#xff0c;这时候如果能像在PC上编程一样直接printf("当前温度值&#xff1a;%f", temp…...

OpenSpeedy游戏变速工具实战指南:打破帧率限制的完整攻略

OpenSpeedy游戏变速工具实战指南&#xff1a;打破帧率限制的完整攻略 【免费下载链接】OpenSpeedy &#x1f3ae; An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy OpenSpeedy是一款开源免费的游戏变速工具&#xff0c;能…...

论文魔法盒:书匠策AI,期刊论文写作的“超级外挂”

在学术的奇妙世界里&#xff0c;论文写作就像是一场充满挑战的魔法冒险。尤其是期刊论文&#xff0c;它要求学者们不仅要有深厚的学术功底&#xff0c;还得掌握各种写作技巧和规范。不过&#xff0c;现在有了书匠策AI这个神奇的“魔法盒”&#xff0c;期刊论文写作不再是令人望…...

XInput1_4.dll缺失怎么修复?2026年最新官方安全修复指南

XInput1_4.dll缺失怎么修复&#xff1f;2026年最新官方安全修复指南当你满心欢喜地连接好Xbox手柄&#xff0c;准备沉浸到最新游戏的紧张对决中&#xff0c;屏幕上却突然弹出“找不到XInput1_4.dll”或“XInput1_4.dll丢失”的错误提示&#xff0c;这确实让人瞬间扫兴。这个报错…...

ESP32-S3摄像头实战:按键触发拍照与SD卡自动存储方案

1. ESP32-S3摄像头项目核心价值与应用场景 当你手头有一块ESP32-S3开发板和摄像头模块时&#xff0c;最直接的冲动可能就是做个能拍照的小设备。但要把这个想法落地&#xff0c;需要解决三个关键问题&#xff1a;如何稳定触发拍摄&#xff1f;拍完的照片存哪里&#xff1f;怎么…...

Verilog中补码转换的常见误区与优化技巧

Verilog中补码转换的常见误区与优化技巧 在数字电路设计中&#xff0c;补码表示法因其在加减运算中的天然优势而成为有符号数处理的首选方案。许多Verilog初学者在实现补码转换时&#xff0c;往往陷入一些看似简单却影响深远的陷阱。本文将深入剖析这些隐藏的"坑"&am…...

YOLO26改进策略【卷积层】| arXiv 2025 加权卷积Weighted Conv 密度函数提表征 + 零参扩展降负担,提升目标检测精度

一、本文介绍 本文记录的是利用加权卷积改进 YOLO26 的卷积层特征提取部分。 Weighted Convolution(加权卷积)通过空间密度函数与标准卷积核加权结合,实现YOLO26特征提取中像素位置依赖的差异化权重分配。本文利用Weighted Convolution算子,通过对称衰减的密度函数强化中…...

手机也能跑Llama?聊聊移动端/边缘设备部署LLM的现状、挑战与未来展望

手机也能跑Llama&#xff1f;移动端大语言模型部署实战指南 当ChatGPT掀起生成式AI浪潮时&#xff0c;大多数人都认为这类技术只能依赖云端算力。但2023年Meta开源Llama系列模型后&#xff0c;一个令人兴奋的问题开始被频繁讨论&#xff1a;我们能否在手机这样的移动设备上本地…...

从防御者视角复盘:当你的Win11突然断网,如何快速排查是不是遭遇了ARP欺骗?

从防御者视角复盘&#xff1a;当你的Win11突然断网&#xff0c;如何快速排查是不是遭遇了ARP欺骗&#xff1f; 办公室里突然有人喊"网络断了"&#xff0c;你的Win11电脑明明显示Wi-Fi已连接&#xff0c;却打不开任何网页。这种情况可能不只是简单的路由器故障——ARP…...

大数据领域数据预处理:优化数据分析结果的关键环节

大数据领域数据预处理:优化数据分析结果的关键环节 关键词:大数据、数据预处理、数据分析、优化、关键环节 摘要:本文深入探讨了大数据领域中数据预处理这一优化数据分析结果的关键环节。详细介绍了数据预处理的背景知识,包括目的、范围、预期读者等。通过生动形象的比喻解…...

物理动力学系统的强化学习:一种替代方法

原文&#xff1a;towardsdatascience.com/rl-for-physical-dynamical-systems-an-alternative-approach-8e2269dc1e79?sourcecollection_archive---------1-----------------------#2024-07-28 重新引入遗传算法并与神经网络进行比较 https://medium.com/retter_42511?sourc…...

全志Tiger-ISP调试工具安装与使用全攻略

1. 全志Tiger-ISP调试工具入门指南 第一次接触全志Tiger-ISP调试工具时&#xff0c;我也是一头雾水。这个工具主要用于图像信号处理器(ISP)的调试和优化&#xff0c;是开发智能摄像头、行车记录仪等视觉设备的必备利器。简单来说&#xff0c;它能让你像调色师一样精细调整图像的…...

智慧树自动学习助手:三分钟实现高效网课学习的完整指南

智慧树自动学习助手&#xff1a;三分钟实现高效网课学习的完整指南 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台冗长的网课视频而烦恼吗&#xff1…...

如何通过Winhance实现Windows系统全方位优化?从入门到精通的完整指南

如何通过Winhance实现Windows系统全方位优化&#xff1f;从入门到精通的完整指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/…...

惠普tank 2606,开机报错 ER-08 ,加了碳粉还是报错ER08,黄灯闪烁成像鼓接近寿命期限,别被维修店坑了,这个软件专门维修这个错误,软件运行一下2分钟搞好。

下载地址&#xff1a;链接:https://pan.baidu.com/s/1J7PN4m4fbIzku9DqBFg_nw?pwd0000 提取码:0000 备用下载&#xff1a;下载 惠普tank 2606系列&#xff0c;tank1005系列&#xff0c;打印机提示错误代码 er-08 &#xff0c;加了粉还是报错er08,提示没粉&#xff0c;闪黄灯…...