diff --git a/README.md b/README.md index 074a1a3..8428852 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,8 @@ - `getTrashList({Example} example)` - 获取回收站记录列表(支持分页) - `countByValid({Example} example)` - 统计有效记录数 - `countByTrash({Example} example)` - 统计回收站记录数 +- `countByValidWithPage({Example} example)` - 统计有效记录数 +- `countByTrashWithPage({Example} example)` - 统计回收站记录数 - `insert({Model} record)` - 插入记录(自动生成 GUID、设置默认值) - `updateByExampleSelective({Model} record, {Example} example)` - 按条件更新记录 - `update({Model} record)` - 更新记录(支持乐观锁) @@ -60,9 +62,8 @@ **添加的字段**: - `offset` - 偏移量 - `rows` - 每页数量 -- `minPageNum` - 最小页码(默认 1) +- `startPageNum` - 最小页码(默认 1) - `ignorePageSize` - 忽略分页数量(默认 10000)每页数量大于10000时,忽略分页 -- `defaultPageSize` - 默认每页数量(默认 20) - `maxPageSize` - 最大每页数量(默认 100) - `withBLOBs` - 是否返回BLOBs列的数据 @@ -70,10 +71,12 @@ - `limit(int rows)` - 设置每页数量 - `limit(int offset, int rows)` - 设置偏移量和每页数量 - `usePage(int pageNum, int pageSize)` - 使用页码和每页数量(自动计算 offset) -- `getPageNum()` - 获取当前页码 -- `getPageSize()` - 获取当前每页数量 - `setWithBLOBs(boolean withBLOBs)` - 设置是否返回BLOBs列的数据 - `isWithBLOBs()` - 是否返回BLOBs列的数据 +- `getPageNum()` - 获取当前页码 +- `getPageSize()` - 获取当前每页数量 +- `getOffset()` - 获取当前分页limit的offset +- `getRows()` - 获取当前分页limit的rows ## 使用方法 ### 1. 在 `pom.xml` 中配置插件 @@ -138,9 +141,11 @@ + + - - + + @@ -153,21 +158,23 @@ ### 3. 配置参数说明 -| 参数名 | 说明 | 默认值 | 必需 | -|--------|---------------------|---------------------------------------------------------|------| -| `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` | 否 | -| `snowflakeUtilClass` | 雪花算法ID生成工具类 | `com.iqudoo.framework.tape.modules.utils.SnowflakeUtil` | 否 | -| `snowflakeUtilGenId` | 雪花算法ID生成方法 | `SnowflakeUtil.nextId()` | 否 | -| `slowQueryLoggerTime` | 慢查询日志时间阈值 | `200` | 否 | -| `ignorePageSize` | 忽略分页阈值 | `10000` | 否 | -| `defaultPageSize` | 默认分页数量 | `20` | 否 | -| `startPage` | 开始页码 | `1` | 否 | +| 参数名 | 说明 | 默认值 | 必需 | +|----------------------------|-------------------------------|-------------------------------------------------------|------| +| `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` | 否 | +| `snowflakeUtilClass` | 雪花算法ID生成工具类 | `com.iqudoo.framework.tape.modules.utils.SnowflakeUtil` | 否 | +| `snowflakeUtilGenId` | 雪花算法ID生成方法 | `SnowflakeUtil.nextId()` | 否 | +| `slowQueryLoggerTime` | 慢查询日志时间阈值 | `300` | 否 | +| `slowQueryLoggerLevel` | 慢查询日志类型:error,warn,debug,info | `error` | 否 | +| `priorityPrimaryKeyOffset` | 优先查询主键偏移阈值 | `0` | 否 | +| `ignorePageSize` | 忽略分页阈值 | `10000` | 否 | +| `startPageNum` | 分页开始页码 | `1` | 否 | +| `maxPageSize` | 最大每页数量 | `100` | 否 | **视图表识别规则**: - 表名包含 `viewKeyWords` 中任一关键字的表将被识别为视图表,大小写不敏感 @@ -180,7 +187,7 @@ 为了使用完整的 Repository 功能(软删除、回收站等),表结构需要包含以下标准字段: -```sql +```mysql DROP TABLE IF EXISTS `your_table_name`; CREATE TABLE `your_table_name` ( `guid` bigint(0) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'GUID', @@ -193,7 +200,15 @@ CREATE TABLE `your_table_name` ( `data_version` int(0) NOT NULL DEFAULT 0 COMMENT '数据版本', `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '更新时间', - PRIMARY KEY (`guid`) USING BTREE + PRIMARY KEY (`guid`) USING BTREE, + -- UNIQUE KEY `idx_unique_key` (`you unique key`,`delete_token`) USING BTREE, + -- KEY `idx_common_query` ( + -- 等值查询字段, + -- `is_hidden`,`is_delete`, + -- 其他参与排序字段, + -- `create_time` desc, + -- `guid`) USING BTREE + KEY `idx_common_query` (`is_hidden`,`is_delete`,`create_time` desc,`guid`) USING BTREE ) ENGINE = InnoDB COMMENT = '你的表格备注' ROW_FORMAT = Dynamic; ``` diff --git a/releases/tape-mybatis-generator-plugin-1.0-SNAPSHOT.jar b/releases/tape-mybatis-generator-plugin-1.0-SNAPSHOT.jar index a8ff2eb..966cf0d 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/TapeMybatisGeneratorPlugin.java b/src/main/java/com/iqudoo/framework/mybatis/TapeMybatisGeneratorPlugin.java index e7214c0..0b69364 100644 --- a/src/main/java/com/iqudoo/framework/mybatis/TapeMybatisGeneratorPlugin.java +++ b/src/main/java/com/iqudoo/framework/mybatis/TapeMybatisGeneratorPlugin.java @@ -9,61 +9,60 @@ import org.mybatis.generator.api.dom.xml.Attribute; import org.mybatis.generator.api.dom.xml.Document; import org.mybatis.generator.api.dom.xml.TextElement; import org.mybatis.generator.api.dom.xml.XmlElement; +import org.mybatis.generator.config.Context; import org.mybatis.generator.internal.util.StringUtility; import java.util.List; -import java.util.Properties; @SuppressWarnings("unused") public class TapeMybatisGeneratorPlugin extends PluginAdapter { - private final static int DEFAULT_START_PAGE = 1; - private final static int DEFAULT_PAGE_SIZE = 20; - private final static int DEFAULT_IGNORE_PAGE_SIZE = 10000; - private int startPage = DEFAULT_START_PAGE; - private int defaultPageSize = DEFAULT_PAGE_SIZE; - private int ignorePageSize = DEFAULT_IGNORE_PAGE_SIZE; - - @Override - public void setProperties(Properties properties) { - super.setProperties(properties); - if (StringUtility.stringHasValue(properties.getProperty("startPage"))) { - try { - startPage = Integer.parseInt(properties.getProperty("startPage")); - } catch (Throwable ignored) { - startPage = DEFAULT_START_PAGE; - } - } - if (StringUtility.stringHasValue(properties.getProperty("defaultPageSize"))) { - try { - defaultPageSize = Integer.parseInt(properties.getProperty("defaultPageSize")); - } catch (Throwable ignored) { - defaultPageSize = DEFAULT_PAGE_SIZE; - } - } - if (StringUtility.stringHasValue(properties.getProperty("ignorePageSize"))) { - try { - ignorePageSize = Integer.parseInt(properties.getProperty("ignorePageSize")); - } catch (Throwable ignored) { - ignorePageSize = DEFAULT_IGNORE_PAGE_SIZE; - } - } - } + private int startPageNum = 1; + private int maxPageSize = 100; + private int ignorePageSize = 10000; @Override public boolean validate(List list) { return true; } + @Override + public void setContext(Context context) { + super.setContext(context); + resolveConfiguration(); + } + + private void resolveConfiguration() { + startPageNum = intConfig("startPageNum", startPageNum); + ignorePageSize = intConfig("ignorePageSize", ignorePageSize); + maxPageSize = intConfig("maxPageSize", maxPageSize); + } + + private int intConfig(String key, int defaultValue) { + String v = properties.getProperty(key); + if (!StringUtility.stringHasValue(v) && context != null) { + v = context.getProperty(key); + } + if (!StringUtility.stringHasValue(v)) { + return defaultValue; + } + try { + return Integer.parseInt(v.trim()); + } catch (Throwable ignored) { + return defaultValue; + } + } + + @SuppressWarnings("DuplicatedCode") @Override public boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { PrimitiveTypeWrapper integerWrapper = FullyQualifiedJavaType.getIntInstance().getPrimitiveTypeWrapper(); - // 添加 minPageNum、defaultPageSize、maxPageSize、ignorePageSize 字段 + // 添加 startPageNum、maxPageSize、ignorePageSize 字段 Field maxPageSizeField = ElementTools.generateField( "maxPageSize", JavaVisibility.PROTECTED, integerWrapper, - "100" + this.maxPageSize + "" ); topLevelClass.addField(maxPageSizeField); @@ -75,21 +74,13 @@ public class TapeMybatisGeneratorPlugin extends PluginAdapter { ); topLevelClass.addField(ignorePageSizeField); - Field defaultPageSizeField = ElementTools.generateField( - "defaultPageSize", + Field startPageNumField = ElementTools.generateField( + "startPageNum", JavaVisibility.PROTECTED, integerWrapper, - defaultPageSize + "" + startPageNum + "" ); - topLevelClass.addField(defaultPageSizeField); - - Field minPageNumField = ElementTools.generateField( - "minPageNum", - JavaVisibility.PROTECTED, - integerWrapper, - startPage + "" - ); - topLevelClass.addField(minPageNumField); + topLevelClass.addField(startPageNumField); // 添加offset和rows字段 Field offsetField = ElementTools.generateField( @@ -127,7 +118,6 @@ public class TapeMybatisGeneratorPlugin extends PluginAdapter { FormatTools.addMethodWithBestPosition(topLevelClass, isWithBLOBsMethod); } - // 增加getter && setter 方法 Method mSetMaxPageSize = ElementTools.generateSetterMethod(maxPageSizeField); FormatTools.addMethodWithBestPosition(topLevelClass, mSetMaxPageSize); @@ -141,59 +131,41 @@ public class TapeMybatisGeneratorPlugin extends PluginAdapter { Method mGetIgnorePageSize = ElementTools.generateGetterMethod(ignorePageSizeField); FormatTools.addMethodWithBestPosition(topLevelClass, mGetIgnorePageSize); - Method mSetDefaultPageSize = ElementTools.generateSetterMethod(defaultPageSizeField); - FormatTools.addMethodWithBestPosition(topLevelClass, mSetDefaultPageSize); + Method mSetStartPageNum = ElementTools.generateSetterMethod(startPageNumField); + FormatTools.addMethodWithBestPosition(topLevelClass, mSetStartPageNum); - Method mGetDefaultPageSize = ElementTools.generateGetterMethod(defaultPageSizeField); - FormatTools.addMethodWithBestPosition(topLevelClass, mGetDefaultPageSize); - - Method mSetMinPageNum = ElementTools.generateSetterMethod(minPageNumField); - FormatTools.addMethodWithBestPosition(topLevelClass, mSetMinPageNum); - - Method mGetMinPageNum = ElementTools.generateGetterMethod(minPageNumField); - FormatTools.addMethodWithBestPosition(topLevelClass, mGetMinPageNum); - - Method mSetOffset = ElementTools.generateSetterMethod(offsetField); - FormatTools.addMethodWithBestPosition(topLevelClass, mSetOffset); - - Method mGetOffset = ElementTools.generateGetterMethod(offsetField); - FormatTools.addMethodWithBestPosition(topLevelClass, mGetOffset); - - Method mSetRows = ElementTools.generateSetterMethod(rowsField); - FormatTools.addMethodWithBestPosition(topLevelClass, mSetRows); - - Method mGetRows = ElementTools.generateGetterMethod(rowsField); - FormatTools.addMethodWithBestPosition(topLevelClass, mGetRows); + Method mGetStartPageNum = ElementTools.generateGetterMethod(startPageNumField); + FormatTools.addMethodWithBestPosition(topLevelClass, mGetStartPageNum); // 提供几个快捷方法 - Method setLimit = ElementTools.generateMethod( + Method setLimitByRows = ElementTools.generateMethod( "limit", JavaVisibility.PUBLIC, topLevelClass.getType(), new Parameter(integerWrapper, "rows") ); - setLimit = ElementTools.generateMethodBody( - setLimit, + setLimitByRows = ElementTools.generateMethodBody( + setLimitByRows, "this.offset = null;", "this.rows = rows;", "return this;" ); - FormatTools.addMethodWithBestPosition(topLevelClass, setLimit); + FormatTools.addMethodWithBestPosition(topLevelClass, setLimitByRows); - Method setLimit2 = ElementTools.generateMethod( + Method setLimitByOffsetRows = ElementTools.generateMethod( "limit", JavaVisibility.PUBLIC, topLevelClass.getType(), new Parameter(integerWrapper, "offset"), new Parameter(integerWrapper, "rows") ); - setLimit2 = ElementTools.generateMethodBody( - setLimit2, + setLimitByOffsetRows = ElementTools.generateMethodBody( + setLimitByOffsetRows, "this.offset = offset;", "this.rows = rows;", "return this;" ); - FormatTools.addMethodWithBestPosition(topLevelClass, setLimit2); + FormatTools.addMethodWithBestPosition(topLevelClass, setLimitByOffsetRows); Method usePage = ElementTools.generateMethod( "usePage", @@ -204,15 +176,15 @@ public class TapeMybatisGeneratorPlugin extends PluginAdapter { ); usePage = ElementTools.generateMethodBody( usePage, - "pageSize = pageSize == null || pageSize <= 0 ? this.defaultPageSize : pageSize;", - "pageNum = pageNum == null || pageNum < this.minPageNum ? this.minPageNum : pageNum;", + "pageSize = pageSize == null || pageSize <= 0 ? 1 : pageSize;", + "pageNum = pageNum == null || pageNum < this.startPageNum ? this.startPageNum : pageNum;", "if (pageSize >= this.ignorePageSize) {", "this.rows = null;", "this.offset = null;", "return this;", "}", "int cPageSize = pageSize > this.maxPageSize ? this.maxPageSize: pageSize;", - "this.offset = (pageNum - this.minPageNum) * cPageSize;", + "this.offset = (pageNum - this.startPageNum) * cPageSize;", "this.rows = cPageSize;", "return this;" ); @@ -227,9 +199,9 @@ public class TapeMybatisGeneratorPlugin extends PluginAdapter { getPageNum = ElementTools.generateMethodBody( getPageNum, "if (this.rows == null || this.offset == null || this.rows == 0) {", - "return this.minPageNum;", + "return this.startPageNum;", "}", - "return this.offset / this.rows + this.minPageNum;" + "return this.offset / this.rows + this.startPageNum;" ); FormatTools.addMethodWithBestPosition(topLevelClass, getPageNum); // 计算获取当前每页数量 @@ -247,6 +219,28 @@ public class TapeMybatisGeneratorPlugin extends PluginAdapter { ); FormatTools.addMethodWithBestPosition(topLevelClass, getPageSize); + Method getRows = ElementTools.generateMethod( + "getRows", + JavaVisibility.PUBLIC, + integerWrapper + ); + getRows = ElementTools.generateMethodBody( + getRows, + "return this.rows;" + ); + FormatTools.addMethodWithBestPosition(topLevelClass, getRows); + + Method getOffset = ElementTools.generateMethod( + "getOffset", + JavaVisibility.PUBLIC, + integerWrapper + ); + getOffset = ElementTools.generateMethodBody( + getOffset, + "return this.offset;" + ); + FormatTools.addMethodWithBestPosition(topLevelClass, getOffset); + // !!! clear 方法增加 offset 和 rows的清理 List methodList = topLevelClass.getMethods(); for (Method method : methodList) { diff --git a/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java b/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java index fed2138..77f5541 100644 --- a/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java +++ b/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java @@ -1,6 +1,7 @@ package com.iqudoo.framework.mybatis; import com.iqudoo.framework.mybatis.utils.ElementTools; +import com.iqudoo.framework.mybatis.utils.UtilTools; import org.mybatis.generator.api.*; import org.mybatis.generator.api.dom.DefaultJavaFormatter; import org.mybatis.generator.api.dom.java.*; @@ -11,13 +12,14 @@ import java.io.File; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; -import java.util.Properties; @SuppressWarnings({"DuplicatedCode", "unused", "SpellCheckingInspection", "ExtractMethodRecommender"}) public class TapeRepositoryGeneratorPlugin extends PluginAdapter { // 固定配置项 private String slowQueryLoggerTime = "300"; + private String priorityPrimaryKeyOffset = "0"; + private String slowQueryLoggerLevel = "error"; private String snowflakeUtilClass = "com.iqudoo.framework.tape.modules.utils.SnowflakeUtil"; private String snowflakeUtilGenId = "SnowflakeUtil.nextId()"; private String facadeRepositoryPackage = "com.iqudoo.platform.application.facade.repository"; @@ -30,49 +32,51 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { // 1.4.1版本专用:Java格式化器 private JavaFormatter javaFormatter; - @Override - public void setContext(Context context) { - super.setContext(context); - this.javaFormatter = new DefaultJavaFormatter(); - this.javaFormatter.setContext(context); - } - @Override public boolean validate(List warnings) { return true; } @Override - public void setProperties(Properties properties) { - super.setProperties(properties); - // 读取自定义配置 - if (StringUtility.stringHasValue(properties.getProperty("slowQueryLoggerTime"))) { - slowQueryLoggerTime = properties.getProperty("slowQueryLoggerTime"); + public void setContext(Context context) { + super.setContext(context); + this.javaFormatter = new DefaultJavaFormatter(); + this.javaFormatter.setContext(context); + resolveConfiguration(); + } + + private void resolveConfiguration() { + slowQueryLoggerTime = stringConfig("slowQueryLoggerTime", slowQueryLoggerTime); + slowQueryLoggerLevel = stringConfig("slowQueryLoggerLevel", slowQueryLoggerLevel); + priorityPrimaryKeyOffset = stringConfig("priorityPrimaryKeyOffset", priorityPrimaryKeyOffset); + if (!UtilTools.inArray(new String[]{"error", "warn", "debug", "info"}, slowQueryLoggerLevel)) { + slowQueryLoggerLevel = "error"; } - if (StringUtility.stringHasValue(properties.getProperty("snowflakeUtilClass"))) { - snowflakeUtilClass = properties.getProperty("snowflakeUtilClass"); + snowflakeUtilClass = stringConfig("snowflakeUtilClass", snowflakeUtilClass); + snowflakeUtilGenId = stringConfig("snowflakeUtilGenId", snowflakeUtilGenId); + facadeRepositoryPackage = stringConfig("facadeRepositoryPackage", facadeRepositoryPackage); + domainRepositoryPackage = stringConfig("domainRepositoryPackage", domainRepositoryPackage); + modelPackage = stringConfig("modelPackage", modelPackage); + mapperPackage = stringConfig("mapperPackage", mapperPackage); + targetProject = stringConfig("targetProject", targetProject); + viewKeyWords = stringConfig("viewKeyWords", viewKeyWords); + if (StringUtility.stringHasValue(viewKeyWords)) { + viewKeyWords = viewKeyWords.toUpperCase(); } - if (StringUtility.stringHasValue(properties.getProperty("snowflakeUtilGenId"))) { - snowflakeUtilGenId = properties.getProperty("snowflakeUtilGenId"); + } + + private String stringConfig(String key, String defaultValue) { + String v = properties.getProperty(key); + if (StringUtility.stringHasValue(v)) { + return v; } - if (StringUtility.stringHasValue(properties.getProperty("facadeRepositoryPackage"))) { - facadeRepositoryPackage = properties.getProperty("facadeRepositoryPackage"); - } - if (StringUtility.stringHasValue(properties.getProperty("domainRepositoryPackage"))) { - domainRepositoryPackage = properties.getProperty("domainRepositoryPackage"); - } - if (StringUtility.stringHasValue(properties.getProperty("modelPackage"))) { - modelPackage = properties.getProperty("modelPackage"); - } - if (StringUtility.stringHasValue(properties.getProperty("mapperPackage"))) { - mapperPackage = properties.getProperty("mapperPackage"); - } - if (StringUtility.stringHasValue(properties.getProperty("targetProject"))) { - targetProject = properties.getProperty("targetProject"); - } - if (StringUtility.stringHasValue(properties.getProperty("viewKeyWords"))) { - viewKeyWords = properties.getProperty("viewKeyWords").toUpperCase(); + if (context != null) { + v = context.getProperty(key); + if (StringUtility.stringHasValue(v)) { + return v; + } } + return defaultValue; } /** @@ -286,7 +290,16 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { countByValidMethod.setAbstract(true); repositoryInterface.addMethod(countByValidMethod); - // 15. countByTrash + // 15. countByValidWithPage + Method countByValidWithPageMethod = new Method("countByValidWithPage"); + countByValidWithPageMethod.setVisibility(JavaVisibility.PUBLIC); + countByValidWithPageMethod.setReturnType(new FullyQualifiedJavaType("long")); + countByValidWithPageMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), "example")); + countByValidWithPageMethod.addException(new FullyQualifiedJavaType("Throwable")); + countByValidWithPageMethod.setAbstract(true); + repositoryInterface.addMethod(countByValidWithPageMethod); + + // 16. countByTrash Method countByTrashMethod = new Method("countByTrash"); countByTrashMethod.setVisibility(JavaVisibility.PUBLIC); countByTrashMethod.setReturnType(new FullyQualifiedJavaType("long")); @@ -295,7 +308,16 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { countByTrashMethod.setAbstract(true); repositoryInterface.addMethod(countByTrashMethod); - // 16. insert + // 17. countByTrashWithPage + Method countByTrashWithPageMethod = new Method("countByTrashWithPage"); + countByTrashWithPageMethod.setVisibility(JavaVisibility.PUBLIC); + countByTrashWithPageMethod.setReturnType(new FullyQualifiedJavaType("long")); + countByTrashWithPageMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), "example")); + countByTrashWithPageMethod.addException(new FullyQualifiedJavaType("Throwable")); + countByTrashWithPageMethod.setAbstract(true); + repositoryInterface.addMethod(countByTrashWithPageMethod); + + // 18. insert Method insertMethod = new Method("insert"); insertMethod.setVisibility(JavaVisibility.PUBLIC); insertMethod.setReturnType(new FullyQualifiedJavaType(modelClassName)); @@ -304,7 +326,7 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { insertMethod.setAbstract(true); repositoryInterface.addMethod(insertMethod); - // 17. update + // 19. update Method updateMethod = new Method("update"); updateMethod.setVisibility(JavaVisibility.PUBLIC); updateMethod.setReturnType(new FullyQualifiedJavaType("int")); @@ -313,7 +335,7 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { updateMethod.setAbstract(true); repositoryInterface.addMethod(updateMethod); - // 17. updateByExampleSelective + // 20. updateByExampleSelective Method updateByExampleSelectiveMethod = new Method("updateByExampleSelective"); updateByExampleSelectiveMethod.setVisibility(JavaVisibility.PUBLIC); updateByExampleSelectiveMethod.setReturnType(new FullyQualifiedJavaType("int")); @@ -379,8 +401,10 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { generateFindTrashOneMethod(implClass, modelClassName, exampleClassName); generateGetValidListMethod(implClass, modelClassName, exampleClassName, mapperFieldName, hasBLOBColumns); generateGetTrashListMethod(implClass, modelClassName, exampleClassName, mapperFieldName, hasBLOBColumns); - generateCountByValidMethod(implClass, exampleClassName, mapperFieldName); - generateCountByTrashMethod(implClass, exampleClassName, mapperFieldName); + generateCountByValidMethod(implClass, modelClassName, exampleClassName, mapperFieldName); + generateCountByValidWithPageMethod(implClass, modelClassName, exampleClassName, mapperFieldName); + generateCountByTrashMethod(implClass, modelClassName, exampleClassName, mapperFieldName); + generateCountByTrashWithPageMethod(implClass, modelClassName, exampleClassName, mapperFieldName); return implClass; } @@ -798,43 +822,48 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("for (" + exampleClassName + ".Criteria criteria : example.getOredCriteria()) {"); method.addBodyLine("criteria.andIsDeleteEqualTo(0).andIsHiddenEqualTo(0);"); method.addBodyLine("}"); + method.addBodyLine("List<" + modelClassName + "> result = null;"); 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();"); - } - method.addBodyLine("example = new " + exampleClassName + "();"); - method.addBodyLine("example.createCriteria().andGuidIn(primaryKeyList);"); - method.addBodyLine("example.setOrderByClause(oldOrderByClause);"); - if (hasBLOBColumns) { - method.addBodyLine("example.setWithBLOBs(withBLOBsFlag);"); - } - method.addBodyLine("}"); - - if (hasBLOBColumns) { - method.addBodyLine("if (example.isWithBLOBs()) {"); - method.addBodyLine("return " + mapperFieldName + ".selectByExampleWithBLOBs(example);"); + method.addBodyLine("if (example.getRows() != null && example.getOffset() != null && example.getOffset() > " + priorityPrimaryKeyOffset + ") {"); + 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." + slowQueryLoggerLevel + "(\"Select " + modelClassName + " valid list primary key use long time: \" + findPrimaryKeyTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-> criteria: \" + example.getOredCriteria() +"); + method.addBodyLine(" \"\\n\\t|-> order by: \" + example.getOrderByClause() +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); + method.addBodyLine("}"); + method.addBodyLine("// reset start time"); + method.addBodyLine("startTime = new Date().getTime();"); + method.addBodyLine("String oldOrderByClause = example.getOrderByClause();"); + method.addBodyLine("Boolean withBLOBsFlag = example.isWithBLOBs();"); + method.addBodyLine("example = new " + exampleClassName + "();"); + method.addBodyLine("example.createCriteria().andGuidIn(primaryKeyList);"); + method.addBodyLine("example.setOrderByClause(oldOrderByClause);"); + method.addBodyLine("example.setWithBLOBs(withBLOBsFlag);"); + method.addBodyLine("}"); + method.addBodyLine("if (example.isWithBLOBs()) {"); + method.addBodyLine("result = " + mapperFieldName + ".selectByExampleWithBLOBs(example);"); + method.addBodyLine("} else {"); + method.addBodyLine("result = " + mapperFieldName + ".selectByExample(example);"); method.addBodyLine("}"); - method.addBodyLine("return " + mapperFieldName + ".selectByExample(example);"); } else { - method.addBodyLine("return " + mapperFieldName + ".selectByExample(example);"); + method.addBodyLine("result = " + 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("LOGGER." + slowQueryLoggerLevel + "(\"Select " + modelClassName + " valid list use long time: \" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-> criteria: \" + example.getOredCriteria() +"); + method.addBodyLine(" \"\\n\\t|-> order by: \" + example.getOrderByClause() +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); method.addBodyLine("}"); + method.addBodyLine("return result;"); implClass.addMethod(method); } @@ -850,47 +879,52 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("for (" + exampleClassName + ".Criteria criteria : example.getOredCriteria()) {"); method.addBodyLine("criteria.andIsDeleteEqualTo(0).andIsHiddenEqualTo(1);"); method.addBodyLine("}"); + method.addBodyLine("List<" + modelClassName + "> result = null;"); 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();"); - } - method.addBodyLine("example = new " + exampleClassName + "();"); - method.addBodyLine("example.createCriteria().andGuidIn(primaryKeyList);"); - method.addBodyLine("example.setOrderByClause(oldOrderByClause);"); - if (hasBLOBColumns) { - method.addBodyLine("example.setWithBLOBs(withBLOBsFlag);"); - } - method.addBodyLine("}"); - - if (hasBLOBColumns) { - method.addBodyLine("if (example.isWithBLOBs()) {"); - method.addBodyLine("return " + mapperFieldName + ".selectByExampleWithBLOBs(example);"); + method.addBodyLine("if (example.getRows() != null && example.getOffset() != null && example.getOffset() > " + priorityPrimaryKeyOffset + ") {"); + 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." + slowQueryLoggerLevel + "(\"Select " + modelClassName + " trash list primary key use long time: \" + findPrimaryKeyTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-> criteria: \" + example.getOredCriteria() +"); + method.addBodyLine(" \"\\n\\t|-> order by: \" + example.getOrderByClause() +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); + method.addBodyLine("}"); + method.addBodyLine("// reset start time"); + method.addBodyLine("startTime = new Date().getTime();"); + method.addBodyLine("String oldOrderByClause = example.getOrderByClause();"); + method.addBodyLine("Boolean withBLOBsFlag = example.isWithBLOBs();"); + method.addBodyLine("example = new " + exampleClassName + "();"); + method.addBodyLine("example.createCriteria().andGuidIn(primaryKeyList);"); + method.addBodyLine("example.setOrderByClause(oldOrderByClause);"); + method.addBodyLine("example.setWithBLOBs(withBLOBsFlag);"); + method.addBodyLine("}"); + method.addBodyLine("if (example.isWithBLOBs()) {"); + method.addBodyLine("result = " + mapperFieldName + ".selectByExampleWithBLOBs(example);"); + method.addBodyLine("} else {"); + method.addBodyLine("result = " + mapperFieldName + ".selectByExample(example);"); method.addBodyLine("}"); - method.addBodyLine("return " + mapperFieldName + ".selectByExample(example);"); } else { - method.addBodyLine("return " + mapperFieldName + ".selectByExample(example);"); + method.addBodyLine("result = " + 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("LOGGER." + slowQueryLoggerLevel + "(\"Select " + modelClassName + " trash list use long time: \" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-> criteria: \" + example.getOredCriteria() +"); + method.addBodyLine(" \"\\n\\t|-> order by: \" + example.getOrderByClause() +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); method.addBodyLine("}"); + method.addBodyLine("return result;"); implClass.addMethod(method); } - private void generateCountByValidMethod(TopLevelClass implClass, String exampleClassName, String mapperFieldName) { + private void generateCountByValidMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { Method method = new Method("countByValid"); method.addAnnotation("@Override"); method.setVisibility(JavaVisibility.PUBLIC); @@ -902,19 +936,38 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { 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 count = " + mapperFieldName + ".countByExample(example);"); 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("LOGGER." + slowQueryLoggerLevel + "(\"Select " + modelClassName + " valid count use long time: \" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-> criteria: \" + example.getOredCriteria() +"); + method.addBodyLine(" \"\\n\\t|-> order by: \" + example.getOrderByClause() +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); method.addBodyLine("}"); + method.addBodyLine("return count;"); implClass.addMethod(method); } - private void generateCountByTrashMethod(TopLevelClass implClass, String exampleClassName, String mapperFieldName) { + private void generateCountByValidWithPageMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { + Method method = new Method("countByValidWithPage"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType("long")); + method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), "example")); + method.addException(new FullyQualifiedJavaType("Throwable")); + + method.addBodyLine("// When not paginated, the count query returns 0 to avoid unnecessary queries"); + method.addBodyLine("if (example.getRows() != null && example.getOffset() != null) {"); + method.addBodyLine("return countByValid(example);"); + method.addBodyLine("}"); + method.addBodyLine("return 0L;"); + + implClass.addMethod(method); + } + + private void generateCountByTrashMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { Method method = new Method("countByTrash"); method.addAnnotation("@Override"); method.setVisibility(JavaVisibility.PUBLIC); @@ -926,14 +979,33 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { 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 count = " + mapperFieldName + ".countByExample(example);"); 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("LOGGER." + slowQueryLoggerLevel + "(\"Select " + modelClassName + " trash count use long time: \" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-> criteria: \" + example.getOredCriteria() +"); + method.addBodyLine(" \"\\n\\t|-> order by: \" + example.getOrderByClause() +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); method.addBodyLine("}"); + method.addBodyLine("return count;"); + + implClass.addMethod(method); + } + + private void generateCountByTrashWithPageMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { + Method method = new Method("countByTrashWithPage"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType("long")); + method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), "example")); + method.addException(new FullyQualifiedJavaType("Throwable")); + + method.addBodyLine("// When not paginated, the count query returns 0 to avoid unnecessary queries"); + method.addBodyLine("if (example.getRows() != null && example.getOffset() != null) {"); + method.addBodyLine("return countByTrash(example);"); method.addBodyLine("}"); + method.addBodyLine("return 0L;"); 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 2384dda..48a901e 100644 --- a/src/main/java/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.java +++ b/src/main/java/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.java @@ -1,6 +1,7 @@ package com.iqudoo.framework.mybatis; import com.iqudoo.framework.mybatis.utils.ElementTools; +import com.iqudoo.framework.mybatis.utils.UtilTools; import org.mybatis.generator.api.GeneratedJavaFile; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.JavaFormatter; @@ -14,62 +15,65 @@ import java.io.File; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; -import java.util.Properties; @SuppressWarnings({"DuplicatedCode", "SpellCheckingInspection", "ExtractMethodRecommender"}) public class TapeRepoviewGeneratorPlugin extends PluginAdapter { // 视图Repo包配置(可通过配置文件自定义) private String slowQueryLoggerTime = "300"; + private String slowQueryLoggerLevel = "error"; 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"; private String mapperPackage = "com.iqudoo.platform.application.database.mapper"; private String targetProject = "src/main/java"; - - // 视图名称关键字(可配置) private String viewKeyWords = "VIEW_,V_"; // 1.4.1版本专用格式化器 private JavaFormatter javaFormatter; - @Override - public void setContext(Context context) { - super.setContext(context); - this.javaFormatter = new DefaultJavaFormatter(); - this.javaFormatter.setContext(context); - } - @Override public boolean validate(List warnings) { return true; } @Override - public void setProperties(Properties properties) { - super.setProperties(properties); - // 读取自定义配置 - if (StringUtility.stringHasValue(properties.getProperty("slowQueryLoggerTime"))) { - slowQueryLoggerTime = properties.getProperty("slowQueryLoggerTime"); + public void setContext(Context context) { + super.setContext(context); + this.javaFormatter = new DefaultJavaFormatter(); + this.javaFormatter.setContext(context); + resolveConfiguration(); + } + + private void resolveConfiguration() { + slowQueryLoggerTime = stringConfig("slowQueryLoggerTime", slowQueryLoggerTime); + slowQueryLoggerLevel = stringConfig("slowQueryLoggerLevel", slowQueryLoggerLevel); + if (!UtilTools.inArray(new String[]{"error", "warn", "debug", "info"}, slowQueryLoggerLevel)) { + slowQueryLoggerLevel = "error"; } - if (StringUtility.stringHasValue(properties.getProperty("facadeRepoviewPackage"))) { - facadeRepoviewPackage = properties.getProperty("facadeRepoviewPackage"); + facadeRepoviewPackage = stringConfig("facadeRepoviewPackage", facadeRepoviewPackage); + domainRepoviewPackage = stringConfig("domainRepoviewPackage", domainRepoviewPackage); + modelPackage = stringConfig("modelPackage", modelPackage); + mapperPackage = stringConfig("mapperPackage", mapperPackage); + targetProject = stringConfig("targetProject", targetProject); + viewKeyWords = stringConfig("viewKeyWords", viewKeyWords); + if (StringUtility.stringHasValue(viewKeyWords)) { + viewKeyWords = viewKeyWords.toUpperCase(); } - if (StringUtility.stringHasValue(properties.getProperty("domainRepoviewPackage"))) { - domainRepoviewPackage = properties.getProperty("domainRepoviewPackage"); + } + + private String stringConfig(String key, String defaultValue) { + String v = properties.getProperty(key); + if (StringUtility.stringHasValue(v)) { + return v; } - if (StringUtility.stringHasValue(properties.getProperty("modelPackage"))) { - modelPackage = properties.getProperty("modelPackage"); - } - if (StringUtility.stringHasValue(properties.getProperty("mapperPackage"))) { - mapperPackage = properties.getProperty("mapperPackage"); - } - if (StringUtility.stringHasValue(properties.getProperty("targetProject"))) { - targetProject = properties.getProperty("targetProject"); - } - if (StringUtility.stringHasValue(properties.getProperty("viewKeyWords"))) { - viewKeyWords = properties.getProperty("viewKeyWords").toUpperCase(); + if (context != null) { + v = context.getProperty(key); + if (StringUtility.stringHasValue(v)) { + return v; + } } + return defaultValue; } /** @@ -183,6 +187,15 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { countMethod.setAbstract(true); repoInterface.addMethod(countMethod); + // 4. 添加countWithPage方法 + Method countWithPageMethod = new Method("countWithPage"); + countWithPageMethod.setVisibility(JavaVisibility.PUBLIC); + countWithPageMethod.setReturnType(new FullyQualifiedJavaType("long")); + countWithPageMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), "example")); + countWithPageMethod.addException(new FullyQualifiedJavaType("Throwable")); + countWithPageMethod.setAbstract(true); + repoInterface.addMethod(countWithPageMethod); + return repoInterface; } @@ -225,12 +238,10 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { mapperField.addAnnotation("@Resource"); implClass.addField(mapperField); - // 生成findOne方法 - generateFindOneMethod(implClass, modelClassName, exampleClassName, mapperFieldName); - // 生成getList方法 + generateFindOneMethod(implClass, modelClassName, exampleClassName); generateGetListMethod(implClass, modelClassName, exampleClassName, mapperFieldName, hasBLOBColumns); - // 生成count方法 - generateCountMethod(implClass, exampleClassName, mapperFieldName); + generateCountMethod(implClass, modelClassName, exampleClassName, mapperFieldName); + generateCountWithPageMethod(implClass, modelClassName, exampleClassName, mapperFieldName); return implClass; } @@ -251,14 +262,14 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { 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")); } /** * 生成findOne方法 */ - private void generateFindOneMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { + private void generateFindOneMethod(TopLevelClass implClass, String modelClassName, String exampleClassName) { Method method = new Method("findOne"); method.addAnnotation("@Override"); method.setVisibility(JavaVisibility.PUBLIC); @@ -289,29 +300,33 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { // 参数名匹配示例(首字母小写) method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), "example")); method.addException(new FullyQualifiedJavaType("Throwable")); + method.addBodyLine("List<" + modelClassName + "> result = null;"); method.addBodyLine("long startTime = new Date().getTime();"); - method.addBodyLine("try {"); if (hasBLOBColumns) { method.addBodyLine("if (example.isWithBLOBs()) {"); - method.addBodyLine("return " + mapperFieldName + ".selectByExampleWithBLOBs(example);"); + method.addBodyLine("result = " + mapperFieldName + ".selectByExampleWithBLOBs(example);"); + method.addBodyLine("} else {"); + method.addBodyLine("result = " + mapperFieldName + ".selectByExample(example);"); method.addBodyLine("}"); - method.addBodyLine("return " + mapperFieldName + ".selectByExample(example);"); } else { - method.addBodyLine("return " + mapperFieldName + ".selectByExample(example);"); + method.addBodyLine("result = " + 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("LOGGER." + slowQueryLoggerLevel + "(\"Select " + modelClassName + " view list use long time: \" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-> criteria: \" + example.getOredCriteria() +"); + method.addBodyLine(" \"\\n\\t|-> order by: \" + example.getOrderByClause() +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); method.addBodyLine("}"); + method.addBodyLine("return result;"); implClass.addMethod(method); } /** * 生成count方法 */ - private void generateCountMethod(TopLevelClass implClass, String exampleClassName, String mapperFieldName) { + private void generateCountMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { Method method = new Method("count"); method.addAnnotation("@Override"); method.setVisibility(JavaVisibility.PUBLIC); @@ -322,14 +337,38 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { // 方法体 method.addBodyLine("long startTime = new Date().getTime();"); - method.addBodyLine("try {"); - method.addBodyLine("return " + mapperFieldName + ".countByExample(example);"); - method.addBodyLine("} finally {"); + method.addBodyLine("long count = " + mapperFieldName + ".countByExample(example);"); 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("LOGGER." + slowQueryLoggerLevel + "(\"Select " + modelClassName + " view count use long time: \" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-> criteria: \" + example.getOredCriteria() +"); + method.addBodyLine(" \"\\n\\t|-> order by: \" + example.getOrderByClause() +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); method.addBodyLine("}"); + method.addBodyLine("return count;"); + + implClass.addMethod(method); + } + + /** + * 生成count方法 + */ + private void generateCountWithPageMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { + Method method = new Method("countWithPage"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType("long")); + // 参数名匹配示例(首字母小写) + method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), "example")); + method.addException(new FullyQualifiedJavaType("Throwable")); + + // 方法体 + method.addBodyLine("// When not paginated, the count query returns 0 to avoid unnecessary queries"); + method.addBodyLine("if (example.getRows() != null && example.getOffset() != null) {"); + method.addBodyLine("return count(example);"); method.addBodyLine("}"); + method.addBodyLine("return 0L;"); implClass.addMethod(method); } diff --git a/src/main/java/com/iqudoo/framework/mybatis/utils/UtilTools.java b/src/main/java/com/iqudoo/framework/mybatis/utils/UtilTools.java new file mode 100644 index 0000000..ab60741 --- /dev/null +++ b/src/main/java/com/iqudoo/framework/mybatis/utils/UtilTools.java @@ -0,0 +1,15 @@ +package com.iqudoo.framework.mybatis.utils; + +@SuppressWarnings("BooleanMethodIsAlwaysInverted") +public class UtilTools { + + public static boolean inArray(T[] array, T target) { + for (T val : array) { + if (val != null && val.equals(target)) { + return true; + } + } + return false; + } + +}