博客
关于我
Mapper 接口方法如何与注解里的 SQL 进行绑定的?
阅读量:597 次
发布时间:2019-03-12

本文共 1606 字,大约阅读时间需要 5 分钟。


Mapper 接口在 MyBatis 3.x 中的工作流程与其注册和调用逻辑紧密相关。以下将详细讲解 Mapper 接口的动态代理注册过程及使用场景。

1. Mapper 接口的动态代理注册

当 Mapper 接口被注册到 MapperRegistry 时,会执行以下步骤:

  • Using Mapper 接口作为 Class 类型:首先需要确保已知 Mapper 接口的所有类型已注册到 MapperRegistry。使用 MapperProxyFactory 包装该 Mapper 接口,存入 knownMappers 映射表。
// 注册 Mapper 接口为代理knownMappers.put(type, new MapperProxyFactory(type));
  • 解析 Mapper 方法注解:使用 MapperAnnotationBuilder 对 Mapper 接口上的注解进行解析,生成相应的 SQL 执行逻辑(即MappedStatement)。需要注意的是,注解解析依赖于配置对象(configuration)和当前的 Mapper 接口类型。
// 解析注解MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type);parser.parse();
  • 注册 MapperStatement 到 Configuration 对象:解析后的 SQL 语句会被注册到 Configuration 对象中,准备用于后续的 SQL 执行操作。

注:以上逻辑通常通过 MapperRegistry 的 addMapper 方法进行实现。


2. 获取 Mapper 接口的动态代理对象

在需要使用 Mapper 接口时,执行以下步骤:

  • 通过 MapperRegistry 获取映射工厂:使用 getMapper 方法,传入 Mapper 接口类型和提供的 SqlSession 对象。
public T getMapper(Class
type, SqlSession sqlSession) { // 获取已注册的 MapperProxyFactory 实例 MapperProxyFactory mapperProxyFactory = knownMappers.get(type); if (mapperProxyFactory == null) { throw new BindingException(...); } try { return mapperProxyFactory.newInstance(sqlSession); } catch (Exception e) { throw new BindingException(...); }}
  • 创建 MappeedStatement 实例并执行 SQL:通过 mapperProxyFactory.newInstance(sqlSession) 获取 Mapper 代理实例,然后调用其方法执行对应的 SQL 操作。

流程总结

  • 注册阶段:通过 addMapper 或类似的方法,将 Mapper 接口及其注解解析,注册到 MapperRegistry 中。
  • 使用阶段:通过 getMapper 方法获取动态代理实例,调用其方法执行相应的 SQL 操作。

以上流程能够高效地将 Mapper 接口与数据库核心配置(如 SqlSession) 进行交互,最终实现对-real SQL 语句的执行。


以上解析涵盖了 Mapper 工作流程的主要逻辑,包含注册和使用两大主要阶段。技术细节如注解解析、动态代理机制等均可根据实际需求进一步优化。

转载地址:http://kwoxz.baihongyu.com/

你可能感兴趣的文章
我用wxPython搭建GUI量化系统之多只股票走势对比界面
查看>>
selenium+python之切换窗口
查看>>
重载和重写的区别:
查看>>
搭建Vue项目步骤
查看>>
账号转账演示事务
查看>>
idea创建工程时错误提醒的是architectCatalog=internal
查看>>
SpringBoot找不到@EnableRety注解
查看>>
简易计算器案例
查看>>
在Vue中使用样式——使用内联样式
查看>>
Find Familiar Service Features in Lightning Experience
查看>>
Explore Optimization
查看>>
连接Oracle数据库经常报错?关于listener.ora和tnsnames.ora文件的配置
查看>>
解决数据库报ORA-02289:序列不存在错误
查看>>
map[]和map.at()取值之间的区别
查看>>
成功解决升级virtualenv报错问题
查看>>
【SQLI-Lab】靶场搭建
查看>>
【Bootstrap5】精细学习记录
查看>>
Struts2-从值栈获取list集合数据(三种方式)
查看>>
vscode中快速生成vue模板
查看>>
参考图像
查看>>