了解了Mybatis攔截器的接口Interceptor定義后,還需要進一步搞清楚這三個方法之間的關系,以及能夠攔截哪些方法。
Mybatis在執行攔截器時,對三個接口的執行順序:setProperties->plugin->intercept。先執行參數設置,然后生成代理對象,最后執行具體攔截操作。
在Mybatis官網,對能夠攔截哪些類和方法做了說明。MyBatis 允許在已映射語句執行過程中的某一點調用攔截方法。默認情況下,MyBatis允許使用插件來攔截的方法調用包括:
1.攔截執行器的方法
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
2.攔截參數的處理
ParameterHandler (getParameterObject, setParameters)
3.攔截結果集的處理
ResultSetHandler (handleResultSets, handleOutputParameters)
4.攔截Sql語法構建的處理
StatementHandler (prepare, parameterize, batch, update, query)
要定義攔截器對哪些方法進行攔截,需要在攔截器接口實現類上添加注解@Intercepts。@Intercepts標記一個類是Interceptor,然后在@Intercepts中定義@Signature,即攔截點(可以有多個)。type是指攔截的接口,method是將要攔截的方法,args進一步指定了該方法的參數類型,以區分重載方法。
下面是一個注解的例子:
@Intercepts({@Signature(
type= Executor.class,
method = "update",
args = {MappedStatement.class,Object.class})
})
該注解對的含義是,攔截Executor接口的update方法(其實也就是SqlSession的新增,刪除,修改操作),所有執行executor的update方法(有兩個參數:MappedStatement.class,Object.class)都會被添加了該注解的攔截器攔截到。