介绍
在 MyBatis 中,拦截器(Interceptor)是一种强大的机制,用于拦截 SQL 语句的执行过程,可以在执行 SQL 前后进行一些自定义的操作,比如日志记录、权限验证、性能监控等。在 MyBatis 中,拦截器主要通过实现 org.apache.ibatis.plugin.Interceptor
接口来实现。
MyBatis 四种类型拦截器
-
ParameterHandler 拦截器
- 在设置 SQL 语句的参数时触发,可以在参数设置前后进行自定义的处理。
-
ResultSetHandler 拦截器
- 在结果集(ResultSet)处理时触发,可以在结果集处理前后进行自定义的处理,比如将结果集映射到对象前进行一些额外的操作。
-
StatementHandler 拦截器
- 在 SQL 语句的执行过程中触发,可以在 SQL 语句执行前后进行自定义的处理,比如动态修改 SQL、增加额外的逻辑等。
-
Executor 拦截器
- 在执行器(Executor)执行增删改查操作时触发,可以在操作执行前后进行自定义的处理,比如监控执行时间、权限验证等。
MyBatis 拦截器执行流程
-
创建拦截器链
- 当 MyBatis 创建 Configuration 配置对象时,会根据配置文件中的
<plugins>
标签配置,依次创建拦截器链。每个拦截器可以拦截 MyBatis 中的特定接口,比如 Executor、StatementHandler 等。
- 当 MyBatis 创建 Configuration 配置对象时,会根据配置文件中的
-
包装目标对象
- 拦截器会包装目标对象(比如 Executor、StatementHandler 等),生成一个代理对象。这个代理对象实现了目标对象的接口,并且在方法调用时会触发拦截器的逻辑。
-
方法拦截逻辑
- 当调用目标对象的方法时,代理对象会先执行拦截器的
intercept
方法。在这个方法中,可以对方法进行拦截并执行自定义的逻辑。通常,拦截器的intercept
方法中会调用Invocation.proceed()
方法来继续执行链中的下一个拦截器或者最终执行目标方法。
- 当调用目标对象的方法时,代理对象会先执行拦截器的
-
执行目标方法
- 在
Invocation.proceed()
方法执行完毕后,会继续执行目标对象的原始方法。如果拦截器链中还有其他拦截器,则会继续执行下一个拦截器的intercept
方法,直到所有拦截器都执行完毕。
- 在
-
返回结果处理
- 当所有拦截器的
intercept
方法执行完毕后,会返回最终的执行结果给调用方。
- 当所有拦截器的
通过这种拦截器机制,MyBatis 提供了一种非常灵活的扩展方式,可以方便地在 SQL 执行过程中添加额外的功能,而不需要修改已有的业务代码。