Myabtis 源码分析六 - 代理对象 Mapper 的创建流程分析,死锁全详解,一文带你搞定
[3、binding 模块运行流程](about:bla
nk#3%E3%80%81binding%20%E6%A8%A1%E5%9D%97%E8%BF%90%E8%A1%8C%E6%B5%81%E7%A8%8B "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,解读如下:
SqlSession 是 MyBatis 的门面,是 MyBatis 对外提供数据访问的主要 API,实例代码:com.enjoylearning.mybatis.MybatisDemo.originalOperation()?
实际上 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 模块核心类
评论