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

【12.MyBatis源码剖析与架构实战】11.嵌套查询循环引⽤源码剖析

MyBatis 嵌套查询循环引用源码深度剖析(含流程图)在 MyBatis 中,当两个实体相互引用(如User↔Address),且双方都通过association的select属性配置了嵌套查询时,若没有特殊处理,查询时会发生无限递归,最终导致栈溢出。MyBatis 通过一级缓存(localCache)和ResultLoaderMap加载状态标记巧妙地解决了循环引用问题,确保在同一个SqlSession内,同一个对象只创建一次,并且循环引用能够正确建立。一、循环引用示例考虑以下实体与映射:publicclassUser{privateLongid;privateStringname;privateAddressaddress;// 持有 Address}publicclassAddress{privateLongid;privateStringstreet;privateUseruser;// 持有 User}Mapper XML:!-- UserMapper.xml --resultMapid="userMap"type="User"idcolumn="id"property="id"/resultcolumn="name"property="name"/associationproperty="address"column="address_id"select="com.example.AddressMapper.selectById"fetchType="eager"//resultMap!-- AddressMapper.xml --resultMapid="addressMap"type="Address"idcolumn="id"property="id"/resultcolumn="street"property="street"/associationproperty="user"column="user_id"select="com.example.UserMapper.selectById"fetchType="eager"//resultMap当调用UserMapper.selectById(1)时,会触发以下调用链:查询User(id=1, address_id=100)加载User.address→ 执行AddressMapper.selectById(100)查询Address(id=100, user_id=1)加载Address.user→ 执行UserMapper.selectById(1),回到步骤1若不加控制,将无限循环。二、MyBatis 解决循环引用的核心机制2.1 一级缓存(localCache)每个SqlSession有一个PerpetualCache实例(存储在BaseExecutor.localCache)。当从ResultSet构建一个对象时,会根据主键生成CacheKey,并在构建完成后放入localCache。后续任何查询(包括嵌套查询)在构建相同主键的对象时,会优先从localCache中获取,而不是重新创建。2.2createRowKey:生成对象缓存键DefaultResultSetHandler.createRowKey方法根据ResultMap中配置的id列(或如果无显式 id,则使用所有列),从当前ResultSet行提取值,生成唯一的CacheKey。privateCacheKeycreateRowKey(ResultMapresultMap,ResultSetWrapperrsw,StringcolumnPrefix)throwsSQLException{finalCacheKeycacheKey=newCacheKey();finalListResultMappingidMappings=resultMap.getIdResultMappings();for(ResultMappingidMapping:idMappings){finalStringcolumn=prependPrefix(idMapping.getColumn(),columnPrefix);if(column!=null){finalObjectvalue=getColumnValue(rsw,idMapping.getJavaType(),column);cacheKey.update(column);cacheKey.update(value);}}returncacheKey;}2.3getRowValue中的缓存复用在DefaultResultSetHandler.getRowValue中,会首先尝试从localCache获取已创建的对象:privateObjectgetRowValue(ResultSetWrapperrsw,ResultMapresultMap,StringcolumnPrefix,ObjectpartialValue,ResultMappingparentMapping)throwsSQLException{finalStringresultMapId=resultMap.getId();finalCacheKeyrowKey=createRowKey(resultMap,rsw,columnPrefix);// 尝试从一级缓存获取ObjectrowValue=partialValue!=null?partialValue:localCache.getObject(rowKey);if(rowValue!=nullrowValue!=EXECUTION_PLACEHOLDER){// 如果已经存在,直接返回(避免重复创建)returnrowValue;}// 否则创建对象并放入缓存...rowValue=createResultObject(rsw,resultMap,lazyLoader,columnPrefix);if(rowKey!=null){localCache.putObject(rowKey,rowValue);}// 填充属性...returnrowValue;}2.4ResultLoaderMap防止递归加载对于延迟加载的属性,ResultLoaderMap会在加载前移除对应的LoadPair,因此同一属性不会重复触发加载。但对于eager加载(立即加载)的情况,ResultLoaderMap不起作用,主要依赖一级缓存。三、循环引用解决流程(以 eager 为例)结合上述机制,循环引用的完整解决流程如下(

相关文章:

【12.MyBatis源码剖析与架构实战】11.嵌套查询循环引⽤源码剖析

MyBatis 嵌套查询循环引用源码深度剖析(含流程图) 在 MyBatis 中,当两个实体相互引用(如 User ↔ Address),且双方都通过 <association> 的 select 属性配置了嵌套查询时,若没有特殊处理,查询时会发生无限递归,最终导致栈溢出。MyBatis 通过 一级缓存(localCa…...

自主编码框架解析:从AI编程助手到闭环开发系统

1. 项目概述&#xff1a;一个面向自主编码的智能开发框架最近在开源社区里&#xff0c;一个名为GantisStorm/autonomous-coding-harness的项目引起了我的注意。乍一看这个标题&#xff0c;它像是一个工具集或框架&#xff0c;核心关键词是“自主编码”。对于开发者而言&#xf…...

【12.MyBatis源码剖析与架构实战】10.嵌套查询映射源码剖析

MyBatis 嵌套查询映射源码深度剖析 嵌套查询映射(Nested Query Mapping)是 MyBatis 中通过 <association> 或 <collection> 元素的 select 属性,实现一个 SQL 查询的某列值作为参数,去执行另一个 SQL 查询,并将其结果填充到主对象的关联属性中。这可以避免使…...

10 分钟完成 OpenClaw 智能体 Windows 部署

OpenClaw&#xff08;小龙虾&#xff09;Windows 一键部署教程&#xff5c;10 分钟搭建你的数字员工&#xff08;2026 适配版&#xff09; 适配平台&#xff1a;Windows 10/11&#xff08;64 位&#xff09;&#xff5c;新手友好&#xff5c;全程可视化操作&#xff5c;无技术…...

LLM 模型架构:从GPT到Claude

LLM 模型架构&#xff1a;从GPT到Claude 1. 大型语言模型的发展历程 大型语言模型&#xff08;LLM&#xff09;的发展经历了从早期的统计语言模型到现代深度学习模型的演变过程。特别是自2017年Transformer架构提出以来&#xff0c;LLM的性能得到了质的飞跃。 1.1 早期语言模型…...

Flutter导航与路由完全指南:构建流畅的页面跳转

Flutter导航与路由完全指南&#xff1a;构建流畅的页面跳转 引言 在移动应用开发中&#xff0c;导航和路由是构建用户体验的重要组成部分。Flutter提供了强大的导航和路由系统&#xff0c;使我们能够创建流畅、直观的页面跳转体验。本文将深入探讨Flutter导航和路由的各种实现方…...

【20年IDE生态专家实测】:Copilot Next 工作流配置面试通关路径图——含YAML Schema校验、权限沙箱、Telemetry埋点3大权威验证项

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;VS Code Copilot Next 自动化工作流配置面试全景概览 VS Code Copilot Next 并非独立产品&#xff0c;而是微软在 VS Code 1.90 版本中深度集成的 AI 编程增强套件&#xff0c;融合 GitHub Copilot Cha…...

CSS选择器完全指南:掌握样式的精准控制

CSS选择器完全指南&#xff1a;掌握样式的精准控制 引言 CSS选择器是CSS的核心组成部分&#xff0c;它决定了哪些HTML元素会被应用特定的样式。掌握CSS选择器对于编写高效、可维护的样式代码至关重要。本文将深入探讨CSS选择器的各种类型、使用方法以及最佳实践&#xff0c;帮助…...

300+ RPG Maker MV/MZ插件完全指南:免费打造专业级游戏的终极解决方案

300 RPG Maker MV/MZ插件完全指南&#xff1a;免费打造专业级游戏的终极解决方案 【免费下载链接】RPGMakerMV RPGツクールMV、MZで動作するプラグインです。 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerMV 在RPG Maker游戏开发中&#xff0c;你是否常常感到…...

CherryUSB轻量级协议栈在嵌入式开发中的应用

1. CherryUSB嵌入式USB协议栈概述在嵌入式系统开发中&#xff0c;USB接口因其即插即用、高带宽和供电能力等特性&#xff0c;已成为连接外设的首选方案之一。然而传统的USB协议栈往往存在资源占用大、移植困难等问题&#xff0c;特别是对于资源受限的MCU平台。CherryUSB作为一款…...

《文字定律》(1.3 1.4 文字定律 文字公理在现实中的作用表现)

1.3第三章 文字定律&#xff0c;文字公理在现实中的作用表现1.3.1第一节 文字定律在系统层面的表现文字是文明的底层物理公理——是所有人共同认同的公道与准则。就像物理学有永恒的公理&#xff1a;Fma、万有引力、能量守恒&#xff0c;这些公理在&#xff0c;世界就按规律运…...

多项式优化中的稀疏性与对称性方法解析

1. 多项式优化基础与挑战多项式优化问题(POP)在控制理论、量子信息、组合优化等领域有着广泛应用。这类问题的标准形式可以表示为&#xff1a;minimize f(x) subject to g_i(x) ≥ 0, i 1,...,m h_j(x) 0, j 1,...,p其中f, g_i, h_j都是多元多项式。传统求解方法面临两个主要…...

LeetCode 二分图判定题解

LeetCode 二分图判定题解 题目描述 二分图是一种特殊的图&#xff0c;它的顶点可以被分为两个不相交的集合&#xff0c;使得图中的每条边都连接不同集合中的顶点。 示例&#xff1a; 对于以下图&#xff1a;A -- B| |C -- D这是一个二分图&#xff0c;因为可以将顶点分为两个…...

python开发|yaml用法知识介绍

随着互联网技术的快速发展,服务器编程变得越来越重要。Python作为一种强大的编程语言,越来越受到开发者的青睐。而PyYAML则是Python中最常用的YAML格式解析器之一,本文将系统介绍yaml知识 01yaml介绍 YAML(YAML Aint Markup Language)是一种直观的数据序列化格式,它旨在以…...

华强北冲出狠角色!靠储能狂揽36亿,冷门生意爆火全球

为什么国内卖不动的产品&#xff0c;出海反而能年销36亿&#xff1f;本文深度拆解华强北"狠角色"Jackery&#xff08;电小二&#xff09;的出海神话。从"需求错位"到"场景化种草"&#xff0c;揭秘便携储能如何在欧美成为家庭标配。详解其TikTok&…...

2026届必备的五大降重复率网站实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于内容创作进程里&#xff0c;若打算切实降低AIGC&#xff08;人工智能生成内容&#xff09…...

泛微Ecology9远程调试实战:从Resin4配置到IDEA断点,安全测试环境一步到位

泛微Ecology9深度调试指南&#xff1a;构建安全高效的远程开发环境 当工作流Action突然抛出NullPointerException时&#xff0c;你是否还在用System.out.println逐行打印日志&#xff1f;作为经历过三次重大版本升级的泛微二次开发工程师&#xff0c;我总结出一套"外科手术…...

lvgl_v8.1版本之自定义bar绘画事件修复官方demo代码示例

static void set_value(void* bar, int32_t v) {lv_bar_set_value(bar, v, LV_ANIM_OFF)</...

量子操作与完全正性:量子信息处理的核心原理

1. 量子操作与完全正性的物理内涵量子操作是描述量子系统状态演化的数学工具&#xff0c;它从根本上定义了量子态如何在时间维度上进行变换。在量子信息处理中&#xff0c;无论是量子计算、量子通信还是量子纠错&#xff0c;量子操作都扮演着核心角色。理解量子操作的本质特性&…...

Raycast插件开发实战:本地数据解析与Cursor成本监控实现

1. 项目概述&#xff1a;一个为Raycast设计的Cursor成本监控插件如果你和我一样&#xff0c;日常重度依赖Cursor作为主力代码编辑器&#xff0c;同时又是一个Raycast的忠实用户&#xff0c;那么你很可能也面临过同样的困扰&#xff1a;Cursor的AI功能&#xff08;特别是其集成的…...

告别手动刷新:闲鱼智能监控系统帮你5分钟搭建自动化淘货助手

告别手动刷新&#xff1a;闲鱼智能监控系统帮你5分钟搭建自动化淘货助手 【免费下载链接】idlefish_xianyu_spider-crawler-sender 闲鱼自动抓取/筛选/发送系统&#xff0c;xianyu spider crawler blablabla 项目地址: https://gitcode.com/gh_mirrors/id/idlefish_xianyu_sp…...

灰色网络深度揭秘:暗网真实生态与安全风险全面解析

1. Hack Forums&#xff1a;不止是技术&#xff0c;更是“灰色地带”的狂欢&#xff1f; 这个2005年就成立的老牌论坛&#xff0c;与其说是“黑客技术交流”&#xff0c;不如说是网络安全灰色地带的缩影。从渗透测试到社工&#xff0c;啥都有&#xff0c;甚至还有交易区…别告…...

NVIDIA AI Workbench:企业级AI开发与部署新范式

1. NVIDIA AI Workbench 深度解析&#xff1a;企业级AI工作流新范式NVIDIA AI Workbench的beta版本发布标志着企业AI开发流程的一次重大革新。作为一名长期从事AI落地的技术架构师&#xff0c;我亲身体验了这套工具如何从根本上改变我们构建和部署AI项目的方式。不同于传统的碎…...

Awoo Installer:三分钟学会Switch游戏安装的终极指南

Awoo Installer&#xff1a;三分钟学会Switch游戏安装的终极指南 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 对于拥有破解版Nintendo Switch的…...

B站缓存视频合并终极指南:一键导出完整MP4并保留弹幕

B站缓存视频合并终极指南&#xff1a;一键导出完整MP4并保留弹幕 【免费下载链接】BilibiliCacheVideoMerge &#x1f525;&#x1f525;Android上将bilibili缓存视频合并导出为mp4&#xff0c;支持安卓5.0 ~ 13&#xff0c;视频挂载弹幕播放(Android consolidates and exports…...

CAS 失败后怎么办——从暴力自旋到自适应退避,无锁重试策略的四代进化

一行代码引发的问题 while (!flag.compare_exchange_weak(expected, desired)) {expected = flag.load();...

Agent 项目落地模板

Agent 项目落地模板1. 路线选择原则 如果你要真的开工&#xff0c;我建议默认采用这个路线&#xff1a; 先做 L1/L3不要一开始做纯 L2 loop agent目录结构按“可升级到 graph”来设计工具、状态、规划、执行器要分开所有 side-effect tool 都必须可审计 一句话&#xff1a;先把…...

全网最全网安合规资源站汇总,从入门到挖洞收藏这篇就够

我们学习网络安全&#xff0c;很多学习路线都有提到多逛论坛&#xff0c;阅读他人的技术分析帖&#xff0c;学习其挖洞思路和技巧。但是往往对于初学者来说&#xff0c;不知道去哪里寻找技术分析帖&#xff0c;也不知道网络安全有哪些相关论坛或网站&#xff0c;所以在这里给大…...

视觉语言模型在智能视频异常检测中的创新应用

1. 项目概述&#xff1a;视觉语言模型在异常检测中的创新应用视频监控系统在现代社会中扮演着越来越重要的角色&#xff0c;从城市安防到交通管理&#xff0c;无处不在的摄像头每天产生海量视频数据。传统的人工监控方式早已无法应对如此庞大的数据量&#xff0c;智能视频分析技…...

PCB制造工艺优化与质量控制关键技术解析

1. PCB制造的核心挑战与应对策略印刷电路板(PCB)作为现代电子产品的核心载体&#xff0c;其制造质量直接影响最终产品的性能和可靠性。在实际生产线上&#xff0c;一块裸板要经历20多道工序才能成为功能完整的电路板。这个过程中&#xff0c;工艺工程师面临的最大挑战是如何在保…...