记录 有关mybatis拦截器

用@Intercepts拦截和mybatisPlusInterceptor.addInnerInterceptor()方法拦截有什么区别

一、语法和使用方式

  1. @Intercepts注解方式:
    • 这是通过 Java 注解的方式来定义拦截器。需要在拦截器类上使用@Intercepts注解,并指定要拦截的目标对象类型(如StatementHandlerExecutor等)、方法名以及方法参数类型。
    • 这种方式更加显式地指定了拦截的具体位置和条件,对于熟悉 MyBatis 底层 API 的开发者来说,可以更精确地控制拦截的时机和对象。
         @Intercepts({
             @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}),
             // 其他签名
         })
         public class CustomInterceptor implements Interceptor {
             // 拦截器实现
         }
  2. MybatisPlusInterceptor.addInnerInterceptor方式:
    • 这是使用 MyBatis-Plus 提供的MybatisPlusInterceptor类来添加拦截器。通常在配置类中进行设置,将自定义的拦截器添加到 MyBatis-Plus 的拦截器链中。
    • 这种方式相对更加简洁和方便,尤其对于使用 MyBatis-Plus 的项目,可以直接利用其提供的接口进行拦截器的管理。
    •      @Configuration
           public class MyBatisConfig {
               @Bean
               public MybatisPlusInterceptor mybatisPlusInterceptor() {
                   MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
                   interceptor.addInnerInterceptor(new MybatisPlusAllSqlLog());
                   return interceptor;
               }
           }

二、灵活性和可定制性

  1. @Intercepts注解方式:

    • 由于可以直接指定要拦截的具体方法和参数类型,具有更高的灵活性和可定制性。可以根据项目的特定需求,精确地拦截特定的方法调用,并进行相应的处理。
    • 但是,这种方式需要对 MyBatis 的底层 API 有一定的了解,否则可能会出现错误的配置。
  2. MybatisPlusInterceptor.addInnerInterceptor方式:

    • 虽然相对简洁,但可能在某些情况下灵活性稍逊。MyBatis-Plus 的拦截器管理机制可能会有一些限制,不一定能够满足非常复杂的拦截需求。
    • 不过,对于大多数常见的应用场景,这种方式已经足够方便和实用。

三、维护和可读性

  1. @Intercepts注解方式:

    • 代码中的注解可能会使拦截器的定义与实现紧密耦合,对于不熟悉 MyBatis 底层 API 的人来说,可能不太容易理解和维护。
    • 而且,如果有多个拦截器都使用这种方式定义,可能会使代码看起来比较复杂。
  2. MybatisPlusInterceptor.addInnerInterceptor方式:

    • 通过配置类的方式添加拦截器,使得拦截器的管理更加集中和清晰。在配置类中可以一目了然地看到所有添加的拦截器,提高了代码的可读性和可维护性。

Interceptor和InnerInterceptor是什么,有什么区别

一、Interceptor

  1. 定义:

    • Interceptor是 MyBatis 中的一个接口,用于定义拦截器。它允许开发者在 MyBatis 执行 SQL 语句的特定阶段进行干预,实现自定义的逻辑。
  2. 作用范围:

    • 通常用于拦截 MyBatis 的核心对象,如Executor(执行器)、StatementHandler(语句处理器)、ParameterHandler(参数处理器)和ResultSetHandler(结果集处理器)等。
    • 可以在 SQL 语句执行的不同阶段进行操作,如执行前、执行后、参数设置、结果集处理等。
  3. 实现方式:

    • 实现Interceptor接口需要实现三个方法:interceptpluginsetProperties
    • intercept方法是拦截器的核心方法,在这里编写具体的拦截逻辑。
    • plugin方法用于将目标对象包装成一个代理对象,以便在方法调用时触发拦截器的逻辑。
    • setProperties方法用于接收外部配置的属性,可以在拦截器中使用这些属性进行自定义配置。

二、InnerInterceptor

  1. 定义:

    • InnerInterceptor是 MyBatis-Plus 中自定义的一个接口,通常作为 MyBatis-Plus 拦截器体系中的内部拦截器接口。
  2. 作用范围:

    • 主要用于 MyBatis-Plus 特定功能的扩展和增强。例如,分页插件、SQL 执行日志插件等 MyBatis-Plus 的功能通常是通过实现InnerInterceptor接口来实现的。
    • 一般在 MyBatis-Plus 拦截器(如MybatisPlusInterceptor)内部被调用,与 MyBatis-Plus 的特定功能紧密结合。
  3. 实现方式:

    • 实现InnerInterceptor接口需要根据具体的需求实现相应的方法。不同的内部拦截器可能有不同的方法集,具体取决于其功能。
    • 例如,分页拦截器可能需要实现判断是否进行分页查询、在查询前进行分页参数设置等方法。

三、区别总结

  1. 作用层次不同:

    • Interceptor是 MyBatis 层面的拦截器,可以拦截 MyBatis 的核心对象,作用范围更广。
    • InnerInterceptor是 MyBatis-Plus 特定的内部拦截器,主要用于 MyBatis-Plus 的功能扩展,作用相对较窄。
  2. 功能定位不同:

    • Interceptor更通用,可以用于各种自定义的逻辑干预,不限于特定的框架功能。
    • InnerInterceptor通常与 MyBatis-Plus 的特定功能相关联,是为了实现 MyBatis-Plus 的特定需求而设计的。
  3. 使用方式不同:

    • Interceptor需要在 MyBatis 的配置文件中进行注册,或者通过代码手动添加到 MyBatis 的插件链中。
    • InnerInterceptor通常通过 MyBatis-Plus 的拦截器管理类(如MybatisPlusInterceptor)进行添加和管理

最后自己总结

实现了InnerInterceptor类的类 可以用MybatisPlusInterceptor里的addInnerInterceptor()方法来把这个拦截器放进去,也可以自己写一个手动放进去。但是实现了Interceptor类的类不能用addInnerInterceptor()方法,用@Intercepts来自己写,实现一些拦截需求。

还有需要学习的地方:

就是,MybatisPlusInterceptor里的addInnerInterceptor()方法和@Intercepts他们的拦截链是怎么样的,都是怎么注入进去的,他们是把拦截的条件加到一起了,还是有不同的拦截器,顺序又是什么。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值