From e6ccd3bc34565d14d4d3f44212d094c48166f2fb Mon Sep 17 00:00:00 2001 From: iqudoo Date: Fri, 10 Apr 2026 01:36:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=85=A2=E6=9F=A5=E8=AF=A2=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 26 +++++--- ...-mybatis-generator-plugin-1.0-SNAPSHOT.jar | Bin 30435 -> 31646 bytes .../TapeRepositoryGeneratorPlugin.java | 63 ++++++++++++++++-- .../mybatis/TapeRepoviewGeneratorPlugin.java | 34 +++++++++- 4 files changed, 105 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 2605572..074a1a3 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,10 @@ + + + + @@ -149,17 +153,21 @@ ### 3. 配置参数说明 -| 参数名 | 说明 | 默认值 | 必需 | -|--------|---------------------|--------------------------------------------------------|------| -| `viewKeyWords` | 视图表关键字(逗号分隔,不区分大小写) | `VIEW_,V_` | 否 | -| `targetProject` | 生成代码的目标项目路径 | `src/main/java` | 否 | +| 参数名 | 说明 | 默认值 | 必需 | +|--------|---------------------|---------------------------------------------------------|------| +| `viewKeyWords` | 视图表关键字(逗号分隔,不区分大小写) | `VIEW_,V_` | 否 | +| `targetProject` | 生成代码的目标项目路径 | `src/main/java` | 否 | | `modelPackage` | Model 类的包路径 | `com.iqudoo.platform.application.database.model` | 是 | -| `mapperPackage` | Mapper 接口的包路径 | `com.iqudoo.platform.application.database.mapper` | 是 | -| `facadeRepositoryPackage` | Repository 接口的包路径 | `com.iqudoo.platform.application.facade.repository` | 否 | -| `domainRepositoryPackage` | Repository 实现类的包路径 | `com.iqudoo.platform.application.domain.repository` | 否 | -| `facadeRepoviewPackage` | RepoView 接口的包路径 | `com.iqudoo.platform.application.facade.repoview` | 否 | +| `mapperPackage` | Mapper 接口的包路径 | `com.iqudoo.platform.application.database.mapper` | 是 | +| `facadeRepositoryPackage` | Repository 接口的包路径 | `com.iqudoo.platform.application.facade.repository` | 否 | +| `domainRepositoryPackage` | Repository 实现类的包路径 | `com.iqudoo.platform.application.domain.repository` | 否 | +| `facadeRepoviewPackage` | RepoView 接口的包路径 | `com.iqudoo.platform.application.facade.repoview` | 否 | | `snowflakeUtilClass` | 雪花算法ID生成工具类 | `com.iqudoo.framework.tape.modules.utils.SnowflakeUtil` | 否 | -| `snowflakeUtilGenId` | 雪花算法ID生成方法 | `SnowflakeUtil.nextId()` | 否 | +| `snowflakeUtilGenId` | 雪花算法ID生成方法 | `SnowflakeUtil.nextId()` | 否 | +| `slowQueryLoggerTime` | 慢查询日志时间阈值 | `200` | 否 | +| `ignorePageSize` | 忽略分页阈值 | `10000` | 否 | +| `defaultPageSize` | 默认分页数量 | `20` | 否 | +| `startPage` | 开始页码 | `1` | 否 | **视图表识别规则**: - 表名包含 `viewKeyWords` 中任一关键字的表将被识别为视图表,大小写不敏感 diff --git a/releases/tape-mybatis-generator-plugin-1.0-SNAPSHOT.jar b/releases/tape-mybatis-generator-plugin-1.0-SNAPSHOT.jar index 5c4df26dbd4700d9cca2d44584db5a5fe274b34d..a8ff2ebf6cbde366d32bc73f2dcf197df504a9f7 100644 GIT binary patch delta 18116 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�Wx$S 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 QX3RF=QNj)x9^vQQ{~-W`SpWb4 delta 16912 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 primaryKeyList = " + mapperFieldName + ".selectPrimaryKeyByExample(example);"); method.addBodyLine("if (primaryKeyList == null || primaryKeyList.isEmpty()) {"); method.addBodyLine("return new ArrayList<>();"); method.addBodyLine("}"); + method.addBodyLine("long findPrimaryKeyTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (findPrimaryKeyTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER.error(\"find valid list primary key use long time: \" + findPrimaryKeyTime + \"ms\");"); + method.addBodyLine("}"); method.addBodyLine("String oldOrderByClause = example.getOrderByClause();"); if (hasBLOBColumns) { method.addBodyLine("Boolean withBLOBsFlag = example.isWithBLOBs();"); @@ -812,6 +829,12 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { } else { method.addBodyLine("return " + mapperFieldName + ".selectByExample(example);"); } + method.addBodyLine("} finally {"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER.error(\"get valid list use long time: \" + useTime + \"ms\");"); + method.addBodyLine("}"); + method.addBodyLine("}"); implClass.addMethod(method); } @@ -827,11 +850,17 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("for (" + exampleClassName + ".Criteria criteria : example.getOredCriteria()) {"); method.addBodyLine("criteria.andIsDeleteEqualTo(0).andIsHiddenEqualTo(1);"); method.addBodyLine("}"); + method.addBodyLine("long startTime = new Date().getTime();"); + method.addBodyLine("try {"); method.addBodyLine("if (example.getRows() != null && example.getOffset() != null) {"); method.addBodyLine("List primaryKeyList = " + mapperFieldName + ".selectPrimaryKeyByExample(example);"); method.addBodyLine("if (primaryKeyList == null || primaryKeyList.isEmpty()) {"); method.addBodyLine("return new ArrayList<>();"); method.addBodyLine("}"); + method.addBodyLine("long findPrimaryKeyTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (findPrimaryKeyTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER.error(\"find trash list primary key use long time: \" + findPrimaryKeyTime + \"ms\");"); + method.addBodyLine("}"); method.addBodyLine("String oldOrderByClause = example.getOrderByClause();"); if (hasBLOBColumns) { method.addBodyLine("Boolean withBLOBsFlag = example.isWithBLOBs();"); @@ -852,6 +881,12 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { } else { method.addBodyLine("return " + mapperFieldName + ".selectByExample(example);"); } + method.addBodyLine("} finally {"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER.error(\"get trash list use long time: \" + useTime + \"ms\");"); + method.addBodyLine("}"); + method.addBodyLine("}"); implClass.addMethod(method); } @@ -866,7 +901,15 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("for (" + exampleClassName + ".Criteria criteria : example.getOredCriteria()) {"); method.addBodyLine("criteria.andIsDeleteEqualTo(0).andIsHiddenEqualTo(0);"); method.addBodyLine("}"); + method.addBodyLine("long startTime = new Date().getTime();"); + method.addBodyLine("try {"); method.addBodyLine("return " + mapperFieldName + ".countByExample(example);"); + method.addBodyLine("} finally {"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER.error(\"count by valid use long time: \" + useTime + \"ms\");"); + method.addBodyLine("}"); + method.addBodyLine("}"); implClass.addMethod(method); } @@ -882,7 +925,15 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("for (" + exampleClassName + ".Criteria criteria : example.getOredCriteria()) {"); method.addBodyLine("criteria.andIsDeleteEqualTo(0).andIsHiddenEqualTo(1);"); method.addBodyLine("}"); + method.addBodyLine("long startTime = new Date().getTime();"); + method.addBodyLine("try {"); method.addBodyLine("return " + mapperFieldName + ".countByExample(example);"); + method.addBodyLine("} finally {"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER.error(\"count by trash use long time: \" + useTime + \"ms\");"); + method.addBodyLine("}"); + method.addBodyLine("}"); implClass.addMethod(method); } diff --git a/src/main/java/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.java b/src/main/java/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.java index 886e7cf..2384dda 100644 --- a/src/main/java/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.java +++ b/src/main/java/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.java @@ -16,13 +16,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Properties; -/** - * MyBatis Generator 1.4.1 适配版:视图表专用 RepoView 生成插件 - */ @SuppressWarnings({"DuplicatedCode", "SpellCheckingInspection", "ExtractMethodRecommender"}) public class TapeRepoviewGeneratorPlugin extends PluginAdapter { // 视图Repo包配置(可通过配置文件自定义) + private String slowQueryLoggerTime = "300"; private String facadeRepoviewPackage = "com.iqudoo.platform.application.facade.repoview"; private String domainRepoviewPackage = "com.iqudoo.platform.application.domain.repoview"; private String modelPackage = "com.iqudoo.platform.application.database.model"; @@ -51,6 +49,9 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { public void setProperties(Properties properties) { super.setProperties(properties); // 读取自定义配置 + if (StringUtility.stringHasValue(properties.getProperty("slowQueryLoggerTime"))) { + slowQueryLoggerTime = properties.getProperty("slowQueryLoggerTime"); + } if (StringUtility.stringHasValue(properties.getProperty("facadeRepoviewPackage"))) { facadeRepoviewPackage = properties.getProperty("facadeRepoviewPackage"); } @@ -209,6 +210,14 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { FullyQualifiedJavaType superInterface = new FullyQualifiedJavaType(facadeRepoviewPackage + "." + interfaceName); implClass.addSuperInterface(superInterface); + // slow query logger + Field loggerField = new Field("LOGGER", new FullyQualifiedJavaType("Logger")); + loggerField.setVisibility(JavaVisibility.PRIVATE); + loggerField.setStatic(true); + loggerField.setFinal(true); + loggerField.setInitializationString("LoggerFactory.getLogger(" + implClassName + ".class)"); + implClass.addField(loggerField); + // 添加Mapper字段 String mapperFieldName = lowerFirst(mapperClassName); Field mapperField = new Field(mapperFieldName, new FullyQualifiedJavaType(mapperPackage + "." + mapperClassName)); @@ -240,6 +249,9 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { // 注解&工具类 implClass.addImportedType(new FullyQualifiedJavaType("org.springframework.stereotype.Repository")); implClass.addImportedType(new FullyQualifiedJavaType("javax.annotation.Resource")); + implClass.addImportedType(new FullyQualifiedJavaType("org.slf4j.Logger")); + implClass.addImportedType(new FullyQualifiedJavaType("org.slf4j.LoggerFactory")); + implClass.addImportedType(new FullyQualifiedJavaType("java.util.ArrayList")); implClass.addImportedType(new FullyQualifiedJavaType("java.util.List")); } @@ -277,6 +289,8 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { // 参数名匹配示例(首字母小写) method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), "example")); method.addException(new FullyQualifiedJavaType("Throwable")); + method.addBodyLine("long startTime = new Date().getTime();"); + method.addBodyLine("try {"); if (hasBLOBColumns) { method.addBodyLine("if (example.isWithBLOBs()) {"); method.addBodyLine("return " + mapperFieldName + ".selectByExampleWithBLOBs(example);"); @@ -285,6 +299,12 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { } else { method.addBodyLine("return " + mapperFieldName + ".selectByExample(example);"); } + method.addBodyLine("} finally {"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER.error(\"get view list use long time: \" + useTime + \"ms\");"); + method.addBodyLine("}"); + method.addBodyLine("}"); implClass.addMethod(method); } @@ -301,7 +321,15 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { method.addException(new FullyQualifiedJavaType("Throwable")); // 方法体 + method.addBodyLine("long startTime = new Date().getTime();"); + method.addBodyLine("try {"); method.addBodyLine("return " + mapperFieldName + ".countByExample(example);"); + method.addBodyLine("} finally {"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER.error(\"count view use long time: \" + useTime + \"ms\");"); + method.addBodyLine("}"); + method.addBodyLine("}"); implClass.addMethod(method); }