mybatis插件

Author Avatar
丁起男 10月 12,2020
  • 在其它设备中阅读本文章

mybatis插件

mybatis插件又称拦截器

采用责任链模式,通过动态代理组织多个插件

实现步骤

  1. 实现org.apache.ibatis.plugin.Interceptor接口
  2. 添加org.apache.ibatis.plugin.Intercepts注解
  3. 注册插件

可被拦截的类型

  1. Executor:拦截执行器的方法。executor是mybatis的内部执行器,它负责调用StatementHandler操作数据库,并把结果集通过ResultSetHandler进行自动映射,另外他还处理了二级缓存的操作。
  2. ParameterHandler:拦截参数的处理。ParameterHandler是mybatis实现sql入参设置的对象。插件可以改变我们sql的参数默认设置。
  3. ResultHandler:拦截结果集的处理。ResultHandler是mybatis把ResultSet集合映射成pojo的捷尔克对象。
  4. 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:对应接口中方法的参数

可拦截的方法

方法
Executorupdate、query、flushStatements、commit、rollback、getTransaction、close、isClosed
ParameterHandlergetParameterObject、setParameters
ResultSetHandlerhandlerResultSets、handleOutputParameters
StatementHandlerprepare、parameterize、batch、update、query