代码优化提交
This commit is contained in:
@@ -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() {
|
||||
|
||||
+46
-13
@@ -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 类中。
|
||||
* <p>
|
||||
* MBG 默认对含复合主键的表生成两个类:
|
||||
* MBG 默认对含主键的表生成两个类:
|
||||
* <ul>
|
||||
* <li>XXXPO(完整 PO,含所有字段)</li>
|
||||
* <li>XXXPO extends XXXPOKey(业务字段)</li>
|
||||
* <li>XXXPOKey(仅主键字段)</li>
|
||||
* </ul>
|
||||
* 本插件在初始化时将 {@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<IntrospectedColumn> pkColumns = (List<IntrospectedColumn>) pkField.get(introspectedTable);
|
||||
@SuppressWarnings("unchecked")
|
||||
List<IntrospectedColumn> baseColumns = (List<IntrospectedColumn>) baseField.get(introspectedTable);
|
||||
|
||||
if (pkColumns == null || pkColumns.isEmpty()) return;
|
||||
|
||||
// 将主键列全部移到 baseColumns 开头
|
||||
List<IntrospectedColumn> 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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user