mybatis SqlSessionFactory . openSession()方法执行过程
//false: 不自动提交
SqlSession sqlSession = factory.openSession(false);public class DefaultSqlSessionFactory implements SqlSessionFactory {//DefaultSqlSessionFactory 中唯一成员变量private final Configuration configuration;@Overridepublic SqlSession openSession(boolean autoCommit) {return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, autoCommit);}//configuration.getDefaultExecutorType() 得到的结果就是默认的 ExecutorType.SIMPLE;public class Configuration {//ExecutorType.SIMPLE: 这个执行器类型不做特殊的事情。它为每个语句的执行创建一个新的预处理语句。//ExecutorType.REUSE: 这个执行器类型会复用预处理语句。//ExecutorType.BATCH: 这个执行器会批量执行所有更新语句,如果 SELECT 在它们中间执行还会标定它们是 必须的,来保证一个简单并易于理解的行为。protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;}private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {Transaction tx = null;//通过configuration(封装<configration>所有信息);获取到Environment信息(<environment>)final Environment environment = configuration.getEnvironment();//从Environment中获取TransactionFactoryfinal TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);private TransactionFactory getTransactionFactoryFromEnvironment(Environment environment) {if (environment == null || environment.getTransactionFactory() == null) {return new ManagedTransactionFactory();}return environment.getTransactionFactory();} //TransactionFactory是Environment类中的对象属性public final class Environment {private final String id;private final TransactionFactory transactionFactory;private final DataSource dataSource;}//transactionFactory创建一个事务 : 传参数 -- environment.数据源, level : 事务隔离级别, 自动提交tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit); //555//根据execType类型, 和事务对象, 创建一个执行器final Executor executor = configuration.newExecutor(tx, execType); //666//创建DefaultSqlSession: 根据配置对象configuration, 执行器 executor, 自动提交boolean值return new DefaultSqlSession(configuration, executor, autoCommit); //777}}//返回一个ManagedTransaction对象(TransactionFactory 实现类)
public class ManagedTransactionFactory implements TransactionFactory {//555private boolean closeConnection = true;@Overridepublic Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) {return new ManagedTransaction(ds, level, closeConnection);}}public Executor newExecutor(Transaction transaction, ExecutorType executorType) {//666executorType = executorType == null ? defaultExecutorType : executorType;executorType = executorType == null ? ExecutorType.SIMPLE : executorType;Executor executor;if (ExecutorType.BATCH == executorType) {executor = new BatchExecutor(this, transaction);} else if (ExecutorType.REUSE == executorType) {executor = new ReuseExecutor(this, transaction);} else {executor = new SimpleExecutor(this, transaction);}if (cacheEnabled) {//默认trueexecutor = new CachingExecutor(executor);}//装饰模式, 将SimpleExecutor 装饰到 CachingExcutorexecutor = (Executor) interceptorChain.pluginAll(executor);return executor;}//创建一个SqlSession子类DefaultSqlSession对象返回, openSession()方法获得了SqlSession
public class DefaultSqlSession implements SqlSession { // 777private final Configuration configuration;private final Executor executor;private final boolean autoCommit;private boolean dirty;public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {this.configuration = configuration;this.executor = executor;this.dirty = false;this.autoCommit = autoCommit; }}
mybatis SqlSessionFactory . openSession()方法执行过程相关推荐
- 从 JVM 角度看 Spring 中方法执行过程和内存状态
Spring 容器中的 Bean 默认是单例的,也就是说我们在使用被Spring管理的对象的时候,不需要重复创建了,从而节省空间. 举个例子: 作为一个 CRUD 攻城狮,平时开发最多的就是一个Web ...
- [mybatis]sqlSessionFactory.openSession()
第一个是不会自动提交的 第二个带参数的是会自动提交的
- MyBatis 源码分析 - SQL 的执行过程
本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析.运 ...
- Mybatis(9)Dao实现类和无实现类的执行过程
findAll方法执行为例 1.执行findAll方法,DefaultSqlSession类 2. CachingExecutor类 3.BaseExecutor类 4.SimpleExecutor类 ...
- mybatis源码分析(方法调用过程)
十一月月底,宿舍楼失火啦,搞得20多天没有网,目测直到放假也不会来了... 正题 嗯~,其实阅读源码不是为了应付面试,更重要的让你知道,大师是怎样去写代码的,同样是用Java,为啥Clinton Be ...
- mybatis一个方法执行多条sql_精尽MyBatis源码分析——SQL执行过程之Executor!
MyBatis的SQL执行过程 在前面一系列的文档中,我已经分析了 MyBatis 的基础支持层以及整个的初始化过程,此时 MyBatis 已经处于就绪状态了,等待使用者发号施令了 那么接下来我们来看 ...
- MyBatis核心源码剖析(SqlSession XML解析 Mapper executor SQL执行过程 自定义类型处理器 缓存 日志)
MyBatis核心源码剖析 MyBatis核心源码剖析 1 MyBatis源码概述 1.1 为什么要看MyBatis框架的源码 1.2 如何深入学习MyBatis源码 1.3 源码分析的5大原则 2 ...
- mybatis delete返回值_面试:谈谈你对MyBatis执行过程之SQL执行过程理解
前言 在了解了MyBatis初始化加载过程后,我们也应该研究看看SQL执行过程是怎样执行?这样我们对于Mybatis的整个执行流程都熟悉了,在开发遇到问题也可以很快定位到问题. 更重要的,在面试中遇到 ...
- 类执行方法的过程与运行时
大家都知道,调用一个未声明方法大多数情况下会崩溃,崩溃信息就是unrecognized selector sent to instance:是的,的确大多数情况下是这样的,但是有了运行时就不一定了,这 ...
最新文章
- linux qemu 报错 Unable to reserve 0xfffff000 bytes of virtual address space at 0x1000 解决方法
- php微信支付na,虚拟支付
- JAVA项目中出现部分中文乱码问题
- Spring MVC实现Spring Security,Spring Stomp websocket Jetty嵌入式运行
- MyEclipse优化浅析
- java代码快速_java代码编写快捷途经
- js 页面所有超链接后加随机数 基于jquery
- 数组拼接时中间怎么加入空格_【题解二维数组】1123:图像相似度
- 黄光裕:力争用未来18个月的时间 使企业恢复原有的市场地位
- 华为机试HJ27:查找兄弟单词
- 微软职位内部推荐-Software Engineer II-Search
- 第三篇:关于MVPArms与OKGO结合报错--mRootView为空
- 计算机 行列式,行列式计算器
- 书评《鸟哥的Linux私房菜 基础学习篇》第四版
- 车牌拍照系统上传服务器,车牌识别系统实现过程及摄像机要求
- vue项目中使用思维导图mindmap
- 风变编程python基础语法-第0关-千寻的名字
- Java多线程学习(吐血超详细总结)转自博主林炳文Evankaka
- 链家租房数据抓取流程、分析
- Visual Studio 2005 Service Pack 1 (SP1)
热门文章
- elasticsearch查询term等级(query查询)
- FarPoint 表格(居中)自适应显示图片
- 王者电竞APP源码大圣电竞掌趣电竞逗游电竞比心电竞TT语音电竞王者荣耀和平精英游戏赛事软件二开搭建运营过的产品
- 时钟服务器工作原理,OpenNTPD时间服务器的基本工作过程分析
- 面试题: 你在工作/学习过程中遇到过什么深刻问题吗?怎么克服?
- phpcms v9修改flash上传为h5上传方法
- 超越GAN?OpenAI提出可逆生成模型Glow!图像生成太逼真
- 通过IP地址获取当前地理位置的接口(包含纬经度)
- 医用X射线胶片扫描仪行业调研报告 - 市场现状分析与发展前景预测
- hideFocus(小技巧) 聚焦无虚框 【转】