MyBatis介紹
MyBatis本是apache的一個(gè)開(kāi)源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis 。它支持普通 SQL查詢(xún),存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis 使用簡(jiǎn)單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄。
MyBatis攔截器介紹
MyBatis提供了一種插件(plugin)的功能,雖然叫做插件,但其實(shí)這是攔截器功能。MyBatis 允許你在已映射語(yǔ)句執(zhí)行過(guò)程中的某一點(diǎn)進(jìn)行攔截調(diào)用。對(duì)于攔截器Mybatis為我們提供了一個(gè)Interceptor接口,通過(guò)實(shí)現(xiàn)該接口就可以定義我們自己的攔截器。
MyBatis默認(rèn)調(diào)用四種類(lèi)型的方法:
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個(gè)都是Configuration的方法,這些方法在MyBatis的一個(gè)操作(新增,刪除,修改,查詢(xún))中都會(huì)被執(zhí)行到,執(zhí)行的先后順序是Executor,ParameterHandler,ResultSetHandler,StatementHandler。
接口的定義是:
這三個(gè)方法中,plugin用于處理器的構(gòu)建,intercept用于處理代理類(lèi),setProperties用語(yǔ)攔截器屬性設(shè)置。
Plugin類(lèi)實(shí)現(xiàn)了InvocationHandler的接口,返回了一個(gè)JDK自身的動(dòng)態(tài)動(dòng)態(tài)代理類(lèi),對(duì)于plugin的wrap方法:
判斷當(dāng)前目標(biāo)對(duì)象是否有實(shí)現(xiàn)對(duì)應(yīng)需要攔截的接口,如果沒(méi)有則返回目標(biāo)對(duì)象本身,如果有則返回一個(gè)代理對(duì)象。
代理對(duì)象的InvocationHandler正是一個(gè)Plugin,當(dāng)目標(biāo)對(duì)象執(zhí)行接口方法時(shí),如果是通過(guò)代理對(duì)象執(zhí)行的,會(huì)調(diào)用invocationHandler的invoke方法,就是Plugin的invoke方法:
如果當(dāng)前執(zhí)行的方法是定義好的需要攔截的方法,則把目標(biāo)對(duì)象、要執(zhí)行的方法以及方法參數(shù)封裝成一個(gè)Invocation對(duì)象,再把封裝好的Invocation作為參數(shù)傳遞給當(dāng)前攔截器的intercept方法。如果不需要攔截,則直接調(diào)用當(dāng)前的方法。
對(duì)于getSignatureMap方法
getSignatureMap是首先會(huì)拿到攔截器這個(gè)Intercept注解,遍歷拿到type屬性,然后根據(jù)這個(gè)type得到帶有method屬性和args屬性的method,最終返回一個(gè)type為key,value為Set<Method>的Map。例對(duì)Executor.class的update方法進(jìn)行過(guò)濾,會(huì)產(chǎn)生key為Executro,value為Method實(shí)例,里面帶有MappedStatement和method方法對(duì)應(yīng)的參數(shù)。
攔截器的可配置性:
原文鏈接:http://blog.csdn.net/czengze/article/details/52976457