MyBatis原理剖析
来源:互联网 发布:电工模拟接线软件 编辑:程序博客网 时间:2024/05/16 03:04
01.openSession到底做了什么
1.1 SqlSessionFactory 接口的方法,得找接口的实现类
1.2DefaultSqlSessionFactory implements SqlSessionFactory
进而找到了DefaultSqlSessionFactory 的openSession(),openSession方法的原型如下:
public SqlSession openSession() { return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);}
1.3openSessionFromDataSource方法原型如下:
private SqlSession openSessionFromDataSource(ExecutorTypeexecType, TransactionIsolationLevel level,booleanautoCommit){Transaction tx = null;
DefaultSqlSession var8; try { Environment e = this.configuration.getEnvironment(); TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(e); tx = transactionFactory.newTransaction(e.getDataSource(), level, autoCommit); Executor executor = this.configuration.newExecutor(tx, execType, autoCommit); var8 = new DefaultSqlSession(this.configuration, executor); } catch (Exception var12) { this.closeTransaction(tx); throw ExceptionFactory.wrapException("Error opening session. Cause: " + var12, var12); } finally { ErrorContext.instance().reset(); } return var8;}
1.4DefaultSqlSession方法原型如下
public DefaultSqlSession(Configuration configuration, Executor executor) { this.configuration = configuration; this.executor = executor; this.dirty = false;}
02.insert和delete底层到底是什么?
Session.insert(“xxx”)
public int insert(String statement) { return this.insert(statement, (Object)null);//调度2个参数的insert}public int insert(String statement, Object parameter) { return this.update(statement, parameter);//底层调用update}
03.为什么session.commit()引起事务的提交?
session.commit();
最终调度到事务的commit
this.transaction.commit();
04.session.close()为什么可以回滚事务
1.从session.insert()开始
public int insert(String statement, Objectparameter) {
return this.update(statement, parameter);
}
--->update
publicint update(String statement, Object parameter) {
this.dirty = true;//注意这里将dirty设置成真,内存数据和DB数据库数据不一致
MappedStatement e = this.configuration.getMappedStatement(statement);
}
session.close()
this.executor.close(this.isCommitOrRollbackRequired(false));
------>isCommitOrRollbackRequired
privateboolean isCommitOrRollbackRequired(boolean force) {
return this.dirty || force; //这里得到的是true
}
------>Executor的close()
public void close(boolean forceRollback) {
this.rollback(forceRollback);//true
}
------>rollback
public void rollback(boolean required)throws SQLException {
if(required) {
this.transaction.rollback();
}
}
- MyBatis原理剖析
- 深入剖析 mybatis 原理(一)
- 深入剖析 mybatis 原理(二)
- spring源码剖析(八)spring整合mybatis原理
- 深入剖析 mybatis 原理(三)如何整合Spring
- MyBatis源码剖析 - MyBatis 插件之拦截器(Interceptor)实现原理
- 深入剖析 mybatis 原理(四)插件的原理和应用
- MyBatis分页剖析
- MyBatis分页剖析
- 【MyBatis框架】SqlMapConfig剖析
- 【MyBatis框架】SqlMapConfig剖析
- 【MyBatis框架】SqlMapConfig剖析
- MyBatis.2剖析
- mybatis动态代理剖析
- mybatis原理
- mybatis原理
- MyBatis原理
- mybatis 原理
- Android Studio安装插件 重启后保存不上的问题
- [dp]cf gym 101485B; bzoj4426 Better Productivity(NWERC 2015 B)
- JVM垃圾回收机制
- js基础-函数★★★
- jpg批量转成一个pdf
- MyBatis原理剖析
- 一些有趣的SQL题目
- AngularJs中,如何在render完成之后,执行Js脚本
- Spark源码分析之SparkSql的Analyzer,Optimizer
- 广义表与多重链表的概念
- WPS之word文档处理(持续更新)
- 物联网行业市场现状及发展分析
- PHP操作一维数组转树形层级结构
- mysql ON DUPLICATE KEY UPDATE