Myabtis源码分析六-代理对象Mapper的创建流程分析

 

目录

一、Mybatis 的接口层

1、SqlSession介绍

​2、SqlSessionFactory

 二、binding 模块分析

1、bindling模块介绍

2、bindling模块核心类

3、binding 模块运行流程


	//--------------------第二部,创建代理对象---------------------------
		// 2.获取sqlSession	
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 3.获取对应mapper
		TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);

从上篇我们知道,整个mybtais的使用主要分为三个阶段,那么第二个阶段就是 MyBatis 最神秘的阶段,要理解它,就需要对 Mybatis 的接口层和 binding模块数据源模块进行深入的学习;

一、Mybatis 的接口层

1、SqlSession介绍

第二个阶段使用到的第一个对象就是 SqlSession,SqlSession 是 MyBaits 对外提供的最关
键的核心接口,通过它可以执行数据库读写命令、获取映射器、管理事务等;SqlSession 也
意味着客户端与数据库的一次连接,客户端对数据库的访问请求都是由SqlSession来处理的,
SqlSession 由 SqlSessionFactory 创建,每个 SqlSession 都会引用 SqlSessionFactory 中全局唯一单例存在的 configuration 对象;如下图所示:

 

要 深 入 理 解 SqlSession 就 得 深 入 到 源 码 进 行 学 习 , SqlSession 默 认 实 现 类 为
org.apache.ibatis.session.defaults.DefaultSqlSession,解读如下:

  1. SqlSession 是 MyBatis 的门面,是 MyBatis 对外提供数据访问的主要 API,实例代码:com.enjoylearning.mybatis.MybatisDemo.originalOperation() 
  2. 实际上 Sqlsession 的功能都是基于 Executor 来实现的,遵循了单一职责原则,例如在 SqlSession 中的各种查询形式,最终会把请求转发到 Executor.query 方法,如下图所示:

2、SqlSessionFactory

SqlSessionFactory 使用工厂模式创建 SqlSession ,其默认的实现类为DefaultSqlSessionFactory , 其 中 获 取 SqlSession 的 核 心 方 法 为openSessionFromDataSource(ExecutorType, TransactionIsolationLevel, boolean),在这个方法中从 configuration 中获取的 TransactionFactory 是典型的策略模式的应用。运行期,TransactionFactory 接口的实现,是由配置文件配置决定的,可配置选项包括:JDBC、Managed,可根据需求灵活的替换 TransactionFactory 的实现;配置文件截图如下:

 二、binding 模块分析

1、bindling模块介绍

上面提到 SqlSession 是 MyBatis 对外提供数据库访问最主要的 API,但是因为直接使用
SqlSession 进行数据库开发存在代码可读性差、可维护性差的问题,所以我们很少使用,而
是使用 Mapper 接口的方式进行数据库的开发。表面上我们在使用 Mapper 接口编程,实际
上 MyBatis 的内部,将对 Mapper 接口的调用转发给了 SqlSession,这个请求的转发是建立在
配置文件解读、动态代理增强的基础之上实现的,实现的过程有三个关键要素:

  • 找到 SqlSession 中对应的方法执行;
  • 找到命名空间和方法名(两维坐标)
  • 传递参数

要实现上述的步骤,必须对 bindling 模块有深入的分析;

2、bindling模块核心类

bindling 模块核心类结构如下:

  •  MapperRegistry:mapper 接口和对应的代理对象工厂的注册中心;
  • MapperProxyFactory:用于生成 mapper 接口动态代理的实例对象;保证 Mapper 实例对象是局部变量;
  • MapperProxy:实现了 InvocationHandler 接口,它是增强 mapper 接口的实现;
  • MapperMethod:封装了 Mapper 接口中对应方法的信息,以及对应的 sql 语句的信息;它是 mapper 接口与映射配置文件中 sql 语句的桥梁; MapperMethod 对象不记录任何状态信息,所以它可以在多个代理对象之间共享;MapperMethod 内几个关键数据结构:
    • SqlCommand : 从 configuration 中获取方法的命名空间.方法名以及 SQL 语句的类型;
    • MethodSignature:封装 mapper 接口方法的相关信息(入参,返回类型);
    • ParamNameResolver: 解析 mapper 接口方法中的入参,将多个参数转成 Map;

3、binding 模块运行流程

从 SqlSession.getMapper(Class<T>)方法开始跟踪,画出 binding 模块的时序图如下所示:

 在 binding 模块的运行流程中实现三步翻译的核心方法是 MapperMethod.execute(SqlSession,
Object[]),翻译的过程描述如下:

  1. 通过 Sql 语句的类型(MapperMethod.SqlCommand.type)和 mapper 接口方法的返回参数(MapperMethod.MethodSignature.returnType)确定调用 SqlSession 中的某个方法;
  2. 通过 MapperMethod.SqlCommand.name 生成两维坐标;
  3. 通过 MapperMethod.MethodSignature.paramNameResolve 将传入的多个参数转成Map 进行参数传递;

 

  • 15
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王老狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值