mybatis插件
mybatis插件又称拦截器
采用责任链模式,通过动态代理组织多个插件
实现步骤
- 实现org.apache.ibatis.plugin.Interceptor接口
- 添加org.apache.ibatis.plugin.Intercepts注解
- 注册插件
可被拦截的类型
- Executor:拦截执行器的方法。executor是mybatis的内部执行器,它负责调用StatementHandler操作数据库,并把结果集通过ResultSetHandler进行自动映射,另外他还处理了二级缓存的操作。
- ParameterHandler:拦截参数的处理。ParameterHandler是mybatis实现sql入参设置的对象。插件可以改变我们sql的参数默认设置。
- ResultHandler:拦截结果集的处理。ResultHandler是mybatis把ResultSet集合映射成pojo的捷尔克对象。
- StatementHandler:拦截sql语法构建的处理。StatementHandler是MyBatis直接和数据库执行sql脚本的对象。另外它也实现了mybatis的一级缓存。
拦截器方法
-
setProperties:如果拦截器需要一些变量对象,而且这个对象是可配置的,可以使用次方法,类似于spring中的@Value("${}")。
-
plugin:让mybatis判断,是否要进行拦截,然后做出决定是否生成一个代理。每经过一个拦截器都会调用一次plugin方法,也就是说,该方法会调用4次。由@Intercepts注解决定是否进行拦截
Plugin.wrap(target,this)的作用:
根据@Intercepts注解判断是否拦截这个类型对象,然后决定是返回一个代理对象还是返回原对象
-
intercept:处理拦截到的对象
Invocation常用方法:
方法名 作用 getTarget 获取被代理对象 getMethod 获取被代理方法 getArgs 获取方法参数列表 proceed 执行被拦截方法
拦截器注解
自定义拦截器必须使用@Intercepts来声明要拦截的类型对象
具体规则
- @Intercepts:标识该类是一个拦截器,可以配置多个@Signature
- @Signature:指明自定义拦截器需要拦截哪一个类型和方法
- type:对应四种类型的一种
- method:对应接口中的方法名
- args:对应接口中方法的参数
可拦截的方法
类 | 方法 |
---|---|
Executor | update、query、flushStatements、commit、rollback、getTransaction、close、isClosed |
ParameterHandler | getParameterObject、setParameters |
ResultSetHandler | handlerResultSets、handleOutputParameters |
StatementHandler | prepare、parameterize、batch、update、query |