MyBatis 拦截器(插件)深度解析:从原理到实战扩展
MyBatis 拦截器(又称插件)是 MyBatis 最强大的扩展机制,允许开发者在不修改 MyBatis 核心源码的前提下,通过动态代理对 SQL 执行流程中的关键节点进行拦截,插入自定义逻辑(如日志记录、性能监控、SQL 改写、参数加密等)。从 “核心定位→接口设计→拦截原理→实战开发” 四个维度,彻底拆解 MyBatis 拦截器的工作机制。
拦截器核心定位与拦截对象
MyBatis 拦截器的核心是 “拦截四大核心对象的方法调用”,这四大对象是 MyBatis 执行 SQL 的关键组件,覆盖 “SQL 执行→参数处理→结果映射” 全流程。
四大可拦截对象与拦截点
MyBatis 仅允许拦截以下四类核心对象的特定方法,其他对象无法通过拦截器扩展:
| 可拦截对象 | 核心作用 | 允许拦截的方法(示例) | 典型应用场景 |
|---|---|---|---|
| Executor | SQL 执行器(调度 StatementHandler) | query()、update()、commit()、rollback() |
全局 SQL 日志、缓存扩展、性能监控 |
| ParameterHandler | 参数处理器(绑定 SQL 参数) | getParameterObject()、setParameters() |
参数加密 / 解密、参数校验 |
| ResultSetHandler | 结果集处理器(映射结果) | handleResultSets()、handleOutputParameters() |
结果加密 / 解密、结果过滤、数据脱敏 |
| StatementHandler | SQL 语句处理器(创建 Statement) | prepare()、parameterize()、update()、query() |
SQL 改写(如动态加租户条件)、执行日志 |
注意:拦截器只能拦截上述对象的特定方法(需通过
@Signature精确匹配方法名和参数列表),无法拦截对象的所有方法。
拦截器的核心价值
- 无侵入扩展:无需修改 MyBatis 核心代码,通过配置即可接入自定义逻辑;
- 粒度可控:可精确指定拦截的对象、方法和参数,避免全局影响;
- 责任链模式:支持多个拦截器叠加,形成拦截链,按配置顺序执行。
拦截器核心接口与注解
MyBatis 为拦截器定义了统一的接口规范(Interceptor)和注解(@Intercepts/@Signature),开发者需遵循该规范实现自定义拦截器。
1. Interceptor 接口:拦截器的标准定义
Interceptor 是所有自定义拦截器的顶层接口,定义了三个核心方法,分别对应 “拦截逻辑”“代理生成” 和 “参数初始化”: