什麼是外掛程式?
外掛程式是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個建立的時候被 多個外掛程式的時候,執行順序 被 的順序...