Mybatis拦截器的实现介绍
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方法对应的参数。
拦截器的可配置性: