Mybatis源码阅读之SqlSession创建
来源:互联网 发布:php 短信api 编辑:程序博客网 时间:2024/05/19 06:19
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的事务隔离级别:
第三个参数,是否自动提交事务,可以是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的子类),就可以对数据库进行操作了。
- Mybatis源码阅读之SqlSession创建
- Mybatis源码(二)之Spring整合mybatis创建SqlSession
- myBatis源码学习之SqlSession
- (四)MyBatis源码解析之SqlSession
- mybatis源码解析之SqlSession接口。
- mybatis源码阅读之SqlSessionFactory创建
- mybatis源码学习之执行过程分析(1)——SqlSessionFactory及SqlSession的创建
- 【SSM】Mybatis之SqlSession
- Mybatis 之 SqlSession
- 读mybatis源码之二:构建SqlSession逻辑
- Mybatis源码分析之SqlSessionFactory,SqlSession和连接池
- Mybatis源码(三)之SqlSession执行流程全貌
- mybatis使用之SqlSession获取
- Mybatis源码阅读之数据库连接
- MyBatis源码分析(三)-SqlSession理解
- mybatis源码解析(三)SqlSession
- Mybatis源码解析四、SqlSession运行过程
- SqlSessionFactory创建SqlSession测试mybatis的sql
- java服务器端控制层代码(特别方便)
- IRC扫盲——你可以不会玩QQ,但不能不会IRC!
- 使用TortoiseGit操作分支的创建与合并
- 小白的python之路 Day1
- 上传maven到私服
- Mybatis源码阅读之SqlSession创建
- 四 iOS之图层的定位点和锚点
- 神经网络与深度学习学习笔记:神经网络的优化
- memcached状态分析
- scrapy setting一些简单的配置
- mysql数据库 用代码建表
- Java中基本数据类型和引用数据类型的存放位置
- java 几种加载驱动的方法
- GYM