Mybatis攔截器的實(shí)現(xiàn)介紹
MyBatis介紹
MyBatis本是apache的一個開源項(xiàng)目iBatis, 2010年這個項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis 。它支持普通 SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis 使用簡單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的Java對象)映射成數(shù)據(jù)庫中的記錄。
MyBatis攔截器介紹
MyBatis提供了一種插件(plugin)的功能,雖然叫做插件,但其實(shí)這是攔截器功能。MyBatis 允許你在已映射語句執(zhí)行過程中的某一點(diǎn)進(jìn)行攔截調(diào)用。對于攔截器Mybatis為我們提供了一個Interceptor接口,通過實(shí)現(xiàn)該接口就可以定義我們自己的攔截器。
MyBatis默認(rèn)調(diào)用四種類型的方法:
1.Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
2.ParameterHandler (getParameterObject, setParameters)
3.ResultSetHandler (handleResultSets, handleOutputParameters)
4.StatementHandler (prepare, parameterize, batch, update, query)
以上4個都是Configuration的方法,這些方法在MyBatis的一個操作(新增,刪除,修改,查詢)中都會被執(zhí)行到,執(zhí)行的先后順序是Executor,ParameterHandler,ResultSetHandler,StatementHandler。
接口的定義是:

這三個方法中,plugin用于處理器的構(gòu)建,intercept用于處理代理類,setProperties用語攔截器屬性設(shè)置。
Plugin類實(shí)現(xiàn)了InvocationHandler的接口,返回了一個JDK自身的動態(tài)動態(tài)代理類,對于plugin的wrap方法:

判斷當(dāng)前目標(biāo)對象是否有實(shí)現(xiàn)對應(yīng)需要攔截的接口,如果沒有則返回目標(biāo)對象本身,如果有則返回一個代理對象。
代理對象的InvocationHandler正是一個Plugin,當(dāng)目標(biāo)對象執(zhí)行接口方法時,如果是通過代理對象執(zhí)行的,會調(diào)用invocationHandler的invoke方法,就是Plugin的invoke方法:

如果當(dāng)前執(zhí)行的方法是定義好的需要攔截的方法,則把目標(biāo)對象、要執(zhí)行的方法以及方法參數(shù)封裝成一個Invocation對象,再把封裝好的Invocation作為參數(shù)傳遞給當(dāng)前攔截器的intercept方法。如果不需要攔截,則直接調(diào)用當(dāng)前的方法。
對于getSignatureMap方法

getSignatureMap是首先會拿到攔截器這個Intercept注解,遍歷拿到type屬性,然后根據(jù)這個type得到帶有method屬性和args屬性的method,最終返回一個type為key,value為Set<Method>的Map。例對Executor.class的update方法進(jìn)行過濾,會產(chǎn)生key為Executro,value為Method實(shí)例,里面帶有MappedStatement和method方法對應(yīng)的參數(shù)。

攔截器的可配置性:

相關(guān)文章
Java策略模式的簡單應(yīng)用實(shí)現(xiàn)方法
這篇文章主要介紹了Java策略模式的簡單應(yīng)用實(shí)現(xiàn)方法,需要的朋友可以參考下2014-02-02
springboot + rabbitmq 如何實(shí)現(xiàn)消息確認(rèn)機(jī)制(踩坑經(jīng)驗(yàn))
這篇文章主要介紹了springboot + rabbitmq 如何實(shí)現(xiàn)消息確認(rèn)機(jī)制,本文給大家分享小編實(shí)際開發(fā)中的一點(diǎn)踩坑經(jīng)驗(yàn),內(nèi)容簡單易懂,需要的朋友可以參考下2020-07-07
SpringBoot讀取外部的配置文件的代碼實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot讀取外部的配置文件的代碼實(shí)現(xiàn),文中通過代碼示例給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-11-11
將項(xiàng)目上傳到Maven中央倉庫(2023最新版)
本文主要介紹了將項(xiàng)目上傳到Maven中央倉庫(2023最新版),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
java實(shí)現(xiàn)二維碼生成功能詳細(xì)示例
這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)二維碼生成功能的相關(guān)資料,隨著信息化時代的到來,二維碼作為一種信息傳遞的工具,越來越受到人們的歡迎,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07

