题目:Mybatis插件的运行原理
难度:medium
标签:spring/mybatis, difficulty/medium
评分:⭐⭐⭐☆☆(3/5)
MyBatis 插件的运行原理主要是还是基于代理,将数据库方面的,比如说分页的操作,它将通过代理在执行数据库 SQL 的时候,在数据库执行的 SQL 语句中进行插入代理的操作,把分页方面的内容植入到当前执行的 SQL 中,最终实现插件的分页。其他的插件也是类似原理,主要是在数据库 SQL 执行前进行植入,将自己目标的一些内容植入进去,然后最终实现插件的目标。
优点:
不足:
补充:
核心考点定位:考察 MyBatis 插件机制的实现原理,理解动态代理在框架中的应用。
知识点拆解:
Interceptor@Intercepts(标注拦截目标)Executor:执行 SQL 操作(增删改查)StatementHandler:处理 SQL 语句(预编译、参数绑定)ParameterHandler:处理参数(设置参数值)ResultSetHandler:处理结果集(结果映射)intercept(Object target, Method method, Object[] args) 方法before 阶段:修改 SQL 或参数after 阶段:处理结果method.invoke() 执行原始方法StatementHandler 的 prepare 方法考察方向:
延伸递进面试题:
【一句话结论】
面试官您好,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 方法或私有方法。