Mybatis源码解析(四)

开课吧开课吧锤锤2021-03-03 10:54

    Java是一门全球范围内使用最广泛的,面向对象的编程语言。Java语言具有功能强大和简单易用两个特征,它作为面向对象编程语言系列的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

Java

    三、SqlSession的创建

    我们知道,SqlSessionFactory创建的时候实际上返回的是一个DefaultSqlSessionFactory对象。

    当执行openSession()操作的时候,实际上执行的代码如下:

    privateSqlSessionopenSessionFromDataSource(ExecutorTypeexecType,TransactionIsolationLevellevel,booleanautoCommit){

    Transactiontx=null;

    try{

    finalEnvironmentenvironment=configuration.getEnvironment();

    finalTransactionFactorytransactionFactory=getTransactionFactoryFromEnvironment(environment);

    tx=transactionFactory.newTransaction(environment.getDataSource(),level,autoCommit);

    /**根据execType创建Executor对象*/

    finalExecutorexecutor=configuration.newExecutor(tx,execType);

    returnnewDefaultSqlSession(configuration,executor,autoCommit);

    }catch(Exceptione){

    closeTransaction(tx);//mayhavefetchedaconnectionsoletscallclose()

    throwExceptionFactory.wrapException("Erroropeningsession.Cause:"+e,e);

    }finally{

    ErrorContext.instance().reset();

    }

    }

    从代码可以知道,openSession操作会创建Mybatis四大对象之一的Executor对象,创建过程如下:

    publicExecutornewExecutor(Transactiontransaction,ExecutorTypeexecutorType){

    executorType=executorType==null?defaultExecutorType:executorType;

    executorType=executorType==null?ExecutorType.SIMPLE:executorType;

    Executorexecutor;

    if(ExecutorType.BATCH==executorType){

    executor=newBatchExecutor(this,transaction);

    }elseif(ExecutorType.REUSE==executorType){

    executor=newReuseExecutor(this,transaction);

    }else{

    executor=newSimpleExecutor(this,transaction);

    }

    /**如果开启了二级缓存,executor会被CachingExecutor包装一次*/

    if(cacheEnabled){

    executor=newCachingExecutor(executor);

    }

    /**尝试将executor使用interceptorChain中的每个interceptor包装一次(根据配置),这里是对Mybatis强大的插件开发功能做支持*/

    executor=(Executor)interceptorChain.pluginAll(executor);

    returnexecutor;

    }

    默认情况下会返回一个SimpleExecutor对象。然后SimpleExecutor被封装到DefaultSqlSession。这里我们需要注意一下,在Executor创建完毕之后,会根据配置是否开启了二级缓存,来决定是否使用CachingExecutor包装一次Executor。最后尝试将executor使用interceptorChain中的每个interceptor包装一次(根据配置),这里是对Mybatis强大的插件开发功能做支持。

    以上内容由开课吧老师左撇子小哥哥提供,更多Java教程尽在开课吧广场Java教程频道。

有用
分享