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

【12.MyBatis源码剖析与架构实战】4.MapperProxy源码剖析

MyBatis MapperProxy 源码深度剖析

MapperProxy是 MyBatis 中 Mapper 接口动态代理的核心实现类。它通过 JDK 动态代理拦截对 Mapper 接口方法的调用,将方法调用转换为对SqlSession的数据库操作(如查询、插入、更新、删除),同时处理方法返回值、参数映射、分页等细节。


一、MapperProxy 的定位

MyBatis 允许开发者只定义 Mapper 接口(如UserMapper),而不需要编写实现类。这得益于MapperProxy在运行时为接口生成代理对象,当调用接口方法时,代理逻辑会根据方法签名、参数以及 XML 或注解中定义的 SQL 语句,自动执行相应的数据库操作。

相关类结构:

  • MapperProxy:实现InvocationHandler,负责拦截方法调用。
  • MapperProxyFactory:为每个 Mapper 接口创建MapperProxy实例,并生成代理对象。
  • MapperMethod:封装了 Mapper 接口中某个具体方法的详细信息,包括 SQL 命令类型、返回值类型、参数解析等。

二、MapperProxyFactory:代理对象的工厂

在 MyBatis 初始化阶段,Configuration会为每个 Mapper 接口创建一个MapperProxyFactory实例,并缓存在MapperRegistry中。

publicclassMapperProxyFactory<T>{privatefinalClass<T>mapperInterface;privatefinalMap<Method,MapperMethod>methodCache=newConcurrentHashMap<>();publicMapperProxyFactory(Class<T>mapperInterface){this.mapperInterface=mapperInterface;}@SuppressWarnings("unchecked")protectedTnewInstance(MapperProxy<T>mapperProxy){// 使用 JDK 动态代理生成代理对象return(T)Proxy.newProxyInstance(mapperInterface.getClassLoader(),newClass[]{mapperInterface},mapperProxy);}publicTnewInstance(SqlSessionsqlSession){finalMapperProxy<T>mapperProxy=newMapperProxy<>(sqlSession,mapperInterface,methodCache);returnnewInstance(mapperProxy);}}

关键点:

  • 每个 Mapper 接口对应一个MapperProxyFactory
  • methodCache用于缓存MapperMethod对象,避免每次调用都解析方法签名(性能优化)。
  • newInstance(SqlSession sqlSession)创建MapperProxy并生成代理对象。

三、MapperProxy 源码分析

MapperProxy实现了InvocationHandler,核心方法为invoke

publicclassMapperProxy<T>implementsInvocationHandler,Serializable{privatestaticfinallongserialVersionUID=-6424540398559729838L;privatefinalSqlSessionsqlSession;privatefinalClass<T>mapperInterface;privatefinalMap<Method,MapperMethod>methodCache;publicMapperProxy(SqlSessionsqlSession,Class<T>mapperInterface,Map<Method,
http://www.jsqmd.com/news/685745/

相关文章:

  • 3步搞定Switch控制器PC连接:BetterJoy终极配置手册
  • 算计是意识,计算则是意识的产物
  • 终极Windows软件清理指南:5分钟学会批量卸载与深度清理
  • LFM2.5-VL-1.6B入门必看:config.json中num_hidden_layers与vision_tower配置解读
  • 【2026年华为暑期实习(AI)-4月22日-第二题- 统计二叉树中“平衡路径”的数量】(题目+思路+JavaC++Python解析+在线测试)
  • 3月必看!市场口碑好的筛分斗生产厂家推荐与口碑分析,高效运转,助力工程快速推进 - 品牌推荐师
  • RWKV7-1.5B-world镜像免配置:systemd服务脚本预置,支持开机自启与守护
  • 【2026年最新600套毕设项目分享】微信小程序的在线选座系统(30139)
  • 倍莱鲜羊奶粉新零售系统方案 - 私域邦网络
  • Dev-C++中Clang编译器的限制有哪些
  • 深度学习优化器量化技术:原理、挑战与实践
  • SpringBoot+Vue小区停车场管理系统源码+论文
  • 【12.MyBatis源码剖析与架构实战】5.参数转换和映射源码剖析
  • 2026年虫害治理优质服务商推荐榜:四川灭白蚁公司/四川灭鼠杀虫公司推荐/四川白蚁防治公司推荐/四川除虫灭鼠公司推荐/选择指南 - 优质品牌商家
  • 2026年目前有名的驾照培训公司有哪些,增驾/学大车/驾校/学车驾照/学车驾校/考摩特车照/驾照培训,驾照培训公司哪家好 - 品牌推荐师
  • Docker沙箱环境搭建失败率高达67%?3步绕过cgroups/v2权限雷区(附可验证Shell脚本)
  • ThreadPoolExecutor使用小问题
  • SpringBoot+Vue饮食营养管理信息系统源码+论文
  • 大语言模型在网络安全攻防中的应用与风险
  • 2026年靠谱的磁棒圆网印花机/针织布布料圆网印花机深度厂家推荐 - 品牌宣传支持者
  • 2026乐山临江鳝丝优质门店推荐榜:乐山旅游必去景点/乐山旅游攻略/乐山旅游美食攻略/乐山最出名的临江鳝丝/乐山本地人推荐的临江鳝丝/选择指南 - 优质品牌商家
  • 2026年比较好的宁夏防贫血氧化锌/系酸力低氧化锌/防皮肤苍白氧化锌/猪用过胃氧化锌厂家推荐与选型指南 - 品牌宣传支持者
  • DSP F2833x I2C实战:从寄存器配置到EEPROM读写全解析
  • 自回归图像生成中的KV缓存优化与SSD压缩技术
  • Hyperf 对接 PLC
  • 2026年热门的塑料降解袋/淀粉基降解袋多家厂家对比分析 - 行业平台推荐
  • 【图像质量评估实战】从PSNR到FID:五大指标原理、代码与选型指南
  • 告别OOM错误!FLUX.1-dev旗舰版24G显存优化配置详解
  • 葡萄园小型开沟机的设计(说明书+14张CAD图纸+开题报告+任务书……)
  • 2026年航空航天用铜合金材供应商推荐指南:黄铜管/黄铜线/黄铜钥匙板/h62黄铜板/h65黄铜板/大口径铝管/选择指南 - 优质品牌商家