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

//TODO 动态代理的本质?

待解决

//TODO 面试题

为啥mybatis的mapper只有接口没有实现类,但它却能工作??(ai参考,待深究源码)

1. 动态代理生成代理对象

MyBatis 使用 JDK 动态代理 为每个 Mapper 接口生成代理对象: • 核心类MapperProxy(实现 InvocationHandler 接口)和 MapperProxyFactory(代理工厂)。 • 代理对象创建流程

  1. 当调用 SqlSession.getMapper(UserMapper.class) 时,MyBatis 会通过 MapperProxyFactory 创建代理对象。

  2. MapperProxy 作为代理逻辑处理器,拦截所有接口方法的调用。

  3. 代理对象通过 Proxy.newProxyInstance 动态生成,无需手动编写实现类。

2. 方法调用与 SQL 执行的映射

代理对象拦截方法调用后,通过以下步骤执行 SQL: • 步骤 1:解析方法签名 根据接口全限定名(如 com.example.UserMapper)和方法名(如 getUserById),生成唯一的 方法 ID(例如 com.example.UserMapper.getUserById)。

步骤 2:绑定 SQL 语句 MyBatis 启动时会加载 XML 文件,将 <mapper> 标签的 namespace 与接口全限定名匹配,并通过方法 ID 找到对应的 SQL 语句。

步骤 3:执行 SQL 并返回结果 代理对象通过 SqlSession 调用底层方法(如 selectOneselectList),执行 SQL 并将结果映射为 Java 对象。

3. 关键设计优势

解耦接口与实现 开发者只需定义接口和 SQL 映射,MyBatis 自动生成代理对象,避免手动编写模板代码。

灵活性与可维护性 SQL 与 Java 代码分离,修改 SQL 无需重新编译代码,同时支持动态 SQL 和复杂映射。

性能优化 代理对象通过缓存 MappedStatement(包含 SQL、参数、结果映射等信息)提升执行效率。

4. 话术

  1. MapperProxyinvoke 方法 代理对象调用方法时,会进入 MapperProxy.invoke,通过 MapperMethod 封装 SQL 执行逻辑。(封装?还是映射?)

  2. Configuration 类的核心作用 在 MyBatis 启动时,Configuration 类会加载所有 Mapper 接口和 XML 文件,建立接口方法与 SQL 的映射关系。

相关文章:

  • 深度学习与计算机视觉方向
  • MATLAB实现基于“蚁群算法”的AMR路径规划
  • 蓝桥杯 回文数组
  • 常见中间件漏洞之四:Apache
  • 通信基本概念
  • windows切换系统版本
  • 【uni-app】tabBar使用
  • Python中json和jsonify的使用
  • 【MySQL】锁机制
  • DeepSeek技术架构解析:MoE混合专家模型
  • C语言-桥接模式详解与实践
  • 清华大学大模型智能体自我认知与决策流程!自知、反思、规划:城市环境目标导航中的大模型智能体新范式
  • 驱动开发的引入
  • k8s中运行nginx的亲和性
  • BigEvent项目后端学习笔记(二)文章分类模块 | 文章分类增删改查全流程解析(含优化)
  • 3.milvus索引-HNSW
  • SpringBoot集成Flyway
  • java八股文之并发编程
  • JSON Web Token (JWT) 完整指南
  • 决策树调参技巧
  • 商务部:今年前3月自贸试验区进出口总额达2万亿元
  • 因港而兴,“长江黄金水道”上的宜宾故事
  • 人民网三评“网络烂梗”:莫让低级趣味围猎青少年
  • 爱德华多·阿拉纳宣誓就任秘鲁新总理
  • 男子入户强奸高龄独居妇女致其死亡,法院:属实,已执行死刑
  • 王毅谈中拉命运共同体建设“五大工程”及落实举措