//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 的映射关系。

相关推荐
编码者卢布14 分钟前
【App Service】Java应用上传文件功能部署在App Service Windows上报错 413 Payload Too Large
java·开发语言·windows
q行1 小时前
Spring概述(含单例设计模式和工厂设计模式)
java·spring
好好研究1 小时前
SpringBoot扩展SpringMVC
java·spring boot·spring·servlet·filter·listener
毕设源码-郭学长1 小时前
【开题答辩全过程】以 高校项目团队管理网站为例,包含答辩的问题和答案
java
玄〤2 小时前
Java 大数据量输入输出优化方案详解:从 Scanner 到手写快读(含漫画解析)
java·开发语言·笔记·算法
tb_first2 小时前
SSM速通3
java·jvm·spring boot·mybatis
独自破碎E2 小时前
总持续时间可被 60 整除的歌曲
java·开发语言
Python+JAVA+大数据2 小时前
TCP_IP协议栈深度解析
java·网络·python·网络协议·tcp/ip·计算机网络·三次握手
丶小鱼丶2 小时前
Java基础之【多线程】
java