org.apache.ibatis.plugin.Interceptor 接口是 MyBatis 插件体系的核心。它的主要作用是允许开发者在不修改 MyBatis 源代码的情况下,拦截并介入 MyBatis 核心组件(如 Executor、StatementHandler 等)的方法执行过程,从而添加自定义逻辑或修改其默认行为。
我们可以将 Interceptor 理解为一个切面 (Aspect),它能够在 MyBatis 执行 SQL 的关键路径上插入自定义的处理代码。
Interceptor 接口的核心作用包括:
- 拦截方法调用: 捕获对 MyBatis 核心组件特定方法的调用。
- 执行自定义逻辑: 在被拦截方法执行之前、之后或完全替代原始方法执行自定义代码(例如记录日志、性能监控、参数修改、结果修改、分页处理、数据脱敏、权限控制等)。
- 修改行为: 可以改变原始方法的参数或返回值。
- 控制流程: 可以决定是否继续执行原始方法(通过调用
invocation.proceed())。 - 链式处理: 支持多个插件按照配置顺序形成责任链,依次处理同一个拦截点。
Interceptor 接口提供了哪些拦截点?
MyBatis 并非允许拦截所有内部方法,而是预定义了四个核心接口的特定方法作为稳定且推荐的拦截点。开发者通过 @Intercepts 和 @Signature 注解来声明希望拦截的具体方法签名。这四个核心接口分别是:
-
Executor(执行器)- 作用: 负责 SQL 语句的生成和查询缓存的维护,以及事务的管理。它是 SQL 执行的顶层入口。
- 可拦截方法示例:
update(MappedStatement ms, Object parameter): 执行 INSERT, UPDATE, DELETE 语句。query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey cacheKey, BoundSql boundSql): 执行 SELECT 语句,处理缓存。query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler): 执行 SELECT 语句的另一个重载。commit(boolean required): 提交事务。rollback(boolean required): 回滚事务。close(boolean forceRollback): 关闭 Executor。
- 常见用途: 缓存管理扩展、性能监控、读写分离路由、事务控制增强等。
-
StatementHandler(语句处理器)- 作用: 封装了对 JDBC
Statement的操作,如创建Statement对象、设置参数、执行 SQL 等。它是ParameterHandler和ResultSetHandler的上层协调者。 - 可拦截方法示例:
prepare(Connection connection, Integer transactionTimeout): 准备Statement对象。parameterize(Statement statement): 设置 SQL 参数 (调用ParameterHandler)。batch(Statement statement): 执行批量 SQL。update(Statement statement): 执行更新操作。query(Statement statement, ResultHandler resultHandler): 执行查询操作 (调用ResultSetHandler)。
- 常见用途: 物理分页(修改 SQL 语句添加分页关键字)、SQL 语句重写、SQL 审计、分库分表路由(根据 SQL 或参数判断)。
- 作用: 封装了对 JDBC
-
ParameterHandler(参数处理器)- 作用: 负责将用户传入的参数对象映射并设置到 JDBC
PreparedStatement的参数占位符上。 - 可拦截方法示例:
setParameters(PreparedStatement ps): 将参数设置到PreparedStatement。getParameterObject(): 获取传入的参数对象。
- 常见用途: 参数加密、特殊数据类型处理、参数审计、修改传入参数值。
- 作用: 负责将用户传入的参数对象映射并设置到 JDBC
-
ResultSetHandler(结果集处理器)- 作用: 负责将 JDBC 查询返回的
ResultSet映射成 Java 对象列表或单个对象。 - 可拦截方法示例:
handleResultSets(Statement stmt): 处理ResultSet并返回映射后的对象列表。handleOutputParameters(CallableStatement cs): 处理存储过程的输出参数。
- 常见用途: 结果解密、数据脱敏(如隐藏部分手机号、身份证号)、自定义类型转换、结果对象结构调整。
- 作用: 负责将 JDBC 查询返回的
总结:
Interceptor 接口是 MyBatis 提供的一个钩子 (Hook),允许开发者通过实现该接口并配置,在 Executor、StatementHandler、ParameterHandler、ResultSetHandler 这四个核心组件的关键方法执行时插入自定义逻辑,从而实现对 MyBatis 功能的灵活扩展和定制,而无需修改框架本身。

2644

被折叠的 条评论
为什么被折叠?



