MyBatis‑Plus & MyBatis‑Flex 区别

一、MyBatis 拦截器

1、是什么

MyBatis 原生插件机制,底层基于 JDK 动态代理,代理 MyBatis 四大对象: Executor、StatementHandler、ParameterHandler、ResultSetHandler

2、什么时候触发、需要什么配置才会生效(重点新增)

  1. 默认不生效!必须手动配置注册拦截器才会走拦截逻辑
  2. MyBatis‑Plus 必须手动注入 MybatisPlusInterceptor Bean,并且添加对应内部插件
  3. 只要该拦截器 Bean 存在,每一次执行 Mapper 增删改查都会触发
  4. 触发时机:SQL 已经生成完成,但还没发送给数据库执行,拦截器先加工处理

3、能干什么

拦截器不会从零组装完整 SQL 。 拿到已经生成好的原始 SQL,做解析、修改、追加条件;也可以修改入参、处理返回结果。

4、MybatisPlusInterceptor(Plus 核心复合拦截器)

必须手动配置 Bean 才生效,内部包含多个子插件:

  • 分页插件:拿到原始 select 语句,解析 SQL,拼接 limit;额外生成 count 统计 SQL,封装 Page 分页对象
  • 多租户:自动 where 后拼接 tenant_id = ?
  • 逻辑删除:把 delete 语句改写为 update set deleted=1 where ...
  • 乐观锁:自动拼接 version 版本条件
  • 防全表更新删除:拦截不带 where 条件的 update/delete

拦截器代价: 需要运行时解析 SQL,有 CPU 开销;多个插件顺序错误会产生 bug;部分复杂 SQL 解析会出错。

5、MyBatis‑Flex 拦截器说明

框架自带 CRUD完全不依赖拦截器 ,无需配置、无 SQL 解析开销; 业务依旧可以自定义 MyBatis 拦截器做日志、监控、数据权限。


二、Wrapper 条件构造器

作用:动态组装 SQL 的 where 查询条件,避免手写字符串拼接,防止 SQL 注入

  • QueryWrapper:直接写字段字符串,字段写错运行时才报错
  • LambdaQueryWrapper:Lambda 方法引用,编译期校验字段,写错直接编译报错,项目优先使用

重点:Wrapper 只拼 where 条件,不能生成完整 SQL


三、执行流程对比

MyBatis‑Plus 执行流程

业务代码 → LambdaQueryWrapper 组装 where 条件 → BaseMapper 生成基础 SQL → MybatisPlusInterceptor 拦截器解析、改写 SQL → SQL 提交数据库执行

MyBatis‑Flex 执行流程

业务代码 → QueryChain/Wrapper 组装条件 → 框架内部直接拼接完整最终 SQL → 通过 @SelectProvider 交给 MyBatis 执行,没有拦截器二次解析改写步骤


四、MyBatis‑Flex 为什么理论更快

  1. 省去拦截器解析、改写现有 SQL的运行时开销
  2. APT 编译期生成表、字段常量,大幅减少运行时反射
  3. 依赖轻量化,仅依赖原生 MyBatis

重要提醒:绝大多数业务瓶颈在数据库,普通业务两者性能感知差距很小;高频简单单表查询Flex 优势更明显,不能过度夸大性能。


五、优缺点对比

MyBatis‑Plus

✅优点

  1. 国内生态成熟,网上资料、BUG 解决方案极多
  2. Wrapper 上手简单,代码生成器完善,团队学习成本低

❌缺点

  1. 分页、租户、逻辑删除全部靠拦截器实现,插件顺序容易踩坑
  2. 分页需要解析原始 SQL,部分复杂 SQL 解析存在 BUG
  3. 多表 join 能力弱,复杂关联基本要手写 XML

MyBatis‑Flex

✅优点

  1. CRUD 不走拦截器,性能更好,SQL 调试直观
  2. 原生支持多表查询:left join、union,大量场景不用写 XML
  3. APT 编译期校验字段,错误在编译阶段暴露,不报线上错

❌缺点

  1. 社区体量小,网上现成方案少,依赖官方文档 / 源码
  2. 老项目迁移成本高,团队有学习成本

六、面试选型话术

老项目、团队熟悉 MyBatis‑Plus,继续用 Plus,生态稳定; 新项目、多表查询多、追求性能和稳定性,优先 MyBatis‑Flex。


七、高频面试问答(完整版)

  1. 拦截器是组装完整 SQL 吗? 不是,拦截器是拿到已有 SQL,解析 + 修改 + 追加;Flex 才是直接拼完整 SQL。
  2. Flex 完全不能用拦截器吗? 框架 CRUD 不用;业务自定义拦截器(日志、监控、数据权限)依旧正常使用。
  3. LambdaWrapper 好处? 编译期校验字段,杜绝字符串写错导致的线上 BUG。
  4. Wrapper 作用? 专门动态构建 where 查询条件。
  5. Plus 分页为什么必须配置拦截器? Plus 分页功能完全依赖拦截器插件,不配置 Bean 分页直接失效,total 永远为 0。
  6. 拦截器什么时候会执行? 手动注册拦截器 Bean 后,所有 Mapper 增删改查都会经过拦截器链,不需要处理的 SQL 插件直接放行。
相关推荐
ai小陈18 小时前
GPU服务器租用存储验收:检查点写入与磁盘吞吐实战
运维·服务器·人工智能·ai·ssh·gpu算力
PaperData18 小时前
1985-2025年全国区县专利申请与授权面板数据
数据库
snpgroupcn18 小时前
大数据量SAP迁移方案:系统越大,越不能硬搬
数据库·sap
leikooo18 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
Flynt19 小时前
Redis Cluster主节点挂了,为什么"高可用"还全员掉线?我把三次kill的记录翻出来了
数据库·redis·分布式
笃行35019 小时前
KingbaseES 数据加密全解:从 SSL 到全密态
数据库
Ivanqhz19 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
沙漠之主20 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
FPGA小徐20 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
YOLO数据集集合21 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化