在上一篇中,说到了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的创建的更多相关文章

  1. Mybatis源码分析之Mapper的创建和获取

    Mybatis我们一般都是和Spring一起使用的,它们是怎么融合到一起的,又各自发挥了什么作用? 就拿这个Mapper来说,我们定义了一个接口,声明了一个方法,然后对应的xml写了这个sql语句, ...

  2. MyBatis源码分析-MyBatis初始化流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  3. MyBatis源码分析-SQL语句执行的完整流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  4. MyBatis源码分析(5)——内置DataSource实现

    @(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该 ...

  5. MyBatis源码分析(4)—— Cache构建以及应用

    @(MyBatis)[Cache] MyBatis源码分析--Cache构建以及应用 SqlSession使用缓存流程 如果开启了二级缓存,而Executor会使用CachingExecutor来装饰 ...

  6. MyBatis源码分析(2)—— Plugin原理

    @(MyBatis)[Plugin] MyBatis源码分析--Plugin原理 Plugin原理 Plugin的实现采用了Java的动态代理,应用了责任链设计模式 InterceptorChain ...

  7. MyBatis源码分析之环境准备篇

    前言 之前一段时间写了[Spring源码分析]系列的文章,感觉对Spring的原理及使用各方面都掌握了不少,趁热打铁,开始下一个系列的文章[MyBatis源码分析],在[MyBatis源码分析]文章的 ...

  8. Mybatis源码分析-BaseExecutor

    根据前文Mybatis源码分析-SqlSessionTemplate的简单分析,对于SqlSession的CURD操作都需要经过Executor接口的update/query方法,本文将分析下Base ...

  9. Mybatis源码分析-StatementHandler

    承接前文Mybatis源码分析-BaseExecutor,本文则对通过StatementHandler接口完成数据库的CRUD操作作简单的分析 StatementHandler#接口列表 //获取St ...

随机推荐

  1. Delphi IdHttp组件+IdHttpServer组件实现文件下载服务

     http://blog.csdn.net/xxkku521/article/details/16864759 Delphi IdHttp组件+IdHttpServer组件实现文件下载服务 2013- ...

  2. 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 ...

  3. 所有硬币组合问题——动态规划hdu2069

    Problem Description Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cen ...

  4. MySQL-- 数据库的三范式

    目前关系数据库有六种范式:第一范式(1NF).第二范式(2NF).第三范式(3NF).巴斯-科德范式(BCNF).第四范式(4NF)和第五范式(5NF,又称完美范式). 而通常我们用的最多的就是第一范 ...

  5. HashMap -双列集合的遍历与常用的方法

    package cn.learn.Map; /* java.util.Hashtable<k,y> implements Map<k,v> 早期双列集合,jdk1.0开始 同步 ...

  6. Struts2+Ajax实现数据交互

    1.导入jar包 struts核心包: json需要的包: 2.配置web.xml <filter> <filter-name>struts2</filter-name& ...

  7. LOJ 2234/BZOJ 3629 聪明的燕姿(数论+DFS)

    题面 传送门 分析 看到约数之和,我们首先想到约数和公式 若$ x=\prod_{i=1}^{n}p_i^{k_i} \(,则x的约数和为\) \prod_{i=1}^{n} \sum_{j=0}^{ ...

  8. 小B的询问(题解)(莫队)

    小B的询问(题解)(莫队) Junlier良心莫队 题目 luoguP2709 小B的询问 code #include<bits/stdc++.h> #define lst long lo ...

  9. H Kuangyeye and hamburgers

    链接:https://ac.nowcoder.com/acm/contest/338/H来源:牛客网 题目描述 Kuangyeye is a dalao of the ACM school team ...

  10. BUUCTF--reverse2

    测试文件:https://buuoj.cn/files/ef0881fc76e5bcd756b554874ef99bec/e8722e94-93d7-45d5-aa06-a7aa26ce01a1.ra ...