← 每日面试题 学习看板

Mybatis插件的运行原理

面试题/00java/04 框架/03Mybatis/Mybatis插件的运行原理.md

面试记录 2026-10-11

题目:Mybatis插件的运行原理

难度:medium

标签:spring/mybatis, difficulty/medium

评分:⭐⭐⭐☆☆(3/5)

我的回答

MyBatis 插件的运行原理主要是还是基于代理,将数据库方面的,比如说分页的操作,它将通过代理在执行数据库 SQL 的时候,在数据库执行的 SQL 语句中进行插入代理的操作,把分页方面的内容植入到当前执行的 SQL 中,最终实现插件的分页。其他的插件也是类似原理,主要是在数据库 SQL 执行前进行植入,将自己目标的一些内容植入进去,然后最终实现插件的目标。

点评

优点:

不足:

补充:

完整讲解

第一部分:知识重点剖析

核心考点定位:考察 MyBatis 插件机制的实现原理,理解动态代理在框架中的应用。

知识点拆解:

  1. 插件机制核心:
  1. 4 个可拦截的接口:
  1. 拦截流程:
  1. 分页插件原理:
  1. 常见插件:

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. MyBatis 插件可以拦截哪些接口?
  1. 分页插件是怎么实现分页的?
  1. JDK 动态代理和 CGLIB 代理有什么区别?

第三部分:面试者参考回答(三步法口语化,300-400 字)

【一句话结论】

面试官您好,MyBatis 插件基于 JDK 动态代理实现,通过拦截核心接口在 SQL 执行前后植入逻辑。

【三点展开】

第一,核心机制是基于 JDK 动态代理。实现 Interceptor 接口,通过 @Intercepts 注解标注拦截目标,在 intercept() 方法中执行 before/after 逻辑。

第二,可以拦截 4 个核心接口:Executor(执行 SQL)、StatementHandler(处理 SQL 语句)、ParameterHandler(处理参数)、ResultSetHandler(处理结果集)。分页插件通常拦截 StatementHandler 的 prepare 方法。

第三,分页插件使用 JSqlParser 解析 SQL,添加 LIMIT/OFFSET 分页语句,优化 COUNT 查询(去掉 ORDER BY)。MyBatis-Plus 的多租户插件也是类似原理。

【一句边界】

当然,插件基于动态代理实现,只能拦截接口方法,不能拦截 final 方法或私有方法。