Mybatis Interceptor 接口的作用是什么? 它提供了哪些拦截点?

org.apache.ibatis.plugin.Interceptor 接口是 MyBatis 插件体系的核心。它的主要作用是允许开发者在不修改 MyBatis 源代码的情况下,拦截并介入 MyBatis 核心组件(如 Executor、StatementHandler 等)的方法执行过程,从而添加自定义逻辑或修改其默认行为

我们可以将 Interceptor 理解为一个切面 (Aspect),它能够在 MyBatis 执行 SQL 的关键路径上插入自定义的处理代码。

Interceptor 接口的核心作用包括:

  1. 拦截方法调用: 捕获对 MyBatis 核心组件特定方法的调用。
  2. 执行自定义逻辑: 在被拦截方法执行之前、之后或完全替代原始方法执行自定义代码(例如记录日志、性能监控、参数修改、结果修改、分页处理、数据脱敏、权限控制等)。
  3. 修改行为: 可以改变原始方法的参数或返回值。
  4. 控制流程: 可以决定是否继续执行原始方法(通过调用 invocation.proceed())。
  5. 链式处理: 支持多个插件按照配置顺序形成责任链,依次处理同一个拦截点。

Interceptor 接口提供了哪些拦截点?

MyBatis 并非允许拦截所有内部方法,而是预定义了四个核心接口的特定方法作为稳定且推荐的拦截点。开发者通过 @Intercepts@Signature 注解来声明希望拦截的具体方法签名。这四个核心接口分别是:

  1. 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。
    • 常见用途: 缓存管理扩展、性能监控、读写分离路由、事务控制增强等。
  2. StatementHandler (语句处理器)

    • 作用: 封装了对 JDBC Statement 的操作,如创建 Statement 对象、设置参数、执行 SQL 等。它是 ParameterHandlerResultSetHandler 的上层协调者。
    • 可拦截方法示例:
      • 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 或参数判断)。
  3. ParameterHandler (参数处理器)

    • 作用: 负责将用户传入的参数对象映射并设置到 JDBC PreparedStatement 的参数占位符上。
    • 可拦截方法示例:
      • setParameters(PreparedStatement ps): 将参数设置到 PreparedStatement
      • getParameterObject(): 获取传入的参数对象。
    • 常见用途: 参数加密、特殊数据类型处理、参数审计、修改传入参数值。
  4. ResultSetHandler (结果集处理器)

    • 作用: 负责将 JDBC 查询返回的 ResultSet 映射成 Java 对象列表或单个对象。
    • 可拦截方法示例:
      • handleResultSets(Statement stmt): 处理 ResultSet 并返回映射后的对象列表。
      • handleOutputParameters(CallableStatement cs): 处理存储过程的输出参数。
    • 常见用途: 结果解密、数据脱敏(如隐藏部分手机号、身份证号)、自定义类型转换、结果对象结构调整。

总结:

Interceptor 接口是 MyBatis 提供的一个钩子 (Hook),允许开发者通过实现该接口并配置,在 ExecutorStatementHandlerParameterHandlerResultSetHandler 这四个核心组件的关键方法执行时插入自定义逻辑,从而实现对 MyBatis 功能的灵活扩展和定制,而无需修改框架本身。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值