MyBatis介紹
MyBatis本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。它支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的Java對象)映射成數據庫中的記錄。
MyBatis攔截器介紹
MyBatis提供了一種插件(plugin)的功能,雖然叫做插件,但其實這是攔截器功能。MyBatis 允許你在已映射語句執行過程中的某一點進行攔截調用。對于攔截器Mybatis為我們提供了一個Interceptor接口,通過實現該接口就可以定義我們自己的攔截器。
MyBatis默認調用四種類型的方法:
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的一個操作(新增,刪除,修改,查詢)中都會被執行到,執行的先后順序是Executor,ParameterHandler,ResultSetHandler,StatementHandler。
接口的定義是:

這三個方法中,plugin用于處理器的構建,intercept用于處理代理類,setProperties用語攔截器屬性設置。
Plugin類實現了InvocationHandler的接口,返回了一個JDK自身的動態動態代理類,對于plugin的wrap方法:

判斷當前目標對象是否有實現對應需要攔截的接口,如果沒有則返回目標對象本身,如果有則返回一個代理對象。
代理對象的InvocationHandler正是一個Plugin,當目標對象執行接口方法時,如果是通過代理對象執行的,會調用invocationHandler的invoke方法,就是Plugin的invoke方法:

如果當前執行的方法是定義好的需要攔截的方法,則把目標對象、要執行的方法以及方法參數封裝成一個Invocation對象,再把封裝好的Invocation作為參數傳遞給當前攔截器的intercept方法。如果不需要攔截,則直接調用當前的方法。
對于getSignatureMap方法

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

攔截器的可配置性:

新聞熱點
疑難解答