Mybatis外掛程式的原理及如何實現?

2021-10-09 12:50:12 字數 2082 閱讀 6587

什麼是外掛程式?

外掛程式是mybatis中的最重要的功能之一,能夠對特定元件的特定方法進行增強。

mybatis 允許你在對映語句執行過程中的某一點進行攔截呼叫。預設情況下,mybatis 允許使用外掛程式來攔截的方法呼叫包括:

「executor」:update, query, flushstatements, commit, rollback, gettransaction, close, isclosed

「parameterhandler」: getparameterobject, setparameters

「resultsethandler」:handleresultsets, handleoutputparameters

「statementhandler」: prepare, parameterize, batch, update, query

如何自定義外掛程式?

外掛程式的實現其實很簡單,只需要實現mybatis提供的interceptor這個介面即可,原始碼如下:

public inte***ce interceptor

舉個栗子

有這樣乙個需求:需要在mybatis執行的時候篡改selectbyuserid的引數值。

「分析」:修改sql的入參,應該在哪個元件的哪個方法上攔截篡改呢?研究過原始碼的估計都很清楚的知道,parameterhandler中的setparameters()方法就是對引數進行處理的。因此肯定是攔截這個方法是最合適。

自定義的外掛程式如下:

/**

@override

public object plugin(object target)

@override

public void setproperties(properties properties)

}

intercept方法:最終會攔截的方法,最重要的乙個方法。

plugin方法:返回乙個**物件,如果沒有特殊要求,直接使用mybatis的工具類plugin返回即可。

setproperties:設定一些屬性,不重要。

用到哪些註解?

自定義外掛程式需要用到兩個註解,分別是@intercepts和@signature。

@intercepts:標註在實現類上,表示這個類是乙個外掛程式的實現類。

@signature:作為@intercepts的屬性,表示需要增強mybatis的某些元件中的某些方法(可以指定多個)。常用的屬性如下:

class<?> type():指定哪個元件(executor、parameterhandler、resultsethandler、statementhandler)

string method():指定增強元件中的哪個方法,直接寫方法名稱。

class<?> args():方法中的引數,必須一一對應,可以寫多個;這個屬性非常重用,區分過載方法。

如何注入mybatis?

上面已經將外掛程式定義好了,那麼如何注入到mybatis中使其生效呢?

從上圖我們知道,這外掛程式最終還是從ioc容器中獲取的interceptor這個bean,因此我們只需要在配置類中注入這個bean即可,如下**:

}測試**傳入的是1222,由於外掛程式改變了入參,因此查詢出來的應該是admin_1這個人。

外掛程式原理分析

外掛程式的原理其實很簡單,就是在建立元件的時候生成**物件(plugin),執行元件方法的時候攔截即可。下面就來詳細介紹一下外掛程式在mybatis底層是如何工作的?

mybatis的四大元件都是在mybatis的配置類configuration中建立的,具體的方法如下:

//建立executor

public executor newexecutor(transaction transaction, executortype executortype) else if (executortype.reuse == executortype) else

if (cacheenabled)

//呼叫pluginall方法,生成**物件

executor = (executor) interceptorchain.pluginall(executor);

return executor;

}

mybatis外掛程式開發原理及方法

mybatis在四大物件的建立過程中,都會有外掛程式進行介入。在四大物件建立的時候 1.每個建立出來的物件不是直接返回的,而是 interceptorchain.pluginall parameterhandler 2.獲取到所有的interceptor 外掛程式需要實現的介面 呼叫intercep...

mybatis 外掛程式原理

1 mybatis初始化 每個基於 mybatis 的應用都是以乙個 sqlsessionfactory 的例項為中心的。sqlsessionfactory 的例項可以通過 sqlsessionfactorybuilder 獲得。而 sqlsessionfactorybuilder 則可以從 xml...

Mybatis 外掛程式原理

哪些物件允許被 外掛程式 executor parameterhandler statementhandler resultsethandler 什麼時候建立 物件 executor sqlsession.opensession的時候被 其他3個建立的時候被 多個外掛程式的時候,執行順序 被 的順序...