mybatis源码分析之03SqlSession的创建
在上一篇中,说到了mybatis是如何构造一个SqlSessionFactory实例的,顾名思意,SqlSessionFactory就是用于创建SqlSession的工厂类。
好,现在我们接着昨天的来,mybatis框架解析完xml配置文件之后,将其封装成一个Configuration实例,然后,SqlSessionFactory拿着这个Configuration实例,就可以创建SqlSession了。mybatis框架中,默认的实现是DefaultSqlSessionFactory。
下来,我们跟着源码来逐步分析, 还是从测试代码开始走起。
测试代码
public class V1Test {
    public static void main(String[] args) {
        try (InputStream is = Resources.getResourceAsStream("mybatis-config.xml")) {
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            SqlSession sqlSession = sqlSessionFactory.openSession(true);
            FemaleMapper femaleMapper = sqlSession.getMapper(FemaleMapper.class);
            Female female = femaleMapper.getFemaleById(1);
            System.out.println(female);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
前面已经分析了SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is)这一行代码了, 今天咱们从SqlSession sqlSession = sqlSessionFactory.openSession(true)这一行代码说起。
(1) DefaultSqlSessionFactory.java

这一行代码上戳个断点,debug启动测试代码,很是直观的看到sqlSessionFactory的真实类型就是DefaultSqlSessionFactory类型,跟代码,就会看下面这段核心代码,
代码的具体功能,注释已说明了。
  private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
      // Environment 封装了数据库相关的信息
      final Environment environment = configuration.getEnvironment();
      // 事务工厂类
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      // 新建一个事务
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      // 创建一个执行器,就是它与底层数据库打交道,CRUD,提交事务,回滚事务啥的
      final Executor executor = configuration.newExecutor(tx, execType);
      // 创建一个SqlSession,并返回
      return new DefaultSqlSession(configuration, executor, autoCommit);
    } catch (Exception e) {
  }
mybatis构造SqlSession对象就这么几步,还是很简单的。
总结:
1. mybatis默认使用DefaultSqlSessionFactory工厂来创建SqlSession对象
2. mybatis从configuration对象中拿到数据库相关的环境信息,然后构造一个合适的事务工厂类,默认是JdbcTransactionFactory, 由于创建connection事务
3. mybatis 会构造一个Executor执行器,使用它与数据库打交道。
4. SqlSession持有了一个Executor实例,可以理解为对Executor功能的增强,有些装饰模式的意思吧!
5. 下面是个简易的流程图

mybatis源码分析之03SqlSession的创建的更多相关文章
- Mybatis源码分析之Mapper的创建和获取
		
Mybatis我们一般都是和Spring一起使用的,它们是怎么融合到一起的,又各自发挥了什么作用? 就拿这个Mapper来说,我们定义了一个接口,声明了一个方法,然后对应的xml写了这个sql语句, ...
 - MyBatis源码分析-MyBatis初始化流程
		
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
 - MyBatis源码分析-SQL语句执行的完整流程
		
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
 - MyBatis源码分析(5)——内置DataSource实现
		
@(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该 ...
 - MyBatis源码分析(4)—— Cache构建以及应用
		
@(MyBatis)[Cache] MyBatis源码分析--Cache构建以及应用 SqlSession使用缓存流程 如果开启了二级缓存,而Executor会使用CachingExecutor来装饰 ...
 - MyBatis源码分析(2)—— Plugin原理
		
@(MyBatis)[Plugin] MyBatis源码分析--Plugin原理 Plugin原理 Plugin的实现采用了Java的动态代理,应用了责任链设计模式 InterceptorChain ...
 - MyBatis源码分析之环境准备篇
		
前言 之前一段时间写了[Spring源码分析]系列的文章,感觉对Spring的原理及使用各方面都掌握了不少,趁热打铁,开始下一个系列的文章[MyBatis源码分析],在[MyBatis源码分析]文章的 ...
 - Mybatis源码分析-BaseExecutor
		
根据前文Mybatis源码分析-SqlSessionTemplate的简单分析,对于SqlSession的CURD操作都需要经过Executor接口的update/query方法,本文将分析下Base ...
 - Mybatis源码分析-StatementHandler
		
承接前文Mybatis源码分析-BaseExecutor,本文则对通过StatementHandler接口完成数据库的CRUD操作作简单的分析 StatementHandler#接口列表 //获取St ...
 
随机推荐
- Delphi IdHttp组件+IdHttpServer组件实现文件下载服务
			
http://blog.csdn.net/xxkku521/article/details/16864759 Delphi IdHttp组件+IdHttpServer组件实现文件下载服务 2013- ...
 - firefox SSL_ERROR_RX_RECORD_TOO_LONG burpsuit 报错 解决方案
			
禁用TLS 1.3 .在Firefox的地址栏中输入“ about:config ”. .在搜索条目“tls.version.max ”.将值从4更改为3. .值4所表示TLS 1.3,3个代表TLS ...
 - 所有硬币组合问题——动态规划hdu2069
			
Problem Description Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cen ...
 - MySQL-- 数据库的三范式
			
目前关系数据库有六种范式:第一范式(1NF).第二范式(2NF).第三范式(3NF).巴斯-科德范式(BCNF).第四范式(4NF)和第五范式(5NF,又称完美范式). 而通常我们用的最多的就是第一范 ...
 - HashMap -双列集合的遍历与常用的方法
			
package cn.learn.Map; /* java.util.Hashtable<k,y> implements Map<k,v> 早期双列集合,jdk1.0开始 同步 ...
 - Struts2+Ajax实现数据交互
			
1.导入jar包 struts核心包: json需要的包: 2.配置web.xml <filter> <filter-name>struts2</filter-name& ...
 - LOJ 2234/BZOJ 3629 聪明的燕姿(数论+DFS)
			
题面 传送门 分析 看到约数之和,我们首先想到约数和公式 若$ x=\prod_{i=1}^{n}p_i^{k_i} \(,则x的约数和为\) \prod_{i=1}^{n} \sum_{j=0}^{ ...
 - 小B的询问(题解)(莫队)
			
小B的询问(题解)(莫队) Junlier良心莫队 题目 luoguP2709 小B的询问 code #include<bits/stdc++.h> #define lst long lo ...
 - H	Kuangyeye and hamburgers
			
链接:https://ac.nowcoder.com/acm/contest/338/H来源:牛客网 题目描述 Kuangyeye is a dalao of the ACM school team ...
 - BUUCTF--reverse2
			
测试文件:https://buuoj.cn/files/ef0881fc76e5bcd756b554874ef99bec/e8722e94-93d7-45d5-aa06-a7aa26ce01a1.ra ...