From 170f5029bc5565151b257dcc0871f5b501a845fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=B6=E8=AE=AD?= Date: Tue, 28 Apr 2026 17:33:11 +0800 Subject: [PATCH] =?UTF-8?q?mybatis=E9=80=86=E5=90=91=E5=B7=A5=E7=A8=8B?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/CustomCommentGenerator.java | 218 ++++++++++++++++++ .../biz/mybatis/generator/LombokPlugin.java | 56 +++++ .../generator/SelectiveOnlyPlugin.java | 74 ++++++ src/main/resources/mybatis-generator.xml | 16 +- 4 files changed, 354 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/example/workutils/biz/mybatis/generator/CustomCommentGenerator.java create mode 100644 src/main/java/com/example/workutils/biz/mybatis/generator/LombokPlugin.java create mode 100644 src/main/java/com/example/workutils/biz/mybatis/generator/SelectiveOnlyPlugin.java diff --git a/src/main/java/com/example/workutils/biz/mybatis/generator/CustomCommentGenerator.java b/src/main/java/com/example/workutils/biz/mybatis/generator/CustomCommentGenerator.java new file mode 100644 index 0000000..8f5a5d2 --- /dev/null +++ b/src/main/java/com/example/workutils/biz/mybatis/generator/CustomCommentGenerator.java @@ -0,0 +1,218 @@ +package com.example.workutils.biz.mybatis.generator; + +import org.mybatis.generator.api.CommentGenerator; +import org.mybatis.generator.api.IntrospectedColumn; +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.dom.java.Field; +import org.mybatis.generator.api.dom.java.InnerClass; +import org.mybatis.generator.api.dom.java.InnerEnum; +import org.mybatis.generator.api.dom.java.Method; +import org.mybatis.generator.api.dom.java.TopLevelClass; +import org.mybatis.generator.api.dom.xml.XmlElement; + +import java.util.Properties; + +/** + * 自定义MyBatis Generator注释生成器 + * 生成简洁的中文注释: + * - 字段注释:只保留数据库字段备注 + * - 方法注释:根据方法名生成中文说明 + * - XML注释:不生成任何注释 + */ +public class CustomCommentGenerator implements CommentGenerator { + + private Properties properties; + private boolean addRemarkComments; + + public CustomCommentGenerator() { + super(); + properties = new Properties(); + addRemarkComments = true; + } + + @Override + public void addConfigurationProperties(Properties properties) { + this.properties.putAll(properties); + String addRemark = properties.getProperty("addRemarkComments"); + addRemarkComments = addRemark == null || "true".equalsIgnoreCase(addRemark); + } + + /** + * 为字段添加注释 - 只保留数据库备注 + */ + @Override + public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { + if (addRemarkComments && introspectedColumn.getRemarks() != null && !introspectedColumn.getRemarks().isEmpty()) { + field.addJavaDocLine("/**"); + field.addJavaDocLine(" * " + introspectedColumn.getRemarks()); + field.addJavaDocLine(" */"); + } + } + + /** + * 为字段添加注释(无列信息时)- 不添加注释 + */ + @Override + public void addFieldComment(Field field, IntrospectedTable introspectedTable) { + // 不添加注释 + } + + /** + * 为类添加注释 - 添加表备注 + */ + @Override + public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) { + if (addRemarkComments && introspectedTable.getRemarks() != null && !introspectedTable.getRemarks().isEmpty()) { + innerClass.addJavaDocLine("/**"); + innerClass.addJavaDocLine(" * " + introspectedTable.getRemarks()); + innerClass.addJavaDocLine(" */"); + } + } + + @Override + public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) { + addClassComment(innerClass, introspectedTable); + } + + /** + * 为枚举添加注释 - 不添加 + */ + @Override + public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) { + // 不添加注释 + } + + /** + * 为Getter方法添加注释 + */ + @Override + public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { + if (addRemarkComments && introspectedColumn.getRemarks() != null && !introspectedColumn.getRemarks().isEmpty()) { + method.addJavaDocLine("/**"); + method.addJavaDocLine(" * 获取" + introspectedColumn.getRemarks()); + method.addJavaDocLine(" */"); + } + } + + /** + * 为Setter方法添加注释 + */ + @Override + public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { + if (addRemarkComments && introspectedColumn.getRemarks() != null && !introspectedColumn.getRemarks().isEmpty()) { + method.addJavaDocLine("/**"); + method.addJavaDocLine(" * 设置" + introspectedColumn.getRemarks()); + method.addJavaDocLine(" */"); + } + } + + /** + * 为普通方法添加注释 - 根据方法名生成中文说明 + */ + @Override + public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) { + String methodName = method.getName(); + String comment = getMethodComment(methodName); + + if (comment != null) { + method.addJavaDocLine("/**"); + method.addJavaDocLine(" * " + comment); + method.addJavaDocLine(" */"); + } + } + + /** + * 根据方法名获取中文注释 + */ + private String getMethodComment(String methodName) { + if (methodName.startsWith("deleteBy")) { + return "根据" + extractCondition(methodName, "deleteBy") + "删除"; + } + if (methodName.startsWith("insert")) { + if (methodName.equals("insert")) { + return "插入记录"; + } + if (methodName.equals("insertSelective")) { + return "选择性插入记录(只插入非空字段)"; + } + return "插入记录"; + } + if (methodName.startsWith("updateBy")) { + return "根据" + extractCondition(methodName, "updateBy") + "更新"; + } + if (methodName.startsWith("selectBy")) { + return "根据" + extractCondition(methodName, "selectBy") + "查询"; + } + if (methodName.startsWith("countBy")) { + return "根据" + extractCondition(methodName, "countBy") + "统计数量"; + } + if (methodName.equals("selectAll")) { + return "查询所有记录"; + } + if (methodName.equals("selectByPrimaryKey")) { + return "根据主键查询"; + } + if (methodName.equals("updateByPrimaryKey")) { + return "根据主键更新"; + } + if (methodName.equals("updateByPrimaryKeySelective")) { + return "根据主键选择性更新(只更新非空字段)"; + } + if (methodName.equals("deleteByPrimaryKey")) { + return "根据主键删除"; + } + if (methodName.startsWith("select")) { + return "查询记录"; + } + return null; + } + + /** + * 提取条件部分 + * 例如:deleteByPrimaryKey -> 主键 + */ + private String extractCondition(String methodName, String prefix) { + String condition = methodName.substring(prefix.length()); + if (condition.equals("PrimaryKey")) { + return "主键"; + } + if (condition.equals("Id")) { + return "ID"; + } + if (condition.equals("Key")) { + return "键"; + } + return condition; + } + + /** + * 为顶级类添加注释 - 添加表备注作为类注释 + */ + @Override + public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { + if (addRemarkComments) { + String remarks = introspectedTable.getRemarks(); + if (remarks != null && !remarks.isEmpty()) { + topLevelClass.addJavaDocLine("/**"); + topLevelClass.addJavaDocLine(" * " + remarks); + topLevelClass.addJavaDocLine(" */"); + } + } + } + + /** + * XML元素注释 - 不添加任何注释 + */ + @Override + public void addComment(XmlElement xmlElement) { + // 不添加注释 + } + + /** + * XML根节点注释 - 不添加 + */ + @Override + public void addRootComment(XmlElement rootElement) { + // 不添加注释 + } +} \ No newline at end of file diff --git a/src/main/java/com/example/workutils/biz/mybatis/generator/LombokPlugin.java b/src/main/java/com/example/workutils/biz/mybatis/generator/LombokPlugin.java new file mode 100644 index 0000000..884d9d7 --- /dev/null +++ b/src/main/java/com/example/workutils/biz/mybatis/generator/LombokPlugin.java @@ -0,0 +1,56 @@ +package com.example.workutils.biz.mybatis.generator; + +import org.mybatis.generator.api.IntrospectedColumn; +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.PluginAdapter; +import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType; +import org.mybatis.generator.api.dom.java.Interface; +import org.mybatis.generator.api.dom.java.Method; +import org.mybatis.generator.api.dom.java.TopLevelClass; + +import java.util.List; + +/** + * Lombok插件:为PO类添加@Data注解,禁用getter/setter方法生成 + */ +public class LombokPlugin extends PluginAdapter { + + private static final FullyQualifiedJavaType DATA_ANNOTATION = + new FullyQualifiedJavaType("lombok.Data"); + + @Override + public boolean validate(List warnings) { + return true; + } + + /** + * 为模型类添加@Data注解 + */ + @Override + public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { + // 添加 @Data 注解 + topLevelClass.addAnnotation("@Data"); + topLevelClass.addImportedType(DATA_ANNOTATION); + return true; + } + + /** + * 禁用 Getter 方法生成 + */ + @Override + public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, + IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, + ModelClassType modelClassType) { + return false; + } + + /** + * 禁用 Setter 方法生成 + */ + @Override + public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, + IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, + ModelClassType modelClassType) { + return false; + } +} diff --git a/src/main/java/com/example/workutils/biz/mybatis/generator/SelectiveOnlyPlugin.java b/src/main/java/com/example/workutils/biz/mybatis/generator/SelectiveOnlyPlugin.java new file mode 100644 index 0000000..d54728d --- /dev/null +++ b/src/main/java/com/example/workutils/biz/mybatis/generator/SelectiveOnlyPlugin.java @@ -0,0 +1,74 @@ +package com.example.workutils.biz.mybatis.generator; + +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.PluginAdapter; +import org.mybatis.generator.api.dom.java.Interface; +import org.mybatis.generator.api.dom.java.Method; +import org.mybatis.generator.api.dom.xml.XmlElement; + +import java.util.List; + +/** + * 自定义插件:只保留Selective版本的方法 + * 移除 insert 和 updateByPrimaryKey(全字段版本) + * 保留 insertSelective 和 updateByPrimaryKeySelective(选择性版本) + */ +public class SelectiveOnlyPlugin extends PluginAdapter { + + @Override + public boolean validate(List warnings) { + return true; + } + + // ==================== Java接口方法 ==================== + + @Override + public boolean clientInsertMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { + // 禁用 insert(全字段插入) + return false; + } + + @Override + public boolean clientInsertSelectiveMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { + // 保留 insertSelective + return true; + } + + @Override + public boolean clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { + // 禁用 updateByPrimaryKey(全字段更新) + return false; + } + + @Override + public boolean clientUpdateByPrimaryKeySelectiveMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { + // 保留 updateByPrimaryKeySelective + return true; + } + + @Override + public boolean clientDeleteByPrimaryKeyMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { + // 禁用 deleteByPrimaryKey(根据主键删除) + return false; + } + + // ==================== XML元素 ==================== + + @Override + public boolean sqlMapInsertElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { + // 禁用 insert XML元素(全字段插入) + return false; + } + + @Override + public boolean sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { + // 禁用 updateByPrimaryKey XML元素(全字段更新) + return false; + } + + @Override + public boolean sqlMapDeleteByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { + // 禁用 deleteByPrimaryKey XML元素(根据主键删除) + return false; + } +} \ No newline at end of file diff --git a/src/main/resources/mybatis-generator.xml b/src/main/resources/mybatis-generator.xml index 9e6ebc3..865056e 100644 --- a/src/main/resources/mybatis-generator.xml +++ b/src/main/resources/mybatis-generator.xml @@ -11,18 +11,14 @@ + + + + - - - - + + - - - - - -