Mybatis源码阅读之SqlSession创建

1.SqlSessionFactory如何创建SqlSession

这里写图片描述


2.源码解析
SqlSession session = sqlSessionFactory.openSession();

SqlSessionFactory是个接口,它有两个实现类:

  • DefaultSqlSessionFactory
  • SqlSessionManager

在我的这篇博客 mybatis源码阅读之SqlSessionFactory创建有讲解最后是使用的DefaultSqlSessionFactory这个实现类。


下面我们一步一步来探究openSession()这个方法是如何创建出SqlSession的。
这里写图片描述

openSession这个方法调用了openSessionFromDataSource方法,先来看看传递的参数内容是什么。
这里写图片描述
需要传递的参数内容有三个:

  • ExecutorType 执行类型
  • TransactionIsolationLevel 事务隔离级别
  • boolean 是否主动提交事务

下面我们来看看这三个参数都有什么具体内容:

ExecutorType有三种取值:分别是SIMPLE,REUSE,BATCH
这里写图片描述

在Configuation类中设置了ExcutorType的默认值为SIMPLE:
这里写图片描述

如果想要修改ExecutorType的默认值,在mybatis-config.xml中可以这样配置:

<setting name="defaultExecutorType" value="SIMPLE"/>  

Mybatis官方中文文档中有对这三种类型做出解释:
这里写图片描述


再来看看事务隔离级别TransactionIsolationLevel的种类
这里写图片描述

从上图可以看出Mybatis的事务隔离级别是来自于java.sql.Connection的事务隔离级别:

这里写图片描述

事务隔离级别说明
TRANSACTION_NONE表示不支持事务
TRANSACTION_READ_COMMITTED可以防止脏读,不可重复读和虚读会发生。
TRANSACTION_READ_UNCOMMITTED脏读,不可重复读和虚读都会发生。
TRANSACTION_REPEATABLE_READ可以防止脏读和不可重复读,虚读会发生。
TRANSACTION_SERIALIZABLE可以防止脏读,不可重复读和虚读。

第三个参数,是否自动提交事务,可以是true或false。


介绍完openSessionFromDataSource方法的三个参数,我们再来看看这个方法内部都做了哪些操作:

这里写图片描述


Environment是如何创建,又是在什么时候创建的呢?

在我的博客 mybatis源码阅读之SqlSessionFactory创建 中最后提到Mybatis会去解析xml中的配置:

这里写图片描述

XMLConfigBuilder类解析mybatis-config.xml中的environments标签的方法:
这里写图片描述

遍历解析environment元素的子元素,根据xml中设置的transactionManager和dataSource的类型type获得TransactionFactory和DataSourceFactory:
这里写图片描述

获取transactionManager元素的属性type

这里写图片描述


Mybatis是如何根据xml配置的type的值就得到TransactionFactory的呢?

BaseBuilder类的resolveClass方法调用了resolveAlias方法
这里写图片描述

BaseBuilder类的resolveAlias方法是调用了类TypeAliasRegistry的resolveAlias方法。
这里写图片描述

类BaseBuilder的属性typeAliasRegistry的值是来自Configuration。
这里写图片描述

类Configuration实例化了一个TypeAliasRegistry,通过构造函数,调用TypeAliasRegistry的registryAlias方法向TYPE_ALIASES中添加键值对。
这里写图片描述

这里写图片描述

TYPE_ALIASES是一个Map,在TypeAliasRegistry的构造函数中,向TYPE_ALIASES添加了一些基本数据类型的键值对。
这里写图片描述

最后,是将type值转成小写,在TYPE_ALIASES中根据键值“jdbc”拿到对应的value,这里是JdbcTransactionFactory.class。如果type是“POOLED”,获得的value就是PooledDataSourceFactory.class。
这里写图片描述

根据PooledDataSourceFactory获取的DataSource:

这里写图片描述

而PooledDataSource类里有一些数据库基本的配置:
这里写图片描述

如果xml中没有配置transactionManager元素,Mybatis会设置一个默认的值ManagedTransactionFactory。
这里写图片描述

调用JdbcTransactionFactory的newTransaction方法获得JdbcTransaction。
这里写图片描述

调用Configuration获得执行器,当cacheEnabled为true时,调用的是CachingExecutor。cacheEnabled的默认值为true。可以在xml中对cacheEnabled的值进行修改。
这里写图片描述

最后的最后,实例化一个DefaultSqlSession(是SqlSession的子类),就可以对数据库进行操作了。
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值