mybatis-generator-gui-extension 代码合并机制解密:重新生成代码为何不再丢失手写逻辑
【免费下载链接】mybatis-generator-gui-extension图形化MBG,内置丰富插件,可生成Service、Controller、View,配置简单。 A powerful GUI tool for MyBatisGenerator(MBG)项目地址: https://gitcode.com/gh_mirrors/my/mybatis-generator-gui-extension
mybatis-generator-gui-extension 是一款图形化的 MyBatis Generator(MBG)代码生成工具,它内置了丰富的代码合并机制,让开发者反复重新生成代码时不再担心手写逻辑被覆盖。本文将从源码层面解密这套智能合并机制的工作原理,帮助新手快速掌握"重新生成不丢代码"的正确配置方法。
重新生成代码的最大痛点:手写逻辑被覆盖
在传统 MyBatis Generator 工作流中,每次修改表结构后重新生成代码,默认行为是直接覆盖已有文件。如果你曾在生成的实体类或 Mapper 中手动添加过自定义字段、自定义方法、业务逻辑,那么一次重新生成就会让这些心血付之东流。这也是很多人对代码生成器"又爱又恨"的根本原因。
而 mybatis-generator-gui-extension 给出的答案是:智能合并——把新生成的内容与旧文件中你手写的部分合并到一起,而不是简单覆盖。
合并机制的核心:MyShellCallback 源码解析
这个能力的关键实现在 MyShellCallback.java 中。它实现了 MBG 的ShellCallback接口,通过重写三个关键方法控制整个生成行为:
isMergeSupported():当未勾选"覆盖"选项时返回 true,表示支持合并isOverwriteEnabled():返回是否直接覆盖mergeJavaFile():真正执行合并的核心方法
其中mergeJavaFile借助JavaParser把新旧两个 Java 文件分别解析为语法树(CompilationUnit),再逐层合并,最终输出合并后的完整文件。
四层合并策略:从包名到内部类
合并不是简单的字符串拼接,而是结构化的语法树合并,共分四层,见 mergeCompilationUnit 方法:
- 包名与 import 合并:采用新文件的包名,import 语句通过 Set 去重合并
- 顶层类合并:同名类递归合并,旧文件中非生成的类(如额外的手写类)也会被保留
- 类成员合并:构造函数、字段、方法均以"签名/变量名"为 key 放入 Map 去重,旧文件独有的成员全部保留
- 内部类合并:类、枚举、注解等嵌套类型同样递归执行合并逻辑
如何区分"生成的代码"与"手写代码"
合并机制的关键问题是:怎么知道哪些旧代码该保留?答案藏在注释标记里。
生成代码时,CommentPlugin.java 会为每个由 MBG 生成的元素(类、方法、字段)自动添加带有@mbg.generated标记的 Javadoc 注释。而MyShellCallback中的 isGeneratedNode 方法 正是通过检查注释中是否包含这些标记来判断节点是否为自动生成的。
合并时的处理规则因此非常清晰:
- 新生成的元素 → 直接采用新版本
- 旧文件中的生成元素→ 被新版本替换
- 旧文件中的手写元素(没有生成标记)→ 原样保留
这就实现了"生成的归生成,手写的归手写"的精准分流。
开启代码合并的最快配置方法
要启用这套合并机制,操作非常简单:
- 打开 mybatis-generator-gui-extension 主界面,在配置中找到"是否覆盖原有java文件"复选框
- 取消勾选该选项即可开启合并模式(勾选状态默认为 true,表示覆盖)
- 点击"生成代码"按钮
配置项定义见 ProjectConfig.java,勾选后MyShellCallback的isMergeSupported()会返回 false 走覆盖逻辑,取消勾选则进入合并流程(见 MBGRunner.java)。
合并失败时的兜底方案
虽然合并机制足够智能,但在极端情况下(例如旧类类型与新生类型不一致)仍可能抛出异常,此时工具会提示你手动处理。如果你的项目确实遇到合并问题,界面上的帮助提示也给出了最直接的兜底方案:重新勾选"覆盖"开关,直接覆盖旧文件。相关说明可在 i18n 配置 中看到完整描述。
结语
mybatis-generator-gui-extension 的代码合并机制,本质上是用"语法树级合并 + 生成标记识别"替代了 MBG 默认的"一刀切覆盖",让数据库表结构演进与手写业务代码和平共处。对开发者而言,只需要记住一个关键开关——取消勾选"覆盖原有 Java 文件",就能在反复重新生成代码时高枕无忧。这正是这款图形化 MBG 工具"配置简单、不丢手写逻辑"的精髓所在。
【免费下载链接】mybatis-generator-gui-extension图形化MBG,内置丰富插件,可生成Service、Controller、View,配置简单。 A powerful GUI tool for MyBatisGenerator(MBG)项目地址: https://gitcode.com/gh_mirrors/my/mybatis-generator-gui-extension
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考