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 5c4df26..a8ff2eb 100644
Binary files a/releases/tape-mybatis-generator-plugin-1.0-SNAPSHOT.jar and b/releases/tape-mybatis-generator-plugin-1.0-SNAPSHOT.jar differ
diff --git a/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java b/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java
index 7d4a367..fed2138 100644
--- a/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java
+++ b/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java
@@ -13,13 +13,11 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
-/**
- * MyBatis Generator 1.4.1
- */
@SuppressWarnings({"DuplicatedCode", "unused", "SpellCheckingInspection", "ExtractMethodRecommender"})
public class TapeRepositoryGeneratorPlugin extends PluginAdapter {
// 固定配置项
+ private String slowQueryLoggerTime = "300";
private String snowflakeUtilClass = "com.iqudoo.framework.tape.modules.utils.SnowflakeUtil";
private String snowflakeUtilGenId = "SnowflakeUtil.nextId()";
private String facadeRepositoryPackage = "com.iqudoo.platform.application.facade.repository";
@@ -48,6 +46,9 @@ public class TapeRepositoryGeneratorPlugin 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("snowflakeUtilClass"))) {
snowflakeUtilClass = properties.getProperty("snowflakeUtilClass");
}
@@ -347,6 +348,14 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter {
FullyQualifiedJavaType superInterface = new FullyQualifiedJavaType(facadeRepositoryPackage + "." + 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);
+
String mapperFieldName = lowerFirst(mapperClassName);
Field mapperField = new Field(mapperFieldName, new FullyQualifiedJavaType(mapperPackage + "." + mapperClassName));
mapperField.setVisibility(JavaVisibility.PRIVATE);
@@ -391,7 +400,7 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter {
method.addBodyLine("return " + mapperFieldName + ".deleteByExample(example);");
method.addBodyLine("}");
method.addBodyLine("for (" + exampleClassName + ".Criteria criteria : example.getOredCriteria()) {");
- method.addBodyLine("criteria.andIsDeleteEqualTo(0);");
+ method.addBodyLine("criteria.andIsDeleteEqualTo(0).andIsHiddenEqualTo(1);");
method.addBodyLine("}");
method.addBodyLine(modelClassName + " " + lowerFirst(modelClassName) + " = new " + modelClassName + "();");
method.addBodyLine(lowerFirst(modelClassName) + ".setIsDelete(1);");
@@ -492,6 +501,8 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter {
implClass.addImportedType(new FullyQualifiedJavaType(facadeRepositoryPackage + "." + interfaceName));
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.Date"));
implClass.addImportedType(new FullyQualifiedJavaType("java.util.List"));
@@ -634,8 +645,8 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter {
method.addBodyLine("lockDataVersion = aDo.getDataVersion();");
method.addBodyLine("}");
method.addBodyLine("updateWhere.createCriteria()");
- method.addBodyLine(".andGuidEqualTo(aDo.getGuid())");
- method.addBodyLine(".andDataVersionEqualTo(lockDataVersion);");
+ method.addBodyLine(" .andGuidEqualTo(aDo.getGuid())");
+ method.addBodyLine(" .andDataVersionEqualTo(lockDataVersion);");
method.addBodyLine("aDo.setDataVersion(aDo.getDataVersion() + 1);");
method.addBodyLine("aDo.setUpdateTime(new Date());");
method.addBodyLine("// update data version");
@@ -787,11 +798,17 @@ 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("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 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);
}