diff --git a/src/main/java/com/example/workutils/biz/diff/DiffPlugin.java b/src/main/java/com/example/workutils/biz/diff/DiffPlugin.java index f2f9ea4..a17dd5a 100644 --- a/src/main/java/com/example/workutils/biz/diff/DiffPlugin.java +++ b/src/main/java/com/example/workutils/biz/diff/DiffPlugin.java @@ -52,6 +52,14 @@ public class DiffPlugin implements Plugin { @Override public String[] getMenuOptions() { return MENU_OPTIONS; } + @Override + public void handleChoice(int choice, Scanner scanner) throws Exception { + switch (choice) { + case 1: openVisualDiff(); break; + default: printInvalidOption(); break; + } + } + // ==================== JavaFX 初始化(复用共享启动器) ==================== private void openVisualDiff() { diff --git a/src/main/java/com/example/workutils/biz/mybatisgenerator/service/generator/SuppressKeyPlugin.java b/src/main/java/com/example/workutils/biz/mybatisgenerator/service/generator/SuppressKeyPlugin.java index 5166b02..ea15bb3 100644 --- a/src/main/java/com/example/workutils/biz/mybatisgenerator/service/generator/SuppressKeyPlugin.java +++ b/src/main/java/com/example/workutils/biz/mybatisgenerator/service/generator/SuppressKeyPlugin.java @@ -1,22 +1,24 @@ package com.example.workutils.biz.mybatisgenerator.service.generator; +import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.PluginAdapter; +import java.lang.reflect.Field; +import java.util.ArrayList; import java.util.List; import java.util.Properties; /** * 自定义插件:抑制 *Key 类的生成,将主键字段直接合并到 PO 类中。 *

- * MBG 默认对含复合主键的表生成两个类: + * MBG 默认对含主键的表生成两个类: *

- * 本插件在初始化时将 {@code hasPrimaryKeyColumns} 重置为 false, - * 使 MBG 认为该表没有需要单独提取的主键类, - * 从而只生成一个包含所有字段的 PO 类。 + * 本插件通过将 primaryKeyColumns 合并到 baseColumns 中并清空 PK 列表, + * 使 MBG 只生成一个包含所有字段的 PO 类。 */ public class SuppressKeyPlugin extends PluginAdapter { @@ -34,22 +36,53 @@ public class SuppressKeyPlugin extends PluginAdapter { } /** - * 在表内省完成后,清除主键列标记。 - * MBG 仅当表含复合主键且 {@code getHasPrimaryKeyColumns()==true} - * 时才会生成独立的 *Key 类;置为 false 后跳过 Key 类生成。 + * 将主键字段合并到基础字段中,阻止 MBG 生成独立的 *Key 类。 */ @Override public void initialized(IntrospectedTable introspectedTable) { if (!suppressKey) return; - // 通过反射将 hasInternalPrimaryKey 强制设为 false, - // 阻止 MBG 生成单独的 PrimaryKey 类 try { - java.lang.reflect.Field field = introspectedTable.getClass().getDeclaredField("hasInternalPrimaryKey"); - field.setAccessible(true); - field.set(introspectedTable, false); + // 通过反射获取 primaryKeyColumns 和 baseColumns + Field pkField = getField(introspectedTable.getClass(), "primaryKeyColumns"); + Field baseField = getField(introspectedTable.getClass(), "baseColumns"); + + if (pkField == null || baseField == null) return; + + pkField.setAccessible(true); + baseField.setAccessible(true); + + @SuppressWarnings("unchecked") + List pkColumns = (List) pkField.get(introspectedTable); + @SuppressWarnings("unchecked") + List baseColumns = (List) baseField.get(introspectedTable); + + if (pkColumns == null || pkColumns.isEmpty()) return; + + // 将主键列全部移到 baseColumns 开头 + List merged = new ArrayList<>(pkColumns); + if (baseColumns != null) { + merged.addAll(baseColumns); + } + baseField.set(introspectedTable, merged); + pkField.set(introspectedTable, new ArrayList<>()); + } catch (Exception e) { // 反射失败时静默忽略,回退到默认行为 } } + + private static Field getField(Class clazz, String name) { + Field field; + try { + field = clazz.getDeclaredField(name); + } catch (NoSuchFieldException e) { + // 可能字段在父类中 + if (clazz.getSuperclass() != null) { + return getField(clazz.getSuperclass(), name); + } + return null; + } + return field; + } }