你每天加班写的 XML,其实是在为 MyBatis 的历史惯性买单
作者注这不是一篇框架对比评测是一次关于技术选择背后社会机制的深度反思。基于十余年企业级开发实践以及一套名为 SimpleDAOSpring Jdbc Ultra的框架的生产验证我们来讨论一个被长期忽视的问题一个有明显缺陷的技术为什么能在市场上流行这么多年为什么一个有明显缺陷的技术能流行MyBatis 的流行不是技术选择的结果是多重力量共同塑造的现状。它流行不代表它好。它流行只说明它在特定历史时期解决了特定问题然后被惯性推着走了十几年。我们今天来拆解这背后的力量。一、原生缺陷从根上就歪了MyBatis 的流行建立在六个系统性缺陷之上。这些缺陷不是偶然的设计失误是范式层面的结构性错误。缺陷一SQL 编写白盒SQL 执行黑盒MyBatis 让你在 XML 里看到 SQL觉得“这很透明”。但执行时你完全不知道框架做了什么——七层执行链路、动态代理、拦截器链、缓存层像一个黑盒。想加数据权限写拦截器。想加脱敏写拦截器。想改 SQL 执行写拦截器。想追踪 SQL 执行链路你在日志里看到的是 7 层嵌套调用栈。每一个拦截器都要求你学习 MyBatis 的内部对象模型BoundSql、MappedStatement、ParameterHandler、ResultSetHandler……你花时间学习的不是业务逻辑是框架的内部实现细节。这不是扩展是用学习框架内部结构来换取一点点控制权。缺陷二XML 标签拼字符串——用残缺的语言干 Java 擅长的事Java 里你写StringBuilder、append、replace、format、String.join有 IDE 补全、有断点调试、有类型检查。XML 里你写if、foreach、include、sql标签、属性、OGNL、#{}、${}五种东西混在一个文件里。你做的是同一件事——拼接字符串。但 Java 里你可以调试、可以复用、可以抽取方法XML 里你只能靠眼睛检查、靠脑补运行结果。这不是“分离”是把同一件事换了一个更差的工具去做。缺陷三OGNL——把业务逻辑塞进配置文件你在 XML 里写iftestname ! null and name ! AND name LIKE CONCAT(%, #{name}, %)/if这不是配置是程序逻辑。但它用配置文件的语言OGNL写成没有 IDE 调试、没有编译期检查、没有代码跳转。它在 XML 里插入了程序逻辑又把程序逻辑从 Java 的审查、调试、重构能力中剥离出去。这是一个负优化。缺陷四七层执行链路——每次查询都绕远路StatementHandler、ParameterHandler、ResultSetHandler、Executor、Cache、Interceptor、MappedStatement……你的每次查询都要经过 7 层才能到达数据库。性能损耗是其次最重要的是——查问题的时候你要理解这 7 层里每一层在做什么。缺陷五31 类自造异常——中间商赚差价Spring JDBC 只有 2-3 类异常。MyBatis 有 31 类。你花时间学的不是“数据库出了什么问题”是“框架的哪一层又炸了”。你多学 10 倍异常类型多读 10 倍框架内部类源码才能回到 Spring JDBC 的起点。缺陷六单表思维——背离 RDBMS 的本质RDBMS第一个单词是Relation关系。企业级开发中单表场景占比极低。MyBatis-Plus 所谓的“单表解决 80% 业务”是行业最大的谎言之一——它只覆盖了那 10% 的单表场景却假装覆盖了 80% 的业务。你被它骗了。二、心理层面认知防御——越痛苦越维护你投入了大量时间学 XML、学 OGNL、学if和foreach、学resultMap和association、学拦截器机制、学 31 类异常。你为 MyBatis 付出了太多于是你产生了认知防御“我花了三个月学它它不可能不好。”“大家都用它它不可能有问题。”“如果真的不好为什么还有这么多人在用”你被自己的投入绑架了。你开始本能地为它辩护把它的缺陷解释成“必要复杂度”把它的冗余解释成“企业级”把它的漏洞解释成“你不懂用”。这不是你的错这是心理学上经典的**“投入越大越难放弃”**机制。三、社会层面羊群效应——大厂用所以它是对的“大厂在用、面试在考、社区都在讨论”你就默认为它是标准。没人敢质疑、敢突破。你把“流行”等价于“正确”把“面试在考”等价于“应该学”把“大厂在用”等价于“值得用”。你忘了流行不代表正确面试在考只说明它足够普及大厂在用只说明它没有犯致命错误你用它的理由不是“它好”而是“大家都在用”。这是羊群效应。你从众不是因为你判断它好是因为判断成本太高从众最省事。四、经济层面产业链——没人愿意打破既得利益MyBatis 背后是一条巨大的产业链培训公司教它因为教简单的东西收不了高价博主写它因为它有足够多的问题可以写插件开发者靠它活着——MyBatis-Plus、MyBatis-Flex、MyBatis-TK、MyBatis-Plus-Join书籍作者靠它吃饭——《深入浅出 MyBatis》《MyBatis 从入门到精通》这条产业链上的每一个人都是 MyBatis 流行的受益者。他们不关心 MyBatis 好不好他们关心 MyBatis 还“够不够流行”。所以他们不断生产内容、不断强化“MyBatis 是标准”的叙事形成一个自我强化的循环。五、政治层面选型免责——出了事是框架的问题不是我的问题这是技术选型中一个非常隐蔽、但非常强大的力量。团队负责人选择一个流行框架如果项目出了问题他可以理直气壮地说“大家都在用我们也是跟着行业标准走的出了问题谁也预料不到。”但如果你选一个非主流方案出了任何问题责任都会指向你“当时为什么选这个冷门框架”这种选型免责机制驱动着大多数技术决策走向趋同而非走向更优。你不是在选“对的技术”你是在选“不会被追责的技术”。六、所以你今天加班写的 XML其实是在为什么买单你为这四个维度的历史惯性买单心理惯性你投入了太多时间学它无法承认自己的投入是浪费社会惯性大家都在用面试都在考你跟从了多数经济惯性整个产业链都在靠它赚钱没人愿意打破循环政治惯性选错了是框架的问题不是我的问题你每天都在为它的缺陷买单多写 3 倍代码、多学 10 倍语法、多排 10 倍框架内部错误。你加班写的 XML本质上是在为 MyBatis 的历史惯性买单。而你加的每一行班都在帮助 MyBatis 撑住“流行”的表面——你在用自己的时间为它的存续续费。技术应该解放你而不是绑架你MyBatis 不是解决之道它是问题本身。它不是解决方案它是已经被你习惯了的麻烦。而你真正的解决方案一直就在你手边——Spring JDBC以及基于它构建的 SimpleDAO。技术可以更简单开发可以更愉快程序员可以早下班。如果你厌倦了为历史惯性买单欢迎来试试 SimpleDAO。相关开源地址核心框架源码https://gitee.com/gao_zhenzhong/simple-dao系统底座https://gitee.com/gao_zhenzhong/simple-dao-starter代码生成器https://gitee.com/gao_zhenzhong/simple-dao-coder实战案例https://gitee.com/gao_zhenzhong/simple-dao-demo