查看原文
其他

MyBatis源码分析之——SqlSession会话创建过程

冰河 冰河技术 2022-09-10



MyBatis操作的时候跟数据库的每一次连接,都需要创建一个会话,我们用openSession()方法来创建。这个会话里面需要包含一个Executor用来执行 SQL。Executor又要指定事务类型和执行器的类型。


1.创建Transaction(两种方式)


属性 产生工厂类 产生事务
JDBC JdbcTransactionFactory JdbcTransaction
MANAGED ManagedTransactionFactory ManagedTransaction


  • 如果配置的是 JDBC,则会使用Connection 对象的 commit()、rollback()、close()管理事务。


  • 如果配置成MANAGED,会把事务交给容器来管理,比如 JBOSS,Weblogic。


SqlSession sqlSession = sqlSessionFactory.openSession();


public SqlSession openSession() {//configuration中有默认赋值protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);}


<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment></environments>


2.创建Executor


//ExecutorType是SIMPLE,一共有三种SIMPLE(SimpleExecutor)、REUSE(ReuseExecutor)、BATCH(BatchExecutor)private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { Transaction tx = null; try { //xml中的development节点 final Environment environment = configuration.getEnvironment(); //type配置的是Jbdc所以生成的是JbdcTransactionFactory工厂类 final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment); //Jdbc生成JbdcTransactionFactory生成JbdcTransaction tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit); //创建CachingExecutor执行器 final Executor executor = configuration.newExecutor(tx, execType); //创建DefaultSqlSession属性包括 Configuration、Executor对象 return new DefaultSqlSession(configuration, executor, autoCommit); } catch (Exception e) { closeTransaction(tx); // may have fetched a connection so lets call close(); throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e); } finally { ErrorContext.instance().reset(); }}



你在刷抖音,玩游戏的时候,别人都在这里学习,成长,提升,人与人最大的差距其实就是思维。你可能不信,优秀的人,总是在一起。



扫码加入星球,看到人生中更多的可能性。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存