mybatis四大神器之Executor執(zhí)行器

上篇文章介紹了mybatis中的關(guān)鍵對象SqlSessionFactory的創(chuàng)建過程,本篇文章繼續(xù)介紹下執(zhí)行器executor。每個SqlSession都會擁有一個Executor對象,這個對象負(fù)責(zé)增刪改查操作,我們可以簡單的將它理解為JDBC中Statement的封裝版

executor繼承結(jié)構(gòu)

image
  • Executor接口:有兩個實現(xiàn)類BaseExecutor、CachingExecutor
  • BaseExecutor:是一個抽象類,抽象類實現(xiàn)接口是”適配器模式“的體現(xiàn),為了方便下一級實現(xiàn)類對接口中方法的實現(xiàn);BaseExecutor有三個子類分別是simpleExecutor、ResuseExecutor、BatchExecutor
  • SimpleExecutor:是MyBatis中默認(rèn)使用的執(zhí)行器. 每執(zhí)行一次update或select,就開啟一個Statement對象,用完立刻關(guān)閉Statement對象。(可以是Statement或PrepareStatement對象)
  • ReuseExecutor:可重用執(zhí)行器,這里的重用指的是重復(fù)使用Statement. 它會在內(nèi)部利用一個Map把創(chuàng)建的Statement都緩存起來,每次在執(zhí)行一條SQL語句時,它都會去判斷之前是否存在基于該SQL緩存的Statement對象,存在而且之前緩存的Statement對象對應(yīng)的Connection還沒有關(guān)閉的時候就繼續(xù)用之前的Statement對象,否則將創(chuàng)建一個新的Statement對象,并將其緩存起來。因為每一個新的SqlSession都有一個新的Executor對象,所以我們緩存在ReuseExecutor上的Statement的作用域是同一個SqlSession
  • BatchExecutor:批處理執(zhí)行器,.用于將多個sql語句一次性輸送到數(shù)據(jù)庫執(zhí)行.
  • CachingExecutor:緩存執(zhí)行器, 先從緩存中獲取查詢結(jié)果,存在就返回,不存在,再委托給Executor delegate去數(shù)據(jù)庫取,delegate可以是上面任一的SimpleExecutor、ReuseExecutor、BatchExecutor

Executor的創(chuàng)建

在SqlSessionFactory創(chuàng)建完成后,調(diào)用openSession方法:

    public SqlSession openSession() {
        return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
    }

在SqlSessionFactory的默認(rèn)實現(xiàn)類DefaultSqlSessionFactory可以看到openSession中調(diào)用了openSessionFromDataSource,在這個方法中會創(chuàng)建一個執(zhí)行器,代碼如下

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
        Transaction tx = null;

        DefaultSqlSession var8;
        try {
            Environment environment = this.configuration.getEnvironment();
            TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
            tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
            Executor executor = this.configuration.newExecutor(tx, execType);
            var8 = new DefaultSqlSession(this.configuration, executor, autoCommit);
        } catch (Exception var12) {
            this.closeTransaction(tx);
            throw ExceptionFactory.wrapException("Error opening session.  Cause: " + var12, var12);
        } finally {
            ErrorContext.instance().reset();
        }

        return var8;
    }

執(zhí)行器對象是由Coniguration對象負(fù)責(zé)創(chuàng)建的.Configuration對象會根據(jù)得到ExecutorType創(chuàng)建對應(yīng)的Excecutor對象,并把這個Excecutor對象傳給SqlSession對象

ExcecutorType的選擇

ExecutorType來決定Configuration對象創(chuàng)建何種類型的執(zhí)行器.它的賦值可以通過兩個地方進(jìn)行賦值.

首先.可以通過<settings>標(biāo)簽來設(shè)置當(dāng)前工程中所有SqlSession對象使用的默認(rèn)Executour

image

也可以通過SqlSessoinFactory中openSession方法來指定具體的SqlSession使用的執(zhí)行器

image

原文地址

http://cbaj.gitee.io/blog/2020/07/25/mybatis%E5%9B%9B%E5%A4%A7%E7%A5%9E%E5%99%A8%E4%B9%8BExecutor%E6%89%A7%E8%A1%8C%E5%99%A8/#more

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容