From ea0efee0746883601b16068945307e480a5eb43a Mon Sep 17 00:00:00 2001 From: Jeremy Liang Date: Wed, 4 Feb 2026 03:21:09 +0800 Subject: [PATCH] init commit --- .idea/.gitignore | 8 + .idea/compiler.xml | 13 + .idea/jarRepositories.xml | 20 + .idea/misc.xml | 12 + .idea/vcs.xml | 6 + README.md | 98 ++ pom.xml | 93 ++ ...-mybatis-generator-plugin-1.0-SNAPSHOT.jar | Bin 0 -> 31393 bytes .../mybatis/TapeMybatisGeneratorPlugin.java | 91 ++ .../TapeRepositoryGeneratorPlugin.java | 870 ++++++++++++++++++ .../mybatis/TapeRepoviewGeneratorPlugin.java | 368 ++++++++ .../abstracts/AbstractWithLimitPlugin.java | 229 +++++ .../hook/ISelectSelectivePluginHook.java | 9 + .../framework/mybatis/utils/ElementTools.java | 152 +++ .../framework/mybatis/utils/FormatTools.java | 234 +++++ target/apidocs/allclasses-frame.html | 26 + target/apidocs/allclasses-noframe.html | 26 + .../mybatis/TapeMybatisGeneratorPlugin.html | 355 +++++++ .../TapeRepositoryGeneratorPlugin.html | 374 ++++++++ .../mybatis/TapeRepoviewGeneratorPlugin.html | 374 ++++++++ .../abstracts/AbstractWithLimitPlugin.html | 445 +++++++++ .../class-use/AbstractWithLimitPlugin.html | 166 ++++ .../mybatis/abstracts/package-frame.html | 21 + .../mybatis/abstracts/package-summary.html | 144 +++ .../mybatis/abstracts/package-tree.html | 143 +++ .../mybatis/abstracts/package-use.html | 159 ++++ .../class-use/TapeMybatisGeneratorPlugin.html | 126 +++ .../TapeRepositoryGeneratorPlugin.html | 126 +++ .../TapeRepoviewGeneratorPlugin.html | 126 +++ .../hook/ISelectSelectivePluginHook.html | 227 +++++ .../class-use/ISelectSelectivePluginHook.html | 188 ++++ .../framework/mybatis/hook/package-frame.html | 21 + .../mybatis/hook/package-summary.html | 144 +++ .../framework/mybatis/hook/package-tree.html | 135 +++ .../framework/mybatis/hook/package-use.html | 178 ++++ .../framework/mybatis/package-frame.html | 23 + .../framework/mybatis/package-summary.html | 156 ++++ .../framework/mybatis/package-tree.html | 149 +++ .../iqudoo/framework/mybatis/package-use.html | 126 +++ .../framework/mybatis/utils/ElementTools.html | 463 ++++++++++ .../framework/mybatis/utils/FormatTools.html | 446 +++++++++ .../mybatis/utils/class-use/ElementTools.html | 126 +++ .../mybatis/utils/class-use/FormatTools.html | 126 +++ .../mybatis/utils/package-frame.html | 22 + .../mybatis/utils/package-summary.html | 148 +++ .../framework/mybatis/utils/package-tree.html | 140 +++ .../framework/mybatis/utils/package-use.html | 126 +++ target/apidocs/constant-values.html | 126 +++ target/apidocs/deprecated-list.html | 126 +++ target/apidocs/help-doc.html | 231 +++++ target/apidocs/index-all.html | 337 +++++++ target/apidocs/index.html | 76 ++ target/apidocs/overview-frame.html | 25 + target/apidocs/overview-summary.html | 152 +++ target/apidocs/overview-tree.html | 158 ++++ target/apidocs/package-list | 4 + target/apidocs/script.js | 30 + target/apidocs/stylesheet.css | 574 ++++++++++++ .../mybatis/TapeMybatisGeneratorPlugin.class | Bin 0 -> 4613 bytes .../TapeRepositoryGeneratorPlugin.class | Bin 0 -> 29070 bytes .../mybatis/TapeRepoviewGeneratorPlugin.class | Bin 0 -> 12808 bytes .../abstracts/AbstractWithLimitPlugin.class | Bin 0 -> 7907 bytes .../hook/ISelectSelectivePluginHook.class | Bin 0 -> 250 bytes .../mybatis/utils/ElementTools.class | Bin 0 -> 5214 bytes .../framework/mybatis/utils/FormatTools.class | Bin 0 -> 7622 bytes .../javadoc-options-javadoc-resources.xml | 10 + target/javadoc-bundle-options/package-list | 217 +++++ target/maven-archiver/pom.properties | 3 + target/maven-javadoc-plugin-stale-data.txt | 19 + .../compile/default-compile/createdFiles.lst | 0 .../compile/default-compile/inputFiles.lst | 7 + ...-generator-plugin-1.0-SNAPSHOT-javadoc.jar | Bin 0 -> 82146 bytes ...-generator-plugin-1.0-SNAPSHOT-sources.jar | Bin 0 -> 19311 bytes ...-mybatis-generator-plugin-1.0-SNAPSHOT.jar | Bin 0 -> 31393 bytes 74 files changed, 9853 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 README.md create mode 100644 pom.xml create mode 100644 releases/tape-mybatis-generator-plugin-1.0-SNAPSHOT.jar create mode 100644 src/main/java/com/iqudoo/framework/mybatis/TapeMybatisGeneratorPlugin.java create mode 100644 src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java create mode 100644 src/main/java/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.java create mode 100644 src/main/java/com/iqudoo/framework/mybatis/abstracts/AbstractWithLimitPlugin.java create mode 100644 src/main/java/com/iqudoo/framework/mybatis/hook/ISelectSelectivePluginHook.java create mode 100644 src/main/java/com/iqudoo/framework/mybatis/utils/ElementTools.java create mode 100644 src/main/java/com/iqudoo/framework/mybatis/utils/FormatTools.java create mode 100644 target/apidocs/allclasses-frame.html create mode 100644 target/apidocs/allclasses-noframe.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/TapeMybatisGeneratorPlugin.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/abstracts/AbstractWithLimitPlugin.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/abstracts/class-use/AbstractWithLimitPlugin.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-frame.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-summary.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-tree.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-use.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/class-use/TapeMybatisGeneratorPlugin.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/class-use/TapeRepositoryGeneratorPlugin.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/class-use/TapeRepoviewGeneratorPlugin.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/hook/ISelectSelectivePluginHook.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/hook/class-use/ISelectSelectivePluginHook.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/hook/package-frame.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/hook/package-summary.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/hook/package-tree.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/hook/package-use.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/package-frame.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/package-summary.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/package-tree.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/package-use.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/utils/ElementTools.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/utils/FormatTools.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/utils/class-use/ElementTools.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/utils/class-use/FormatTools.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/utils/package-frame.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/utils/package-summary.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/utils/package-tree.html create mode 100644 target/apidocs/com/iqudoo/framework/mybatis/utils/package-use.html create mode 100644 target/apidocs/constant-values.html create mode 100644 target/apidocs/deprecated-list.html create mode 100644 target/apidocs/help-doc.html create mode 100644 target/apidocs/index-all.html create mode 100644 target/apidocs/index.html create mode 100644 target/apidocs/overview-frame.html create mode 100644 target/apidocs/overview-summary.html create mode 100644 target/apidocs/overview-tree.html create mode 100644 target/apidocs/package-list create mode 100644 target/apidocs/script.js create mode 100644 target/apidocs/stylesheet.css create mode 100644 target/classes/com/iqudoo/framework/mybatis/TapeMybatisGeneratorPlugin.class create mode 100644 target/classes/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.class create mode 100644 target/classes/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.class create mode 100644 target/classes/com/iqudoo/framework/mybatis/abstracts/AbstractWithLimitPlugin.class create mode 100644 target/classes/com/iqudoo/framework/mybatis/hook/ISelectSelectivePluginHook.class create mode 100644 target/classes/com/iqudoo/framework/mybatis/utils/ElementTools.class create mode 100644 target/classes/com/iqudoo/framework/mybatis/utils/FormatTools.class create mode 100644 target/javadoc-bundle-options/javadoc-options-javadoc-resources.xml create mode 100644 target/javadoc-bundle-options/package-list create mode 100644 target/maven-archiver/pom.properties create mode 100644 target/maven-javadoc-plugin-stale-data.txt create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 target/tape-mybatis-generator-plugin-1.0-SNAPSHOT-javadoc.jar create mode 100644 target/tape-mybatis-generator-plugin-1.0-SNAPSHOT-sources.jar create mode 100644 target/tape-mybatis-generator-plugin-1.0-SNAPSHOT.jar diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..1d795f2 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..712ab9d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..e17ca22 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f49d243 --- /dev/null +++ b/README.md @@ -0,0 +1,98 @@ +# tape-mybatis-generator-plugin +> MyBatis 代码生成插件 + + +## Uses +in `pom.xml` +``` + + application + + + + + org.mybatis.generator + mybatis-generator-maven-plugin + 1.4.0 + + src/main/resources/mybatis.generator.xml + true + true + + + + Generate MyBatis Artifacts + deploy + + generate + + + + + + mysql + mysql-connector-java + runtime + 8.0.33 + + + com.iqudoo.framework + tape-mybaits-generator-plugin + 1.0-SNAPSHOT + ${project.basedir}/src/lib/tape-mybaits-generator-plugin-1.0-SNAPSHOT.jar + system + + + + + +``` +in `mybatis.generator.xml` +``` + + + + + + + + + + + + +``` + +## Table Template +``` +DROP TABLE IF EXISTS `your_table_name`; +CREATE TABLE `your_table_name` ( + `guid` bigint(0) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'GUID', + -- ---------------------------- + -- add your other table field + -- ---------------------------- + `is_hidden` int(0) NOT NULL DEFAULT 0 COMMENT '隐藏标志', + `is_delete` int(0) NOT NULL DEFAULT 0 COMMENT '删除标志', + `delete_token` varchar(32) NULL DEFAULT '' COMMENT '删除令牌', + `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 +) ENGINE = InnoDB COMMENT = '应用基础信息表' ROW_FORMAT = Dynamic; +``` +in `mybatis.generator.xml` +``` + + + +
+``` diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..a0fbe36 --- /dev/null +++ b/pom.xml @@ -0,0 +1,93 @@ + + 4.0.0 + + com.iqudoo.framework + tape-mybatis-generator-plugin + 1.0-SNAPSHOT + jar + + + + jcenter + https://oss.jfrog.org/artifactory/libs-release/ + + + jcenter-snapshots + https://oss.jfrog.org/artifactory/libs-snapshot/ + + + + + + org.mybatis.generator + mybatis-generator-core + 1.4.1 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.1 + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.2.0 + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + sign-artifacts + verify + + sign + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + + + + \ No newline at end of file diff --git a/releases/tape-mybatis-generator-plugin-1.0-SNAPSHOT.jar b/releases/tape-mybatis-generator-plugin-1.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..d079541a60be47d3111459916ff93cffca7ac5e1 GIT binary patch literal 31393 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 Z8l~kV!N7kipuYWxy`3-+wEubce*l27z>xp| literal 0 HcmV?d00001 diff --git a/src/main/java/com/iqudoo/framework/mybatis/TapeMybatisGeneratorPlugin.java b/src/main/java/com/iqudoo/framework/mybatis/TapeMybatisGeneratorPlugin.java new file mode 100644 index 0000000..6804699 --- /dev/null +++ b/src/main/java/com/iqudoo/framework/mybatis/TapeMybatisGeneratorPlugin.java @@ -0,0 +1,91 @@ +package com.iqudoo.framework.mybatis; + +import com.iqudoo.framework.mybatis.abstracts.AbstractWithLimitPlugin; +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.dom.java.*; +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; + +@SuppressWarnings("unused") +public class TapeMybatisGeneratorPlugin extends AbstractWithLimitPlugin { + + // ============================================ selectPrimaryKeyByExample ========================================== + + @Override + public boolean clientGenerated(Interface interfaze, IntrospectedTable introspectedTable) { + if (introspectedTable.getTargetRuntime() != IntrospectedTable.TargetRuntime.MYBATIS3) { + return true; + } + // 添加接口方法 + if (introspectedTable.getPrimaryKeyColumns().size() <= 0) { + return true; + } + // 获取主键列类型 + FullyQualifiedJavaType primaryType = introspectedTable.getPrimaryKeyColumns().get(0) + .getFullyQualifiedJavaType(); + // 创建返回类型 + FullyQualifiedJavaType returnType = FullyQualifiedJavaType.getNewListInstance(); + returnType.addTypeArgument(primaryType); + // 创建参数类型 + FullyQualifiedJavaType exampleType = new FullyQualifiedJavaType(introspectedTable.getExampleType()); + // selectPrimaryKeyByExample(example) + Method method = new Method("selectPrimaryKeyByExample"); + method.setAbstract(true); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(returnType); + method.addParameter(new Parameter(exampleType, "example")); + interfaze.addMethod(method); + + return super.clientGenerated(interfaze, introspectedTable); + } + + + @Override + public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) { + if (introspectedTable.getTargetRuntime() != IntrospectedTable.TargetRuntime.MYBATIS3) { + return true; + } + if (introspectedTable.getPrimaryKeyColumns().size() <= 0) { + return true; + } + // 获取主键列名 + String primaryKeyColumn = introspectedTable.getPrimaryKeyColumns().get(0) + .getActualColumnName(); + // 获取主键列类型 + String primaryKeyType = introspectedTable.getPrimaryKeyColumns().get(0) + .getFullyQualifiedJavaType().getFullyQualifiedName(); + // 获取对应的 Example 类名 + String exampleType = introspectedTable.getExampleType(); + + // 创建 selectPrimaryKeyByExample 元素 + XmlElement selectPrimaryKeyByExample = new XmlElement("select"); + selectPrimaryKeyByExample.addAttribute(new Attribute("id", "selectPrimaryKeyByExample")); + selectPrimaryKeyByExample.addAttribute(new Attribute("parameterType", exampleType)); + selectPrimaryKeyByExample.addAttribute(new Attribute("resultType", primaryKeyType)); + // 添加selectPrimaryKeyByExample语句 + String selectPrimaryKeyByExampleSql = "select\n" + + " \n" + + " distinct\n" + + " \n" + + " " + primaryKeyColumn + " from " + introspectedTable.getFullyQualifiedTableNameAtRuntime() + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " order by ${orderByClause}\n" + + " "; + selectPrimaryKeyByExample.addElement(new TextElement(selectPrimaryKeyByExampleSql)); + + // with limit + generateLimitElement(selectPrimaryKeyByExample); + + // 将 select 元素添加到 mapper.xml 中 + document.getRootElement().addElement(selectPrimaryKeyByExample); + + return super.sqlMapDocumentGenerated(document, introspectedTable); + } + + +} diff --git a/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java b/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java new file mode 100644 index 0000000..8c293bc --- /dev/null +++ b/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java @@ -0,0 +1,870 @@ +package com.iqudoo.framework.mybatis; + +import org.mybatis.generator.api.*; +import org.mybatis.generator.api.dom.DefaultJavaFormatter; +import org.mybatis.generator.api.dom.java.*; +import org.mybatis.generator.config.Context; +import org.mybatis.generator.internal.util.StringUtility; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +/** + * MyBatis Generator 1.4.1 + */ +@SuppressWarnings({"DuplicatedCode", "unused"}) +public class TapeRepositoryGeneratorPlugin extends PluginAdapter { + + // 固定配置项 + private String facadeRepositoryPackage = "com.iqudoo.platform.application.facade.repository"; + private String domainRepositoryPackage = "com.iqudoo.platform.application.domain.repository"; + 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版本专用: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("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(); + } + } + + /** + * 核心方法:视图表过滤 + 生成完整Repository代码 + */ + @Override + public List contextGenerateAdditionalJavaFiles(IntrospectedTable introspectedTable) { + List generatedJavaFiles = new ArrayList<>(); + + // 视图表过滤逻辑 + String tableName = introspectedTable.getFullyQualifiedTable().getIntrospectedTableName().toUpperCase(); + if (isViewTable(tableName)) { + return generatedJavaFiles; + } + + // 非视图表,正常生成 + String domainObjectName = introspectedTable.getFullyQualifiedTable().getDomainObjectName(); + String exampleClassName = domainObjectName + "Example"; + String mapperClassName = domainObjectName + "Mapper"; + String repositoryInterfaceName = "I" + domainObjectName + "Repository"; + String repositoryImplName = domainObjectName + "RepositoryImpl"; + boolean hasBLOBColumns = hasBLOBColumns(introspectedTable); + + // 生成Repository接口(核心修改:手动添加所有方法,不再继承父接口) + Interface repositoryInterface = generateRepositoryInterface(repositoryInterfaceName, domainObjectName, exampleClassName); + GeneratedJavaFile interfaceFile = new GeneratedJavaFile( + repositoryInterface, + targetProject, + "UTF-8", + javaFormatter + ); + generatedJavaFiles.add(interfaceFile); + + // 生成Repository实现类(逻辑不变) + TopLevelClass repositoryImpl = generateRepositoryImpl( + repositoryImplName, + repositoryInterfaceName, + domainObjectName, + exampleClassName, + mapperClassName, + introspectedTable, + hasBLOBColumns + ); + GeneratedJavaFile implFile = new GeneratedJavaFile( + repositoryImpl, + targetProject, + "UTF-8", + javaFormatter + ); + generatedJavaFiles.add(implFile); + + // 手动写入磁盘 + generateJavaFileToDisk(repositoryInterface, facadeRepositoryPackage); + generateJavaFileToDisk(repositoryImpl, domainRepositoryPackage); + + return generatedJavaFiles; + } + + /** + * 判断是否为视图表(支持多关键字匹配) + */ + private boolean isViewTable(String tableName) { + if (StringUtility.stringHasValue(viewKeyWords)) { + String[] keywords = viewKeyWords.split(","); + for (String keyword : keywords) { + if (tableName.contains(keyword.trim().toUpperCase())) { + return true; + } + } + } + return false; + } + + /** + * 核心修改:生成Repository接口(手动添加所有方法,无继承,匹配指定格式) + */ + private Interface generateRepositoryInterface(String interfaceName, String modelClassName, String exampleClassName) { + Interface repositoryInterface = new Interface(facadeRepositoryPackage + "." + interfaceName); + repositoryInterface.setVisibility(JavaVisibility.PUBLIC); + + // 添加必要的导入(仅保留model和example,移除ModelDataRepository) + repositoryInterface.addImportedType(new FullyQualifiedJavaType(modelPackage + "." + modelClassName)); + repositoryInterface.addImportedType(new FullyQualifiedJavaType(modelPackage + "." + exampleClassName)); + repositoryInterface.addImportedType(new FullyQualifiedJavaType("java.util.List")); + + // 定义方法参数名(首字母小写) + String exampleParamName = lowerFirst(exampleClassName); + + // 1. trashById + Method trashByIdMethod = new Method("trashById"); + trashByIdMethod.setVisibility(JavaVisibility.PUBLIC); + trashByIdMethod.setReturnType(new FullyQualifiedJavaType("int")); + trashByIdMethod.addParameter(new Parameter(new FullyQualifiedJavaType("long"), "id")); + trashByIdMethod.addException(new FullyQualifiedJavaType("Throwable")); + trashByIdMethod.setAbstract(true); + repositoryInterface.addMethod(trashByIdMethod); + + // 2. trashAll + Method trashAllMethod = new Method("trashAll"); + trashAllMethod.setVisibility(JavaVisibility.PUBLIC); + trashAllMethod.setReturnType(new FullyQualifiedJavaType("int")); + trashAllMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + trashAllMethod.addException(new FullyQualifiedJavaType("Throwable")); + trashAllMethod.setAbstract(true); + repositoryInterface.addMethod(trashAllMethod); + + // 3. deleteById + Method deleteByIdMethod = new Method("deleteById"); + deleteByIdMethod.setVisibility(JavaVisibility.PUBLIC); + deleteByIdMethod.setReturnType(new FullyQualifiedJavaType("int")); + deleteByIdMethod.addParameter(new Parameter(new FullyQualifiedJavaType("long"), "id")); + deleteByIdMethod.addParameter(new Parameter(new FullyQualifiedJavaType("boolean"), "release")); + deleteByIdMethod.addException(new FullyQualifiedJavaType("Throwable")); + deleteByIdMethod.setAbstract(true); + repositoryInterface.addMethod(deleteByIdMethod); + + // 4. deleteAll + Method deleteAllMethod = new Method("deleteAll"); + deleteAllMethod.setVisibility(JavaVisibility.PUBLIC); + deleteAllMethod.setReturnType(new FullyQualifiedJavaType("int")); + deleteAllMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + deleteAllMethod.addParameter(new Parameter(new FullyQualifiedJavaType("boolean"), "release")); + deleteAllMethod.addException(new FullyQualifiedJavaType("Throwable")); + deleteAllMethod.setAbstract(true); + repositoryInterface.addMethod(deleteAllMethod); + + // 5. recoverById + Method recoverByIdMethod = new Method("recoverById"); + recoverByIdMethod.setVisibility(JavaVisibility.PUBLIC); + recoverByIdMethod.setReturnType(new FullyQualifiedJavaType("int")); + recoverByIdMethod.addParameter(new Parameter(new FullyQualifiedJavaType("long"), "id")); + recoverByIdMethod.addException(new FullyQualifiedJavaType("Throwable")); + recoverByIdMethod.setAbstract(true); + repositoryInterface.addMethod(recoverByIdMethod); + + // 6. recoverAll + Method recoverAllMethod = new Method("recoverAll"); + recoverAllMethod.setVisibility(JavaVisibility.PUBLIC); + recoverAllMethod.setReturnType(new FullyQualifiedJavaType("int")); + recoverAllMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + recoverAllMethod.addException(new FullyQualifiedJavaType("Throwable")); + recoverAllMethod.setAbstract(true); + repositoryInterface.addMethod(recoverAllMethod); + + // 7. findNoWhereById + Method findNoWhereByIdMethod = new Method("findNoWhereById"); + findNoWhereByIdMethod.setVisibility(JavaVisibility.PUBLIC); + findNoWhereByIdMethod.setReturnType(new FullyQualifiedJavaType(modelClassName)); + findNoWhereByIdMethod.addParameter(new Parameter(new FullyQualifiedJavaType("long"), "id")); + findNoWhereByIdMethod.addException(new FullyQualifiedJavaType("Throwable")); + findNoWhereByIdMethod.setAbstract(true); + repositoryInterface.addMethod(findNoWhereByIdMethod); + + // 8. findValidById + Method findValidByIdMethod = new Method("findValidById"); + findValidByIdMethod.setVisibility(JavaVisibility.PUBLIC); + findValidByIdMethod.setReturnType(new FullyQualifiedJavaType(modelClassName)); + findValidByIdMethod.addParameter(new Parameter(new FullyQualifiedJavaType("long"), "id")); + findValidByIdMethod.addException(new FullyQualifiedJavaType("Throwable")); + findValidByIdMethod.setAbstract(true); + repositoryInterface.addMethod(findValidByIdMethod); + + // 9. findTrashById + Method findTrashByIdMethod = new Method("findTrashById"); + findTrashByIdMethod.setVisibility(JavaVisibility.PUBLIC); + findTrashByIdMethod.setReturnType(new FullyQualifiedJavaType(modelClassName)); + findTrashByIdMethod.addParameter(new Parameter(new FullyQualifiedJavaType("long"), "id")); + findTrashByIdMethod.addException(new FullyQualifiedJavaType("Throwable")); + findTrashByIdMethod.setAbstract(true); + repositoryInterface.addMethod(findTrashByIdMethod); + + // 10. findValidOne + Method findValidOneMethod = new Method("findValidOne"); + findValidOneMethod.setVisibility(JavaVisibility.PUBLIC); + findValidOneMethod.setReturnType(new FullyQualifiedJavaType(modelClassName)); + findValidOneMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + findValidOneMethod.addException(new FullyQualifiedJavaType("Throwable")); + findValidOneMethod.setAbstract(true); + repositoryInterface.addMethod(findValidOneMethod); + + // 11. findTrashOne + Method findTrashOneMethod = new Method("findTrashOne"); + findTrashOneMethod.setVisibility(JavaVisibility.PUBLIC); + findTrashOneMethod.setReturnType(new FullyQualifiedJavaType(modelClassName)); + findTrashOneMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + findTrashOneMethod.addException(new FullyQualifiedJavaType("Throwable")); + findTrashOneMethod.setAbstract(true); + repositoryInterface.addMethod(findTrashOneMethod); + + // 12. getValidList + Method getValidListMethod = new Method("getValidList"); + getValidListMethod.setVisibility(JavaVisibility.PUBLIC); + getValidListMethod.setReturnType(new FullyQualifiedJavaType("List<" + modelClassName + ">")); + getValidListMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + getValidListMethod.addException(new FullyQualifiedJavaType("Throwable")); + getValidListMethod.setAbstract(true); + repositoryInterface.addMethod(getValidListMethod); + + // 13. getTrashList + Method getTrashListMethod = new Method("getTrashList"); + getTrashListMethod.setVisibility(JavaVisibility.PUBLIC); + getTrashListMethod.setReturnType(new FullyQualifiedJavaType("List<" + modelClassName + ">")); + getTrashListMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + getTrashListMethod.addException(new FullyQualifiedJavaType("Throwable")); + getTrashListMethod.setAbstract(true); + repositoryInterface.addMethod(getTrashListMethod); + + // 14. countByValid + Method countByValidMethod = new Method("countByValid"); + countByValidMethod.setVisibility(JavaVisibility.PUBLIC); + countByValidMethod.setReturnType(new FullyQualifiedJavaType("long")); + countByValidMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + countByValidMethod.addException(new FullyQualifiedJavaType("Throwable")); + countByValidMethod.setAbstract(true); + repositoryInterface.addMethod(countByValidMethod); + + // 15. countByTrash + Method countByTrashMethod = new Method("countByTrash"); + countByTrashMethod.setVisibility(JavaVisibility.PUBLIC); + countByTrashMethod.setReturnType(new FullyQualifiedJavaType("long")); + countByTrashMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + countByTrashMethod.addException(new FullyQualifiedJavaType("Throwable")); + countByTrashMethod.setAbstract(true); + repositoryInterface.addMethod(countByTrashMethod); + + // 16. insert + Method insertMethod = new Method("insert"); + insertMethod.setVisibility(JavaVisibility.PUBLIC); + insertMethod.setReturnType(new FullyQualifiedJavaType(modelClassName)); + insertMethod.addParameter(new Parameter(new FullyQualifiedJavaType(modelClassName), "record")); + insertMethod.addException(new FullyQualifiedJavaType("Throwable")); + insertMethod.setAbstract(true); + repositoryInterface.addMethod(insertMethod); + + // 17. update + Method updateMethod = new Method("update"); + updateMethod.setVisibility(JavaVisibility.PUBLIC); + updateMethod.setReturnType(new FullyQualifiedJavaType("int")); + updateMethod.addParameter(new Parameter(new FullyQualifiedJavaType(modelClassName), "record")); + updateMethod.addException(new FullyQualifiedJavaType("Throwable")); + updateMethod.setAbstract(true); + repositoryInterface.addMethod(updateMethod); + + return repositoryInterface; + } + + /** + * 生成Repository实现类(逻辑无修改) + */ + private TopLevelClass generateRepositoryImpl( + String implClassName, + String interfaceName, + String modelClassName, + String exampleClassName, + String mapperClassName, + IntrospectedTable introspectedTable, + boolean hasBLOBColumns) { + + TopLevelClass implClass = new TopLevelClass(domainRepositoryPackage + "." + implClassName); + implClass.setVisibility(JavaVisibility.PUBLIC); + implClass.addAnnotation("@SuppressWarnings(\"DuplicatedCode\")"); + implClass.addAnnotation("@Repository"); + + addImportPackages(implClass, modelClassName, exampleClassName, mapperClassName, interfaceName); + + FullyQualifiedJavaType superInterface = new FullyQualifiedJavaType(facadeRepositoryPackage + "." + interfaceName); + implClass.addSuperInterface(superInterface); + + // 修复Logger字段:添加static final修饰符 + Field loggerField = new Field("LOGGER", new FullyQualifiedJavaType("org.slf4j.Logger")); + loggerField.setVisibility(JavaVisibility.PRIVATE); + loggerField.setStatic(true); + loggerField.setFinal(true); + loggerField.setInitializationString("Tape.getLogger(" + implClassName + ".class)"); + implClass.addField(loggerField); + + String mapperFieldName = lowerFirst(mapperClassName); + Field mapperField = new Field(mapperFieldName, new FullyQualifiedJavaType(mapperPackage + "." + mapperClassName)); + mapperField.setVisibility(JavaVisibility.PRIVATE); + mapperField.addAnnotation("@Resource"); + implClass.addField(mapperField); + + // 原有方法生成逻辑(无修改) + generateFindNoWhereByIdMethod(implClass, modelClassName, exampleClassName); + generateFindValidByIdMethod(implClass, modelClassName, exampleClassName); + generateFindTrashByIdMethod(implClass, modelClassName, exampleClassName); + generateInsertMethod(implClass, modelClassName, mapperFieldName, introspectedTable); + generateUpdateMethod(implClass, modelClassName, exampleClassName, mapperFieldName, introspectedTable, hasBLOBColumns); + generateDeleteByIdMethod(implClass, modelClassName, mapperFieldName); + generateDeleteAllMethod(implClass, modelClassName, exampleClassName, mapperFieldName); + generateTrashByIdMethod(implClass, modelClassName, mapperFieldName); + generateTrashAllMethod(implClass, modelClassName, exampleClassName, mapperFieldName); + generateRecoverByIdMethod(implClass, modelClassName, mapperFieldName); + generateRecoverAllMethod(implClass, modelClassName, exampleClassName, mapperFieldName); + generateFindValidOneMethod(implClass, modelClassName, exampleClassName); + generateFindTrashOneMethod(implClass, modelClassName, exampleClassName); + generateGetValidListMethod(implClass, modelClassName, exampleClassName, mapperFieldName, hasBLOBColumns); + generateGetTrashListMethod(implClass, modelClassName, exampleClassName, mapperFieldName, hasBLOBColumns); + generateCountByValidMethod(implClass, exampleClassName, mapperFieldName); + generateCountByTrashMethod(implClass, exampleClassName, mapperFieldName); + + return implClass; + } + + // ------------------------ 所有原有方法(无修改) ------------------------ + private void generateDeleteAllMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { + Method method = new Method("deleteAll"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType("int")); + String exampleParamName = lowerFirst(exampleClassName); + method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + method.addParameter(new Parameter(new FullyQualifiedJavaType("boolean"), "release")); + method.addException(new FullyQualifiedJavaType("Throwable")); + + // 方法体 + method.addBodyLine("if (release) {"); + method.addBodyLine(" return " + mapperFieldName + ".deleteByExample(" + exampleParamName + ");"); + method.addBodyLine("}"); + method.addBodyLine("for (" + exampleClassName + ".Criteria criteria : " + exampleParamName + ".getOredCriteria()) {"); + method.addBodyLine(" criteria.andIsDeleteEqualTo(DatabaseCommonDataIsDeleteEnum.NONE.getValue());"); + method.addBodyLine("}"); + method.addBodyLine(modelClassName + " " + lowerFirst(modelClassName) + " = new " + modelClassName + "();"); + method.addBodyLine(lowerFirst(modelClassName) + ".setIsDelete(DatabaseCommonDataIsDeleteEnum.DELETED.getValue());"); + method.addBodyLine(lowerFirst(modelClassName) + ".setUpdateTime(new Date());"); + method.addBodyLine("return " + mapperFieldName + ".updateByExampleSelective(" + lowerFirst(modelClassName) + ", " + exampleParamName + ");"); + + implClass.addMethod(method); + } + + private void generateTrashAllMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { + Method method = new Method("trashAll"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType("int")); + String exampleParamName = lowerFirst(exampleClassName); + method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + method.addException(new FullyQualifiedJavaType("Throwable")); + + // 方法体 + method.addBodyLine("for (" + exampleClassName + ".Criteria criteria : " + exampleParamName + ".getOredCriteria()) {"); + method.addBodyLine(" criteria.andIsDeleteEqualTo(DatabaseCommonDataIsDeleteEnum.NONE.getValue());"); + method.addBodyLine(" criteria.andIsHiddenEqualTo(DatabaseCommonDataIsHiddenEnum.NONE.getValue());"); + method.addBodyLine("}"); + method.addBodyLine(modelClassName + " " + lowerFirst(modelClassName) + " = new " + modelClassName + "();"); + method.addBodyLine(lowerFirst(modelClassName) + ".setIsHidden(DatabaseCommonDataIsHiddenEnum.HIDDEN.getValue());"); + method.addBodyLine(lowerFirst(modelClassName) + ".setDeleteToken(" + lowerFirst(modelClassName) + ".getGuid() + \"\");"); + method.addBodyLine(lowerFirst(modelClassName) + ".setUpdateTime(new Date());"); + method.addBodyLine("return " + mapperFieldName + ".updateByExampleSelective(" + lowerFirst(modelClassName) + ", " + exampleParamName + ");"); + + implClass.addMethod(method); + } + + private void generateRecoverAllMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { + Method method = new Method("recoverAll"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType("int")); + String exampleParamName = lowerFirst(exampleClassName); + method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + method.addException(new FullyQualifiedJavaType("Throwable")); + + // 方法体 + method.addBodyLine("for (" + exampleClassName + ".Criteria criteria : " + exampleParamName + ".getOredCriteria()) {"); + method.addBodyLine(" criteria.andIsDeleteEqualTo(DatabaseCommonDataIsDeleteEnum.NONE.getValue());"); + method.addBodyLine(" criteria.andIsHiddenEqualTo(DatabaseCommonDataIsHiddenEnum.HIDDEN.getValue());"); + method.addBodyLine("}"); + method.addBodyLine(modelClassName + " " + lowerFirst(modelClassName) + " = new " + modelClassName + "();"); + method.addBodyLine(lowerFirst(modelClassName) + ".setIsHidden(DatabaseCommonDataIsHiddenEnum.NONE.getValue());"); + method.addBodyLine(lowerFirst(modelClassName) + ".setDeleteToken(\"VALID\");"); + method.addBodyLine(lowerFirst(modelClassName) + ".setUpdateTime(new Date());"); + method.addBodyLine("return " + mapperFieldName + ".updateByExampleSelective(" + lowerFirst(modelClassName) + ", " + exampleParamName + ");"); + + implClass.addMethod(method); + } + + private void generateJavaFileToDisk(Interface intf, String packageName) { + try { + String packagePath = packageName.replace('.', File.separatorChar); + File targetDir = new File(targetProject, packagePath); + if (!targetDir.exists()) { + boolean mkdirs = targetDir.mkdirs(); + if (!mkdirs) { + throw new RuntimeException("创建目录失败:" + targetDir.getAbsolutePath()); + } + } + String className = intf.getType().getShortName(); + File javaFile = new File(targetDir, className + ".java"); + String content = javaFormatter.getFormattedContent(intf); + java.nio.file.Files.write(javaFile.toPath(), content.getBytes(StandardCharsets.UTF_8)); + System.out.println("成功生成接口文件:" + javaFile.getAbsolutePath()); + } catch (Exception e) { + throw new RuntimeException("生成Repository接口失败:" + intf.getType().getShortName(), e); + } + } + + private void generateJavaFileToDisk(TopLevelClass clazz, String packageName) { + try { + String packagePath = packageName.replace('.', File.separatorChar); + File targetDir = new File(targetProject, packagePath); + if (!targetDir.exists()) { + boolean mkdirs = targetDir.mkdirs(); + if (!mkdirs) { + throw new RuntimeException("创建目录失败:" + targetDir.getAbsolutePath()); + } + } + + String className = clazz.getType().getShortName(); + File javaFile = new File(targetDir, className + ".java"); + String content = javaFormatter.getFormattedContent(clazz); + java.nio.file.Files.write(javaFile.toPath(), content.getBytes(StandardCharsets.UTF_8)); + System.out.println("成功生成实现类文件:" + javaFile.getAbsolutePath()); + } catch (Exception e) { + throw new RuntimeException("生成Repository实现类失败:" + clazz.getType().getShortName(), e); + } + } + + private boolean hasBLOBColumns(IntrospectedTable introspectedTable) { + for (IntrospectedColumn column : introspectedTable.getAllColumns()) { + if (column.isBLOBColumn()) { + return true; + } + } + return false; + } + + private void addImportPackages(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperClassName, String interfaceName) { + implClass.addImportedType(new FullyQualifiedJavaType("com.iqudoo.framework.tape.Tape")); + implClass.addImportedType(new FullyQualifiedJavaType("com.iqudoo.framework.tape.modules.utils.SnowflakeUtil")); + implClass.addImportedType(new FullyQualifiedJavaType("com.iqudoo.framework.tape.modules.crud.DatabaseCommonDataIsDeleteEnum")); + implClass.addImportedType(new FullyQualifiedJavaType("com.iqudoo.framework.tape.modules.crud.DatabaseCommonDataIsHiddenEnum")); + implClass.addImportedType(new FullyQualifiedJavaType("com.iqudoo.framework.tape.modules.crud.DatabaseErrorConstants")); + implClass.addImportedType(new FullyQualifiedJavaType(mapperPackage + "." + mapperClassName)); + implClass.addImportedType(new FullyQualifiedJavaType(modelPackage + "." + modelClassName)); + implClass.addImportedType(new FullyQualifiedJavaType(modelPackage + "." + exampleClassName)); + implClass.addImportedType(new FullyQualifiedJavaType(facadeRepositoryPackage + "." + interfaceName)); + implClass.addImportedType(new FullyQualifiedJavaType("org.slf4j.Logger")); + implClass.addImportedType(new FullyQualifiedJavaType("org.springframework.stereotype.Repository")); + implClass.addImportedType(new FullyQualifiedJavaType("javax.annotation.Resource")); + implClass.addImportedType(new FullyQualifiedJavaType("java.util.ArrayList")); + implClass.addImportedType(new FullyQualifiedJavaType("java.util.Date")); + implClass.addImportedType(new FullyQualifiedJavaType("java.util.List")); + } + + private void generateFindNoWhereByIdMethod(TopLevelClass implClass, String modelClassName, String exampleClassName) { + Method method = new Method("findNoWhereById"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType(modelClassName)); + method.addParameter(new Parameter(new FullyQualifiedJavaType("long"), "id")); + method.addException(new FullyQualifiedJavaType("Throwable")); + + method.addBodyLine(modelClassName + " aDo = findValidById(id);"); + method.addBodyLine("if (aDo == null) {"); + method.addBodyLine(" aDo = findTrashById(id);"); + method.addBodyLine("}"); + method.addBodyLine("return aDo;"); + + implClass.addMethod(method); + } + + private void generateFindValidByIdMethod(TopLevelClass implClass, String modelClassName, String exampleClassName) { + Method method = new Method("findValidById"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType(modelClassName)); + method.addParameter(new Parameter(new FullyQualifiedJavaType("long"), "id")); + method.addException(new FullyQualifiedJavaType("Throwable")); + + method.addBodyLine(exampleClassName + " doExample = new " + exampleClassName + "();"); + method.addBodyLine("doExample.createCriteria().andGuidEqualTo(id);"); + method.addBodyLine("return findValidOne(doExample);"); + + implClass.addMethod(method); + } + + private void generateFindTrashByIdMethod(TopLevelClass implClass, String modelClassName, String exampleClassName) { + Method method = new Method("findTrashById"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType(modelClassName)); + method.addParameter(new Parameter(new FullyQualifiedJavaType("long"), "id")); + method.addException(new FullyQualifiedJavaType("Throwable")); + + method.addBodyLine(exampleClassName + " doExample = new " + exampleClassName + "();"); + method.addBodyLine("doExample.createCriteria().andGuidEqualTo(id);"); + method.addBodyLine("return findTrashOne(doExample);"); + + implClass.addMethod(method); + } + + private void generateInsertMethod(TopLevelClass implClass, String modelClassName, String mapperFieldName, IntrospectedTable introspectedTable) { + Method method = new Method("insert"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType(modelClassName)); + method.addParameter(new Parameter(new FullyQualifiedJavaType(modelClassName), "record")); + method.addException(new FullyQualifiedJavaType("Throwable")); + + method.addBodyLine(modelClassName + " aDo = new " + modelClassName + "();"); + method.addBodyLine("if (record.getGuid() != null) {"); + method.addBodyLine(" aDo.setGuid(record.getGuid());"); + method.addBodyLine("} else {"); + method.addBodyLine(" Long guid = SnowflakeUtil.nextId();"); + method.addBodyLine(" aDo.setGuid(guid);"); + method.addBodyLine("}"); + + for (IntrospectedColumn column : introspectedTable.getAllColumns()) { + String fieldName = column.getJavaProperty(); + String setterMethod = "set" + upperFirst(fieldName); + String getterMethod = "get" + upperFirst(fieldName); + + if ("guid".equals(fieldName) || "isDelete".equals(fieldName) || "isHidden".equals(fieldName) + || "deleteToken".equals(fieldName) || "dataVersion".equals(fieldName) + || "createTime".equals(fieldName) || "updateTime".equals(fieldName)) { + continue; + } + method.addBodyLine("aDo." + setterMethod + "(record." + getterMethod + "());"); + } + + method.addBodyLine("aDo.setIsDelete(DatabaseCommonDataIsDeleteEnum.NONE.getValue());"); + method.addBodyLine("aDo.setIsHidden(DatabaseCommonDataIsHiddenEnum.NONE.getValue());"); + method.addBodyLine("aDo.setDeleteToken(\"VALID\");"); + method.addBodyLine("aDo.setDataVersion(1);"); + method.addBodyLine("aDo.setCreateTime(new Date());"); + method.addBodyLine("aDo.setUpdateTime(new Date());"); + + method.addBodyLine("int count = " + mapperFieldName + ".insert(aDo);"); + method.addBodyLine("if (count > 0) {"); + method.addBodyLine(" return aDo;"); + method.addBodyLine("}"); + + method.addBodyLine("// 更新当前数据版本号和GUID"); + method.addBodyLine("record.setGuid(aDo.getGuid());"); + method.addBodyLine("record.setDataVersion(aDo.getDataVersion());"); + method.addBodyLine("record.setCreateTime(aDo.getCreateTime());"); + method.addBodyLine("record.setUpdateTime(aDo.getUpdateTime());"); + method.addBodyLine("LOGGER.error(\"Database write failed, " + modelClassName + ": {}\", aDo);"); + method.addBodyLine("throw DatabaseErrorConstants.DATABASE_WRITE_ERROR;"); + + implClass.addMethod(method); + } + + private void generateUpdateMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, + String mapperFieldName, IntrospectedTable introspectedTable, boolean hasBLOBColumns) { + Method method = new Method("update"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType("int")); + method.addParameter(new Parameter(new FullyQualifiedJavaType(modelClassName), "record")); + method.addException(new FullyQualifiedJavaType("Throwable")); + + method.addBodyLine(modelClassName + " aDo = findValidById(record.getGuid());"); + method.addBodyLine("if (aDo == null) {"); + method.addBodyLine(" throw DatabaseErrorConstants.DATABASE_RECORD_NOT_FOUND;"); + method.addBodyLine("}"); + + for (IntrospectedColumn column : introspectedTable.getAllColumns()) { + String fieldName = column.getJavaProperty(); + String setterMethod = "set" + upperFirst(fieldName); + String getterMethod = "get" + upperFirst(fieldName); + + if ("guid".equals(fieldName) || "isDelete".equals(fieldName) || "isHidden".equals(fieldName) + || "deleteToken".equals(fieldName) || "dataVersion".equals(fieldName) + || "createTime".equals(fieldName) || "updateTime".equals(fieldName)) { + continue; + } + method.addBodyLine("if (record." + getterMethod + "() != null) {"); + method.addBodyLine(" aDo." + setterMethod + "(record." + getterMethod + "());"); + method.addBodyLine("}"); + } + + method.addBodyLine(exampleClassName + " updateWhere = new " + exampleClassName + "();"); + method.addBodyLine("Integer lockDataVersion = record.getDataVersion();"); + method.addBodyLine("if (lockDataVersion == null) {"); + method.addBodyLine(" lockDataVersion = aDo.getDataVersion();"); + method.addBodyLine("}"); + method.addBodyLine("updateWhere.createCriteria()"); + method.addBodyLine(" .andGuidEqualTo(aDo.getGuid())"); + method.addBodyLine(" .andDataVersionEqualTo(lockDataVersion);"); + method.addBodyLine("aDo.setDataVersion(aDo.getDataVersion() + 1);"); + method.addBodyLine("aDo.setUpdateTime(new Date());"); + method.addBodyLine("// 更新当前数据版本号"); + method.addBodyLine("record.setDataVersion(aDo.getDataVersion());"); + method.addBodyLine("record.setUpdateTime(aDo.getUpdateTime());"); + + String updateMethod = hasBLOBColumns ? "updateByExampleWithBLOBs" : "updateByExample"; + method.addBodyLine("return " + mapperFieldName + "." + updateMethod + "(aDo, updateWhere);"); + + implClass.addMethod(method); + } + + private void generateDeleteByIdMethod(TopLevelClass implClass, String modelClassName, String mapperFieldName) { + Method method = new Method("deleteById"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType("int")); + method.addParameter(new Parameter(new FullyQualifiedJavaType("long"), "id")); + method.addParameter(new Parameter(new FullyQualifiedJavaType("boolean"), "release")); + method.addException(new FullyQualifiedJavaType("Throwable")); + + method.addBodyLine(modelClassName + " aDo = findValidById(id);"); + method.addBodyLine("if (aDo == null) {"); + method.addBodyLine(" return 0;"); + method.addBodyLine("}"); + method.addBodyLine("if (release) {"); + method.addBodyLine(" return " + mapperFieldName + ".deleteByPrimaryKey(aDo.getGuid());"); + method.addBodyLine("}"); + method.addBodyLine("aDo.setIsDelete(DatabaseCommonDataIsDeleteEnum.DELETED.getValue());"); + method.addBodyLine("aDo.setUpdateTime(new Date());"); + method.addBodyLine("return " + mapperFieldName + ".updateByPrimaryKey(aDo);"); + + implClass.addMethod(method); + } + + private void generateTrashByIdMethod(TopLevelClass implClass, String modelClassName, String mapperFieldName) { + Method method = new Method("trashById"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType("int")); + method.addParameter(new Parameter(new FullyQualifiedJavaType("long"), "id")); + method.addException(new FullyQualifiedJavaType("Throwable")); + + method.addBodyLine(modelClassName + " aDo = findValidById(id);"); + method.addBodyLine("if (aDo == null) {"); + method.addBodyLine(" return 0;"); + method.addBodyLine("}"); + method.addBodyLine("aDo.setIsHidden(DatabaseCommonDataIsHiddenEnum.HIDDEN.getValue());"); + method.addBodyLine("aDo.setDeleteToken(aDo.getGuid() + \"\");"); + method.addBodyLine("aDo.setUpdateTime(new Date());"); + method.addBodyLine("return " + mapperFieldName + ".updateByPrimaryKey(aDo);"); + + implClass.addMethod(method); + } + + private void generateRecoverByIdMethod(TopLevelClass implClass, String modelClassName, String mapperFieldName) { + Method method = new Method("recoverById"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType("int")); + method.addParameter(new Parameter(new FullyQualifiedJavaType("long"), "id")); + method.addException(new FullyQualifiedJavaType("Throwable")); + + method.addBodyLine(modelClassName + " aDo = findTrashById(id);"); + method.addBodyLine("if (aDo == null) {"); + method.addBodyLine(" return 0;"); + method.addBodyLine("}"); + method.addBodyLine("if (aDo.getIsDelete() == DatabaseCommonDataIsDeleteEnum.DELETED.getValue()) {"); + method.addBodyLine(" return 0;"); + method.addBodyLine("}"); + method.addBodyLine("aDo.setIsHidden(DatabaseCommonDataIsHiddenEnum.NONE.getValue());"); + method.addBodyLine("aDo.setDeleteToken(\"VALID\");"); + method.addBodyLine("aDo.setUpdateTime(new Date());"); + method.addBodyLine("return " + mapperFieldName + ".updateByPrimaryKey(aDo);"); + + implClass.addMethod(method); + } + + private void generateFindValidOneMethod(TopLevelClass implClass, String modelClassName, String exampleClassName) { + Method method = new Method("findValidOne"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType(modelClassName)); + String exampleParamName = exampleClassName.substring(0, 1).toLowerCase() + exampleClassName.substring(1); + method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + method.addException(new FullyQualifiedJavaType("Throwable")); + + method.addBodyLine(exampleParamName + ".usePage(1, 1);"); + method.addBodyLine("List<" + modelClassName + "> dataList = getValidList(" + exampleParamName + ");"); + method.addBodyLine("if (dataList != null && dataList.size() > 0) {"); + method.addBodyLine(" return dataList.get(0);"); + method.addBodyLine("}"); + method.addBodyLine("return null;"); + + implClass.addMethod(method); + } + + private void generateFindTrashOneMethod(TopLevelClass implClass, String modelClassName, String exampleClassName) { + Method method = new Method("findTrashOne"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType(modelClassName)); + String exampleParamName = exampleClassName.substring(0, 1).toLowerCase() + exampleClassName.substring(1); + method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + method.addException(new FullyQualifiedJavaType("Throwable")); + + method.addBodyLine(exampleParamName + ".usePage(1, 1);"); + method.addBodyLine("List<" + modelClassName + "> dataList = getTrashList(" + exampleParamName + ");"); + method.addBodyLine("if (dataList != null && dataList.size() > 0) {"); + method.addBodyLine(" return dataList.get(0);"); + method.addBodyLine("}"); + method.addBodyLine("return null;"); + + implClass.addMethod(method); + } + + private void generateGetValidListMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, + String mapperFieldName, boolean hasBLOBColumns) { + Method method = new Method("getValidList"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType("List<" + modelClassName + ">")); + method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), "example")); + method.addException(new FullyQualifiedJavaType("Throwable")); + + method.addBodyLine("for (" + exampleClassName + ".Criteria criteria : example.getOredCriteria()) {"); + method.addBodyLine(" criteria.andIsDeleteEqualTo(DatabaseCommonDataIsDeleteEnum.NONE.getValue())"); + method.addBodyLine(" .andIsHiddenEqualTo(DatabaseCommonDataIsHiddenEnum.NONE.getValue());"); + method.addBodyLine("}"); + method.addBodyLine("if (example.getRows() != null && example.getOffset() != null) {"); + method.addBodyLine(" List primaryKeyList = " + mapperFieldName + ".selectPrimaryKeyByExample(example);"); + method.addBodyLine(" if (primaryKeyList == null || primaryKeyList.size() == 0) {"); + method.addBodyLine(" return new ArrayList<>();"); + method.addBodyLine(" }"); + method.addBodyLine(" String oldOrderByClause = example.getOrderByClause();"); + method.addBodyLine(" example = new " + exampleClassName + "();"); + method.addBodyLine(" example.createCriteria().andGuidIn(primaryKeyList);"); + method.addBodyLine(" example.setOrderByClause(oldOrderByClause);"); + method.addBodyLine("}"); + + String selectMethod = hasBLOBColumns ? "selectByExampleWithBLOBs" : "selectByExample"; + method.addBodyLine("return " + mapperFieldName + "." + selectMethod + "(example);"); + + implClass.addMethod(method); + } + + private void generateGetTrashListMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, + String mapperFieldName, boolean hasBLOBColumns) { + Method method = new Method("getTrashList"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType("List<" + modelClassName + ">")); + method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), "example")); + method.addException(new FullyQualifiedJavaType("Throwable")); + + method.addBodyLine("for (" + exampleClassName + ".Criteria criteria : example.getOredCriteria()) {"); + method.addBodyLine(" criteria.andIsDeleteEqualTo(DatabaseCommonDataIsDeleteEnum.NONE.getValue())"); + method.addBodyLine(" .andIsHiddenEqualTo(DatabaseCommonDataIsHiddenEnum.HIDDEN.getValue());"); + method.addBodyLine("}"); + method.addBodyLine("if (example.getRows() != null && example.getOffset() != null) {"); + method.addBodyLine(" List primaryKeyList = " + mapperFieldName + ".selectPrimaryKeyByExample(example);"); + method.addBodyLine(" if (primaryKeyList == null || primaryKeyList.size() == 0) {"); + method.addBodyLine(" return new ArrayList<>();"); + method.addBodyLine(" }"); + method.addBodyLine(" String oldOrderByClause = example.getOrderByClause();"); + method.addBodyLine(" example = new " + exampleClassName + "();"); + method.addBodyLine(" example.createCriteria().andGuidIn(primaryKeyList);"); + method.addBodyLine(" example.setOrderByClause(oldOrderByClause);"); + method.addBodyLine("}"); + + String selectMethod = hasBLOBColumns ? "selectByExampleWithBLOBs" : "selectByExample"; + method.addBodyLine("return " + mapperFieldName + "." + selectMethod + "(example);"); + + implClass.addMethod(method); + } + + private void generateCountByValidMethod(TopLevelClass implClass, String exampleClassName, String mapperFieldName) { + Method method = new Method("countByValid"); + 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("for (" + exampleClassName + ".Criteria criteria : example.getOredCriteria()) {"); + method.addBodyLine(" criteria.andIsDeleteEqualTo(DatabaseCommonDataIsDeleteEnum.NONE.getValue())"); + method.addBodyLine(" .andIsHiddenEqualTo(DatabaseCommonDataIsHiddenEnum.NONE.getValue());"); + method.addBodyLine("}"); + method.addBodyLine("return " + mapperFieldName + ".countByExample(example);"); + + implClass.addMethod(method); + } + + private void generateCountByTrashMethod(TopLevelClass implClass, String exampleClassName, String mapperFieldName) { + Method method = new Method("countByTrash"); + 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("for (" + exampleClassName + ".Criteria criteria : example.getOredCriteria()) {"); + method.addBodyLine(" criteria.andIsDeleteEqualTo(DatabaseCommonDataIsDeleteEnum.NONE.getValue())"); + method.addBodyLine(" .andIsHiddenEqualTo(DatabaseCommonDataIsHiddenEnum.HIDDEN.getValue());"); + method.addBodyLine("}"); + method.addBodyLine("return " + mapperFieldName + ".countByExample(example);"); + + implClass.addMethod(method); + } + + private String upperFirst(String str) { + if (str == null || str.isEmpty()) { + return str; + } + return str.substring(0, 1).toUpperCase() + str.substring(1); + } + + private String lowerFirst(String str) { + if (str == null || str.isEmpty()) { + return str; + } + return str.substring(0, 1).toLowerCase() + str.substring(1); + } + +} \ No newline at end of file diff --git a/src/main/java/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.java b/src/main/java/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.java new file mode 100644 index 0000000..3274b48 --- /dev/null +++ b/src/main/java/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.java @@ -0,0 +1,368 @@ +package com.iqudoo.framework.mybatis; + +import org.mybatis.generator.api.GeneratedJavaFile; +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.JavaFormatter; +import org.mybatis.generator.api.PluginAdapter; +import org.mybatis.generator.api.dom.DefaultJavaFormatter; +import org.mybatis.generator.api.dom.java.*; +import org.mybatis.generator.config.Context; +import org.mybatis.generator.internal.util.StringUtility; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +/** + * MyBatis Generator 1.4.1 适配版:视图表专用 RepoView 生成插件 + */ +@SuppressWarnings("DuplicatedCode") +public class TapeRepoviewGeneratorPlugin extends PluginAdapter { + + // 视图Repo包配置(可通过配置文件自定义) + 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("facadeRepoviewPackage"))) { + facadeRepoviewPackage = properties.getProperty("facadeRepoviewPackage"); + } + if (StringUtility.stringHasValue(properties.getProperty("domainRepoviewPackage"))) { + domainRepoviewPackage = properties.getProperty("domainRepoviewPackage"); + } + 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(); + } + } + + /** + * 核心方法:仅为视图表生成 RepoView 代码 + */ + @Override + public List contextGenerateAdditionalJavaFiles(IntrospectedTable introspectedTable) { + List generatedJavaFiles = new ArrayList<>(); + + // 仅处理视图表,非视图表直接返回 + String tableName = introspectedTable.getFullyQualifiedTable().getIntrospectedTableName().toUpperCase(); + if (!isViewTable(tableName)) { + return generatedJavaFiles; + } + + // 1. 获取视图表元数据 + String domainObjectName = introspectedTable.getFullyQualifiedTable().getDomainObjectName(); + String exampleClassName = domainObjectName + "Example"; + String mapperClassName = domainObjectName + "Mapper"; + String repoInterfaceName = "I" + domainObjectName + "Repo"; + String repoImplName = domainObjectName + "RepoImpl"; + + // 2. 生成视图Repo接口(核心修改:移除继承,手动添加方法) + Interface repoInterface = generateRepoViewInterface(repoInterfaceName, domainObjectName, exampleClassName); + GeneratedJavaFile interfaceFile = new GeneratedJavaFile( + repoInterface, + targetProject, + "UTF-8", + javaFormatter + ); + generatedJavaFiles.add(interfaceFile); + + // 3. 生成视图Repo实现类 + TopLevelClass repoImpl = generateRepoViewImpl( + repoImplName, + repoInterfaceName, + domainObjectName, + exampleClassName, + mapperClassName + ); + GeneratedJavaFile implFile = new GeneratedJavaFile( + repoImpl, + targetProject, + "UTF-8", + javaFormatter + ); + generatedJavaFiles.add(implFile); + + // 4. 手动写入磁盘(兼容1.4.1) + generateJavaFileToDisk(repoInterface, facadeRepoviewPackage); + generateJavaFileToDisk(repoImpl, domainRepoviewPackage); + + return generatedJavaFiles; + } + + /** + * 判断是否为视图表(关键字匹配 + MBG原生视图配置) + */ + private boolean isViewTable(String tableName) { + // 关键字匹配 + if (StringUtility.stringHasValue(viewKeyWords)) { + String[] keywords = viewKeyWords.split(","); + for (String keyword : keywords) { + if (tableName.contains(keyword.trim().toUpperCase())) { + return true; + } + } + } + return false; + } + + /** + * 核心修改:生成视图Repo接口(移除继承,手动添加指定方法) + */ + private Interface generateRepoViewInterface(String interfaceName, String modelClassName, String exampleClassName) { + Interface repoInterface = new Interface(facadeRepoviewPackage + "." + interfaceName); + repoInterface.setVisibility(JavaVisibility.PUBLIC); + + // 添加必要的导入包(仅保留model、example、List) + repoInterface.addImportedType(new FullyQualifiedJavaType(modelPackage + "." + modelClassName)); + repoInterface.addImportedType(new FullyQualifiedJavaType(modelPackage + "." + exampleClassName)); + repoInterface.addImportedType(new FullyQualifiedJavaType("java.util.List")); + + // 定义方法参数名(首字母小写) + String exampleParamName = lowerFirst(exampleClassName); + + // 1. 添加findOne方法 + Method findOneMethod = new Method("findOne"); + findOneMethod.setVisibility(JavaVisibility.PUBLIC); + findOneMethod.setReturnType(new FullyQualifiedJavaType(modelClassName)); + findOneMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + findOneMethod.addException(new FullyQualifiedJavaType("Throwable")); + findOneMethod.setAbstract(true); + repoInterface.addMethod(findOneMethod); + + // 2. 添加getList方法 + Method getListMethod = new Method("getList"); + getListMethod.setVisibility(JavaVisibility.PUBLIC); + getListMethod.setReturnType(new FullyQualifiedJavaType("List<" + modelClassName + ">")); + getListMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + getListMethod.addException(new FullyQualifiedJavaType("Throwable")); + getListMethod.setAbstract(true); + repoInterface.addMethod(getListMethod); + + // 3. 添加count方法 + Method countMethod = new Method("count"); + countMethod.setVisibility(JavaVisibility.PUBLIC); + countMethod.setReturnType(new FullyQualifiedJavaType("long")); + countMethod.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + countMethod.addException(new FullyQualifiedJavaType("Throwable")); + countMethod.setAbstract(true); + repoInterface.addMethod(countMethod); + + return repoInterface; + } + + /** + * 生成视图Repo实现类(逻辑不变,仅适配新接口) + */ + private TopLevelClass generateRepoViewImpl( + String implClassName, + String interfaceName, + String modelClassName, + String exampleClassName, + String mapperClassName) { + + TopLevelClass implClass = new TopLevelClass(domainRepoviewPackage + "." + implClassName); + implClass.setVisibility(JavaVisibility.PUBLIC); + implClass.addAnnotation("@SuppressWarnings(\"DuplicatedCode\")"); + implClass.addAnnotation("@Repository"); + + // 添加导入包(移除ModelViewRepository相关导入) + addImportPackages(implClass, modelClassName, exampleClassName, mapperClassName, interfaceName); + + // 实现Repo接口 + FullyQualifiedJavaType superInterface = new FullyQualifiedJavaType(facadeRepoviewPackage + "." + interfaceName); + implClass.addSuperInterface(superInterface); + + // 添加Mapper字段 + String mapperFieldName = lowerFirst(mapperClassName); + Field mapperField = new Field(mapperFieldName, new FullyQualifiedJavaType(mapperPackage + "." + mapperClassName)); + mapperField.setVisibility(JavaVisibility.PRIVATE); + mapperField.addAnnotation("@Resource"); + implClass.addField(mapperField); + + // 生成findOne方法 + generateFindOneMethod(implClass, modelClassName, exampleClassName, mapperFieldName); + // 生成getList方法 + generateGetListMethod(implClass, modelClassName, exampleClassName, mapperFieldName); + // 生成count方法 + generateCountMethod(implClass, exampleClassName, mapperFieldName); + + return implClass; + } + + /** + * 添加实现类所需的导入包(移除ModelViewRepository相关) + */ + private void addImportPackages(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperClassName, String interfaceName) { + // Mapper + implClass.addImportedType(new FullyQualifiedJavaType(mapperPackage + "." + mapperClassName)); + // Model & Example + implClass.addImportedType(new FullyQualifiedJavaType(modelPackage + "." + modelClassName)); + implClass.addImportedType(new FullyQualifiedJavaType(modelPackage + "." + exampleClassName)); + // Repo接口 + implClass.addImportedType(new FullyQualifiedJavaType(facadeRepoviewPackage + "." + interfaceName)); + // 注解&工具类 + implClass.addImportedType(new FullyQualifiedJavaType("org.springframework.stereotype.Repository")); + implClass.addImportedType(new FullyQualifiedJavaType("javax.annotation.Resource")); + implClass.addImportedType(new FullyQualifiedJavaType("java.util.List")); + } + + /** + * 生成findOne方法 + */ + private void generateFindOneMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { + Method method = new Method("findOne"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType(modelClassName)); + // 参数名匹配示例(首字母小写) + String exampleParamName = lowerFirst(exampleClassName); + method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + method.addException(new FullyQualifiedJavaType("Throwable")); + + // 方法体 + method.addBodyLine(exampleParamName + ".usePage(1, 1);"); + method.addBodyLine("List<" + modelClassName + "> dataList = getList(" + exampleParamName + ");"); + method.addBodyLine("if (dataList != null && dataList.size() > 0) {"); + method.addBodyLine(" return dataList.get(0);"); + method.addBodyLine("}"); + method.addBodyLine("return null;"); + + implClass.addMethod(method); + } + + /** + * 生成getList方法 + */ + private void generateGetListMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { + Method method = new Method("getList"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType("List<" + modelClassName + ">")); + // 参数名匹配示例(首字母小写) + String exampleParamName = lowerFirst(exampleClassName); + method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + method.addException(new FullyQualifiedJavaType("Throwable")); + + // 方法体 + method.addBodyLine("return " + mapperFieldName + ".selectByExample(" + exampleParamName + ");"); + + implClass.addMethod(method); + } + + /** + * 生成count方法 + */ + private void generateCountMethod(TopLevelClass implClass, String exampleClassName, String mapperFieldName) { + Method method = new Method("count"); + method.addAnnotation("@Override"); + method.setVisibility(JavaVisibility.PUBLIC); + method.setReturnType(new FullyQualifiedJavaType("long")); + // 参数名匹配示例(首字母小写) + String exampleParamName = lowerFirst(exampleClassName); + method.addParameter(new Parameter(new FullyQualifiedJavaType(exampleClassName), exampleParamName)); + method.addException(new FullyQualifiedJavaType("Throwable")); + + // 方法体 + method.addBodyLine("return " + mapperFieldName + ".countByExample(" + exampleParamName + ");"); + + implClass.addMethod(method); + } + + /** + * 手动将Java文件写入磁盘 + */ + private void generateJavaFileToDisk(Interface intf, String packageName) { + try { + String packagePath = packageName.replace('.', File.separatorChar); + File targetDir = new File(targetProject, packagePath); + if (!targetDir.exists()) { + boolean mkdirs = targetDir.mkdirs(); + if (!mkdirs) { + throw new RuntimeException("创建目录失败:" + targetDir.getAbsolutePath()); + } + } + String className = intf.getType().getShortName(); + File javaFile = new File(targetDir, className + ".java"); + String content = javaFormatter.getFormattedContent(intf); + java.nio.file.Files.write(javaFile.toPath(), content.getBytes(StandardCharsets.UTF_8)); + System.out.println("成功生成视图Repo接口:" + javaFile.getAbsolutePath()); + } catch (Exception e) { + throw new RuntimeException("生成视图Repo接口失败:" + intf.getType().getShortName(), e); + } + } + + private void generateJavaFileToDisk(TopLevelClass clazz, String packageName) { + try { + String packagePath = packageName.replace('.', File.separatorChar); + File targetDir = new File(targetProject, packagePath); + if (!targetDir.exists()) { + boolean mkdirs = targetDir.mkdirs(); + if (!mkdirs) { + throw new RuntimeException("创建目录失败:" + targetDir.getAbsolutePath()); + } + } + String className = clazz.getType().getShortName(); + File javaFile = new File(targetDir, className + ".java"); + String content = javaFormatter.getFormattedContent(clazz); + java.nio.file.Files.write(javaFile.toPath(), content.getBytes(StandardCharsets.UTF_8)); + System.out.println("成功生成视图Repo实现类:" + javaFile.getAbsolutePath()); + } catch (Exception e) { + throw new RuntimeException("生成视图Repo实现类失败:" + clazz.getType().getShortName(), e); + } + } + + /** + * 字符串首字母小写 + */ + private String lowerFirst(String str) { + if (str == null || str.isEmpty()) { + return str; + } + return str.substring(0, 1).toLowerCase() + str.substring(1); + } + + /** + * 字符串首字母大写(备用) + */ + private String upperFirst(String str) { + if (str == null || str.isEmpty()) { + return str; + } + return str.substring(0, 1).toUpperCase() + str.substring(1); + } + +} \ No newline at end of file diff --git a/src/main/java/com/iqudoo/framework/mybatis/abstracts/AbstractWithLimitPlugin.java b/src/main/java/com/iqudoo/framework/mybatis/abstracts/AbstractWithLimitPlugin.java new file mode 100644 index 0000000..16196de --- /dev/null +++ b/src/main/java/com/iqudoo/framework/mybatis/abstracts/AbstractWithLimitPlugin.java @@ -0,0 +1,229 @@ +package com.iqudoo.framework.mybatis.abstracts; + +import com.iqudoo.framework.mybatis.hook.ISelectSelectivePluginHook; +import com.iqudoo.framework.mybatis.utils.FormatTools; +import com.iqudoo.framework.mybatis.utils.ElementTools; +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.PluginAdapter; +import org.mybatis.generator.api.dom.java.*; +import org.mybatis.generator.api.dom.xml.Attribute; +import org.mybatis.generator.api.dom.xml.TextElement; +import org.mybatis.generator.api.dom.xml.XmlElement; + +import java.util.List; + +public abstract class AbstractWithLimitPlugin extends PluginAdapter implements ISelectSelectivePluginHook { + + private final static int DEFAULT_START_PAGE = 1; + private int startPage = 1; + + @Override + public boolean validate(List list) { + return true; + } + + @Override + public void initialized(IntrospectedTable introspectedTable) { + super.initialized(introspectedTable); + this.startPage = DEFAULT_START_PAGE; + } + + @Override + public boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { + PrimitiveTypeWrapper integerWrapper = FullyQualifiedJavaType.getIntInstance().getPrimitiveTypeWrapper(); + // 添加minPageNum、defaultPageSize和maxPageSize字段 + Field maxPageSizeField = ElementTools.generateField( + "maxPageSize", + JavaVisibility.PROTECTED, + integerWrapper, + "100" + ); + topLevelClass.addField(maxPageSizeField); + + Field defaultPageSizeField = ElementTools.generateField( + "defaultPageSize", + JavaVisibility.PROTECTED, + integerWrapper, + "20" + ); + topLevelClass.addField(defaultPageSizeField); + + Field minPageNumField = ElementTools.generateField( + "minPageNum", + JavaVisibility.PROTECTED, + integerWrapper, + startPage + "" + ); + topLevelClass.addField(minPageNumField); + + // 添加offset和rows字段 + Field offsetField = ElementTools.generateField( + "offset", + JavaVisibility.PROTECTED, + integerWrapper, + null + ); + topLevelClass.addField(offsetField); + + Field rowsField = ElementTools.generateField( + "rows", + JavaVisibility.PROTECTED, + integerWrapper, + null + ); + topLevelClass.addField(rowsField); + + // 增加getter && setter 方法 + Method mSetMaxPageSize = ElementTools.generateSetterMethod(maxPageSizeField); + FormatTools.addMethodWithBestPosition(topLevelClass, mSetMaxPageSize); + + Method mGetMaxPageSize = ElementTools.generateGetterMethod(maxPageSizeField); + FormatTools.addMethodWithBestPosition(topLevelClass, mGetMaxPageSize); + + Method mSetDefaultPageSize = ElementTools.generateSetterMethod(defaultPageSizeField); + FormatTools.addMethodWithBestPosition(topLevelClass, mSetDefaultPageSize); + + 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 setLimit = ElementTools.generateMethod( + "limit", + JavaVisibility.PUBLIC, + topLevelClass.getType(), + new Parameter(integerWrapper, "rows") + ); + setLimit = ElementTools.generateMethodBody( + setLimit, + "this.rows = rows;", + "return this;" + ); + FormatTools.addMethodWithBestPosition(topLevelClass, setLimit); + + Method setLimit2 = ElementTools.generateMethod( + "limit", + JavaVisibility.PUBLIC, + topLevelClass.getType(), + new Parameter(integerWrapper, "offset"), + new Parameter(integerWrapper, "rows") + ); + setLimit2 = ElementTools.generateMethodBody( + setLimit2, + "this.offset = offset;", + "this.rows = rows;", + "return this;" + ); + FormatTools.addMethodWithBestPosition(topLevelClass, setLimit2); + + Method usePage = ElementTools.generateMethod( + "usePage", + JavaVisibility.PUBLIC, + topLevelClass.getType(), + new Parameter(integerWrapper, "pageNum"), + new Parameter(integerWrapper, "pageSize") + ); + usePage = ElementTools.generateMethodBody( + usePage, + "pageSize = pageSize == null || pageSize <= 0 ? this.defaultPageSize : pageSize;", + "pageNum = pageNum == null || pageNum < this.minPageNum ? this.minPageNum : pageNum;", + "int cPageSize = pageSize > this.maxPageSize ? this.maxPageSize: pageSize;", + "this.offset = (pageNum - this.minPageNum) * cPageSize;", + "this.rows = cPageSize;", + "return this;" + ); + FormatTools.addMethodWithBestPosition(topLevelClass, usePage); + + // 计算获取当前页码 + Method getPageNum = ElementTools.generateMethod( + "getPageNum", + JavaVisibility.PUBLIC, + integerWrapper + ); + getPageNum = ElementTools.generateMethodBody( + getPageNum, + "if (this.rows == null || this.offset == null || this.rows == 0) {", + "return this.minPageNum;", + "}", + "return this.offset / this.rows + this.minPageNum;" + ); + FormatTools.addMethodWithBestPosition(topLevelClass, getPageNum); + // 计算获取当前每页数量 + Method getPageSize = ElementTools.generateMethod( + "getPageSize", + JavaVisibility.PUBLIC, + integerWrapper + ); + getPageSize = ElementTools.generateMethodBody( + getPageSize, + "if (this.rows == null) {", + "return 0;", + "}", + "return this.rows;" + ); + FormatTools.addMethodWithBestPosition(topLevelClass, getPageSize); + + // !!! clear 方法增加 offset 和 rows的清理 + List methodList = topLevelClass.getMethods(); + for (Method method : methodList) { + if (method.getName().equals("clear")) { + method.addBodyLine("rows = null;"); + method.addBodyLine("offset = null;"); + } + } + return true; + } + + @Override + public boolean sqlMapSelectAllElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { + this.generateLimitElement(element); + return super.sqlMapSelectAllElementGenerated(element, introspectedTable); + } + + @Override + public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { + this.generateLimitElement(element); + return super.sqlMapSelectByExampleWithoutBLOBsElementGenerated(element, introspectedTable); + } + + @Override + public boolean sqlMapSelectByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { + this.generateLimitElement(element); + return super.sqlMapSelectByExampleWithBLOBsElementGenerated(element, introspectedTable); + } + + @Override + public void generateLimitElement(XmlElement element) { + XmlElement ifLimitNotNullElement = new XmlElement("if"); + ifLimitNotNullElement.addAttribute(new Attribute("test", "rows != null")); + // rows + XmlElement ifOffsetNotNullElement = new XmlElement("if"); + ifOffsetNotNullElement.addAttribute(new Attribute("test", "offset != null")); + ifOffsetNotNullElement.addElement(new TextElement("limit ${offset}, ${rows}")); + ifLimitNotNullElement.addElement(ifOffsetNotNullElement); + // offset + XmlElement ifOffsetNullElement = new XmlElement("if"); + ifOffsetNullElement.addAttribute(new Attribute("test", "offset == null")); + ifOffsetNullElement.addElement(new TextElement("limit ${rows}")); + ifLimitNotNullElement.addElement(ifOffsetNullElement); + element.addElement(ifLimitNotNullElement); + } + +} diff --git a/src/main/java/com/iqudoo/framework/mybatis/hook/ISelectSelectivePluginHook.java b/src/main/java/com/iqudoo/framework/mybatis/hook/ISelectSelectivePluginHook.java new file mode 100644 index 0000000..11da92c --- /dev/null +++ b/src/main/java/com/iqudoo/framework/mybatis/hook/ISelectSelectivePluginHook.java @@ -0,0 +1,9 @@ +package com.iqudoo.framework.mybatis.hook; + +import org.mybatis.generator.api.dom.xml.XmlElement; + +public interface ISelectSelectivePluginHook { + + void generateLimitElement(XmlElement element); + +} diff --git a/src/main/java/com/iqudoo/framework/mybatis/utils/ElementTools.java b/src/main/java/com/iqudoo/framework/mybatis/utils/ElementTools.java new file mode 100644 index 0000000..0b4d053 --- /dev/null +++ b/src/main/java/com/iqudoo/framework/mybatis/utils/ElementTools.java @@ -0,0 +1,152 @@ +package com.iqudoo.framework.mybatis.utils; + +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.dom.java.*; + +import static org.mybatis.generator.internal.util.messages.Messages.getString; + +@SuppressWarnings("unused") +public class ElementTools { + + /** + * 生成静态常量 + * + * @param fieldName 常量名称 + * @param javaType 类型 + * @param initString 初始化字段 + * @return Field + */ + public static Field generateStaticFinalField(String fieldName, FullyQualifiedJavaType javaType, String initString) { + Field field = new Field(fieldName, javaType); + field.setVisibility(JavaVisibility.PUBLIC); + field.setStatic(true); + field.setFinal(true); + if (initString != null) { + field.setInitializationString(initString); + } + return field; + } + + /** + * 生成属性 + * + * @param fieldName 常量名称 + * @param visibility 可见性 + * @param javaType 类型 + * @param initString 初始化字段 + * @return Method + */ + public static Field generateField(String fieldName, JavaVisibility visibility, FullyQualifiedJavaType javaType, String initString) { + Field field = new Field(fieldName, javaType); + field.setVisibility(visibility); + if (initString != null) { + field.setInitializationString(initString); + } + return field; + } + + /** + * 生成方法 + * + * @param methodName 方法名 + * @param visibility 可见性 + * @param returnType 返回值类型 + * @param parameters 参数列表 + * @return Method + */ + public static Method generateMethod(String methodName, JavaVisibility visibility, FullyQualifiedJavaType returnType, Parameter... parameters) { + Method method = new Method(methodName); + method.setVisibility(visibility); + method.setReturnType(returnType); + if (parameters != null) { + for (Parameter parameter : parameters) { + method.addParameter(parameter); + } + } + + return method; + } + + /** + * 生成方法实现体 + * + * @param method 方法 + * @param bodyLines 方法实现行 + * @return Method + */ + public static Method generateMethodBody(Method method, String... bodyLines) { + if (bodyLines != null) { + for (String bodyLine : bodyLines) { + method.addBodyLine(bodyLine); + } + } + return method; + } + + /** + * 生成Filed的Set方法 + * + * @param field field + * @return Method + */ + public static Method generateSetterMethod(Field field) { + Method method = generateMethod( + "set" + FormatTools.upFirstChar(field.getName()), + JavaVisibility.PUBLIC, + null, + new Parameter(field.getType(), field.getName()) + ); + return generateMethodBody(method, "this." + field.getName() + " = " + field.getName() + ";"); + } + + /** + * 生成Filed的Get方法 + * + * @param field field + * @return Method + */ + public static Method generateGetterMethod(Field field) { + Method method = generateMethod( + "get" + FormatTools.upFirstChar(field.getName()), + JavaVisibility.PUBLIC, + field.getType() + ); + return generateMethodBody(method, "return this." + field.getName() + ";"); + } + + /** + * 获取Model没有BLOBs类时的类型 + * + * @param introspectedTable introspectedTable + * @return FullyQualifiedJavaType + */ + public static FullyQualifiedJavaType getModelTypeWithoutBLOBs(IntrospectedTable introspectedTable) { + FullyQualifiedJavaType type; + if (introspectedTable.getRules().generateBaseRecordClass()) { + type = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType()); + } else if (introspectedTable.getRules().generatePrimaryKeyClass()) { + type = new FullyQualifiedJavaType(introspectedTable.getPrimaryKeyType()); + } else { + throw new RuntimeException(getString("RuntimeError.12")); + } + return type; + } + + /** + * 获取Model有BLOBs类时的类型 + * + * @param introspectedTable introspectedTable + * @return FullyQualifiedJavaType + */ + public static FullyQualifiedJavaType getModelTypeWithBLOBs(IntrospectedTable introspectedTable) { + FullyQualifiedJavaType type; + if (introspectedTable.getRules().generateRecordWithBLOBsClass()) { + type = new FullyQualifiedJavaType(introspectedTable.getRecordWithBLOBsType()); + } else { + // the blob fields must be rolled up into the base class + type = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType()); + } + return type; + } + +} diff --git a/src/main/java/com/iqudoo/framework/mybatis/utils/FormatTools.java b/src/main/java/com/iqudoo/framework/mybatis/utils/FormatTools.java new file mode 100644 index 0000000..ff4af16 --- /dev/null +++ b/src/main/java/com/iqudoo/framework/mybatis/utils/FormatTools.java @@ -0,0 +1,234 @@ +package com.iqudoo.framework.mybatis.utils; + +import org.mybatis.generator.api.CommentGenerator; +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.dom.java.*; +import org.mybatis.generator.api.dom.xml.Attribute; +import org.mybatis.generator.api.dom.xml.TextElement; +import org.mybatis.generator.api.dom.xml.VisitableElement; +import org.mybatis.generator.api.dom.xml.XmlElement; + +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +@SuppressWarnings("unused") +public class FormatTools { + + /** + * 在最佳位置添加方法 + * + * @param innerClass innerClass + * @param method method + */ + public static void addMethodWithBestPosition(InnerClass innerClass, Method method) { + addMethodWithBestPosition(method, innerClass.getMethods()); + } + + /** + * 在最佳位置添加方法 + * + * @param anInterface anInterface + * @param method method + */ + public static void addMethodWithBestPosition(Interface anInterface, Method method) { + // import + Set importTypes = new TreeSet<>(); + // 返回 + if (method.getReturnType() != null && method.getReturnType().isPresent()) { + importTypes.add(method.getReturnType().get()); + importTypes.addAll(method.getReturnType().get().getTypeArguments()); + } + // 参数 比较特殊的是ModelColumn生成的Column + for (Parameter parameter : method.getParameters()) { + boolean flag = true; + for (String annotation : parameter.getAnnotations()) { + if (annotation.startsWith("@Param")) { + importTypes.add(new FullyQualifiedJavaType("org.apache.ibatis.annotations.Param")); + if (annotation.matches(".*selective.*") && parameter.getType() + .getShortName().equals("Column")) { + flag = false; + } + } + } + if (flag) { + importTypes.add(parameter.getType()); + importTypes.addAll(parameter.getType().getTypeArguments()); + } + } + anInterface.addImportedTypes(importTypes); + addMethodWithBestPosition(method, anInterface.getMethods()); + } + + /** + * 在最佳位置添加方法 + * + * @param innerEnum innerEnum + * @param method method + */ + public static void addMethodWithBestPosition(InnerEnum innerEnum, Method method) { + addMethodWithBestPosition(method, innerEnum.getMethods()); + } + + /** + * 在最佳位置添加方法 + * + * @param topLevelClass topLevelClass + * @param method method + */ + public static void addMethodWithBestPosition(TopLevelClass topLevelClass, Method method) { + addMethodWithBestPosition(method, topLevelClass.getMethods()); + } + + /** + * 在最佳位置添加节点 + * + * @param rootElement rootElement + * @param element element + */ + public static void addElementWithBestPosition(XmlElement rootElement, XmlElement element) { + // sql 元素都放在sql后面 + if (element.getName().equals("sql")) { + int index = 0; + for (VisitableElement ele : rootElement.getElements()) { + if (ele instanceof XmlElement && ((XmlElement) ele).getName().equals("sql")) { + index++; + } + } + rootElement.addElement(index, element); + } else { + + // 根据id 排序 + String id = getIdFromElement(element); + if (id == null) { + rootElement.addElement(element); + } else { + List elements = rootElement.getElements(); + int index = -1; + for (int i = 0; i < elements.size(); i++) { + VisitableElement ele = elements.get(i); + if (ele instanceof XmlElement) { + String eleId = getIdFromElement((XmlElement) ele); + if (eleId != null) { + if (eleId.startsWith(id)) { + if (index == -1) { + index = i; + } + } else if (id.startsWith(eleId)) { + index = i + 1; + } + } + } + } + + if (index == -1 || index >= elements.size()) { + rootElement.addElement(element); + } else { + elements.add(index, element); + } + } + } + } + + /** + * 找出节点ID值 + * + * @param element element + * @return id + */ + private static String getIdFromElement(XmlElement element) { + for (Attribute attribute : element.getAttributes()) { + if (attribute.getName().equals("id")) { + return attribute.getValue(); + } + } + return null; + } + + /** + * 获取最佳添加位置 + * + * @param method method + * @param methods methods + */ + private static void addMethodWithBestPosition(Method method, List methods) { + int index = -1; + for (int i = 0; i < methods.size(); i++) { + Method m = methods.get(i); + if (m.getName().equals(method.getName())) { + if (m.getParameters().size() <= method.getParameters().size()) { + index = i + 1; + } else { + index = i; + } + } else if (m.getName().startsWith(method.getName())) { + if (index == -1) { + index = i; + } + } else if (method.getName().startsWith(m.getName())) { + index = i + 1; + } + } + if (index == -1 || index >= methods.size()) { + methods.add(methods.size(), method); + } else { + methods.add(index, method); + } + } + + /** + * 替换已有方法注释 + * + * @param commentGenerator commentGenerator + * @param method method + * @param introspectedTable introspectedTable + */ + public static void replaceGeneralMethodComment(CommentGenerator commentGenerator, Method method, IntrospectedTable introspectedTable) { + method.getJavaDocLines().clear(); + commentGenerator.addGeneralMethodComment(method, introspectedTable); + } + + /** + * 替换已有注释 + * + * @param commentGenerator commentGenerator + * @param element element + */ + public static void replaceComment(CommentGenerator commentGenerator, XmlElement element) { + Iterator elementIterator = element.getElements().iterator(); + boolean flag = false; + while (elementIterator.hasNext()) { + VisitableElement ele = elementIterator.next(); + if (ele instanceof TextElement && ((TextElement) ele).getContent().matches(".*.*")) { + flag = false; + } + } + + XmlElement tmpEle = new XmlElement("tmp"); + commentGenerator.addComment(tmpEle); + + for (int i = tmpEle.getElements().size() - 1; i >= 0; i--) { + element.addElement(0, tmpEle.getElements().get(i)); + } + } + + /** + * 首字母大写 + * + * @param str str + * @return str + */ + public static String upFirstChar(String str) { + return str.substring(0, 1).toUpperCase() + str.substring(1); + } + +} diff --git a/target/apidocs/allclasses-frame.html b/target/apidocs/allclasses-frame.html new file mode 100644 index 0000000..e939973 --- /dev/null +++ b/target/apidocs/allclasses-frame.html @@ -0,0 +1,26 @@ + + + + + + +所有类 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + +

所有类

+ + + diff --git a/target/apidocs/allclasses-noframe.html b/target/apidocs/allclasses-noframe.html new file mode 100644 index 0000000..863dbe6 --- /dev/null +++ b/target/apidocs/allclasses-noframe.html @@ -0,0 +1,26 @@ + + + + + + +所有类 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + +

所有类

+ + + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/TapeMybatisGeneratorPlugin.html b/target/apidocs/com/iqudoo/framework/mybatis/TapeMybatisGeneratorPlugin.html new file mode 100644 index 0000000..77c10ed --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/TapeMybatisGeneratorPlugin.html @@ -0,0 +1,355 @@ + + + + + + +TapeMybatisGeneratorPlugin (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + + +
+
com.iqudoo.framework.mybatis
+

类 TapeMybatisGeneratorPlugin

+
+
+ +
+ +
+
+
    +
  • + +
      +
    • + + +

      嵌套类概要

      +
        +
      • + + +

        从接口继承的嵌套类/接口 org.mybatis.generator.api.Plugin

        +org.mybatis.generator.api.Plugin.ModelClassType
      • +
      +
    • +
    + +
      +
    • + + +

      字段概要

      +
        +
      • + + +

        从类继承的字段 org.mybatis.generator.api.PluginAdapter

        +context, properties
      • +
      +
    • +
    + + + +
      +
    • + + +

      方法概要

      + + + + + + + + + + + + + + +
      所有方法 实例方法 具体方法 
      限定符和类型方法和说明
      booleanclientGenerated(org.mybatis.generator.api.dom.java.Interface interfaze, + org.mybatis.generator.api.IntrospectedTable introspectedTable) 
      booleansqlMapDocumentGenerated(org.mybatis.generator.api.dom.xml.Document document, + org.mybatis.generator.api.IntrospectedTable introspectedTable) 
      + +
        +
      • + + +

        从类继承的方法 org.mybatis.generator.api.PluginAdapter

        +setContext, setProperties
      • +
      + +
        +
      • + + +

        从接口继承的方法 org.mybatis.generator.api.Plugin

        +clientBasicCountMethodGenerated, clientBasicCountMethodGenerated, clientBasicDeleteMethodGenerated, clientBasicDeleteMethodGenerated, clientBasicInsertMethodGenerated, clientBasicInsertMethodGenerated, clientBasicInsertMultipleHelperMethodGenerated, clientBasicInsertMultipleHelperMethodGenerated, clientBasicInsertMultipleMethodGenerated, clientBasicInsertMultipleMethodGenerated, clientBasicSelectManyMethodGenerated, clientBasicSelectManyMethodGenerated, clientBasicSelectOneMethodGenerated, clientBasicSelectOneMethodGenerated, clientBasicUpdateMethodGenerated, clientBasicUpdateMethodGenerated, clientColumnListPropertyGenerated, clientCountByExampleMethodGenerated, clientDeleteByExampleMethodGenerated, clientDeleteByPrimaryKeyMethodGenerated, clientDeleteByPrimaryKeyMethodGenerated, clientGeneralCountMethodGenerated, clientGeneralCountMethodGenerated, clientGeneralDeleteMethodGenerated, clientGeneralDeleteMethodGenerated, clientGeneralSelectDistinctMethodGenerated, clientGeneralSelectDistinctMethodGenerated, clientGeneralSelectMethodGenerated, clientGeneralSelectMethodGenerated, clientGeneralUpdateMethodGenerated, clientGeneralUpdateMethodGenerated, clientInsertMethodGenerated, clientInsertMethodGenerated, clientInsertMultipleMethodGenerated, clientInsertMultipleMethodGenerated, clientInsertMultipleVarargMethodGenerated, clientInsertSelectiveMethodGenerated, clientInsertSelectiveMethodGenerated, clientSelectAllMethodGenerated, clientSelectByExampleWithBLOBsMethodGenerated, clientSelectByExampleWithoutBLOBsMethodGenerated, clientSelectByPrimaryKeyMethodGenerated, clientSelectByPrimaryKeyMethodGenerated, clientSelectListFieldGenerated, clientSelectOneMethodGenerated, clientSelectOneMethodGenerated, clientUpdateAllColumnsMethodGenerated, clientUpdateAllColumnsMethodGenerated, clientUpdateByExampleSelectiveMethodGenerated, clientUpdateByExampleWithBLOBsMethodGenerated, clientUpdateByExampleWithoutBLOBsMethodGenerated, clientUpdateByPrimaryKeyMethodGenerated, clientUpdateByPrimaryKeySelectiveMethodGenerated, clientUpdateByPrimaryKeySelectiveMethodGenerated, clientUpdateByPrimaryKeyWithBLOBsMethodGenerated, clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated, clientUpdateSelectiveColumnsMethodGenerated, clientUpdateSelectiveColumnsMethodGenerated, contextGenerateAdditionalFiles, contextGenerateAdditionalFiles, contextGenerateAdditionalJavaFiles, contextGenerateAdditionalJavaFiles, contextGenerateAdditionalKotlinFiles, contextGenerateAdditionalKotlinFiles, contextGenerateAdditionalXmlFiles, contextGenerateAdditionalXmlFiles, dynamicSqlSupportGenerated, dynamicSqlSupportGenerated, kotlinDataClassGenerated, mapperExtensionsGenerated, mapperGenerated, modelBaseRecordClassGenerated, modelFieldGenerated, modelGetterMethodGenerated, modelPrimaryKeyClassGenerated, modelRecordWithBLOBsClassGenerated, modelSetterMethodGenerated, providerApplyWhereMethodGenerated, providerCountByExampleMethodGenerated, providerDeleteByExampleMethodGenerated, providerGenerated, providerInsertSelectiveMethodGenerated, providerSelectByExampleWithBLOBsMethodGenerated, providerSelectByExampleWithoutBLOBsMethodGenerated, providerUpdateByExampleSelectiveMethodGenerated, providerUpdateByExampleWithBLOBsMethodGenerated, providerUpdateByExampleWithoutBLOBsMethodGenerated, providerUpdateByPrimaryKeySelectiveMethodGenerated, sqlMapBaseColumnListElementGenerated, sqlMapBlobColumnListElementGenerated, sqlMapCountByExampleElementGenerated, sqlMapDeleteByExampleElementGenerated, sqlMapDeleteByPrimaryKeyElementGenerated, sqlMapExampleWhereClauseElementGenerated, sqlMapGenerated, sqlMapInsertElementGenerated, sqlMapInsertSelectiveElementGenerated, sqlMapResultMapWithBLOBsElementGenerated, sqlMapResultMapWithoutBLOBsElementGenerated, sqlMapSelectByPrimaryKeyElementGenerated, sqlMapUpdateByExampleSelectiveElementGenerated, sqlMapUpdateByExampleWithBLOBsElementGenerated, sqlMapUpdateByExampleWithoutBLOBsElementGenerated, sqlMapUpdateByPrimaryKeySelectiveElementGenerated, sqlMapUpdateByPrimaryKeyWithBLOBsElementGenerated, sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      构造器详细资料

      + + + +
        +
      • +

        TapeMybatisGeneratorPlugin

        +
        public TapeMybatisGeneratorPlugin()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      方法详细资料

      + + + +
        +
      • +

        clientGenerated

        +
        public boolean clientGenerated(org.mybatis.generator.api.dom.java.Interface interfaze,
        +                               org.mybatis.generator.api.IntrospectedTable introspectedTable)
        +
      • +
      + + + +
        +
      • +

        sqlMapDocumentGenerated

        +
        public boolean sqlMapDocumentGenerated(org.mybatis.generator.api.dom.xml.Document document,
        +                                       org.mybatis.generator.api.IntrospectedTable introspectedTable)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.html b/target/apidocs/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.html new file mode 100644 index 0000000..21b29a6 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.html @@ -0,0 +1,374 @@ + + + + + + +TapeRepositoryGeneratorPlugin (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + + +
+
com.iqudoo.framework.mybatis
+

类 TapeRepositoryGeneratorPlugin

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • org.mybatis.generator.api.PluginAdapter
    • +
    • +
        +
      • com.iqudoo.framework.mybatis.TapeRepositoryGeneratorPlugin
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    所有已实现的接口:
    +
    org.mybatis.generator.api.Plugin
    +
    +
    +
    +
    public class TapeRepositoryGeneratorPlugin
    +extends org.mybatis.generator.api.PluginAdapter
    +
    MyBatis Generator 1.4.1
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      嵌套类概要

      +
        +
      • + + +

        从接口继承的嵌套类/接口 org.mybatis.generator.api.Plugin

        +org.mybatis.generator.api.Plugin.ModelClassType
      • +
      +
    • +
    + +
      +
    • + + +

      字段概要

      +
        +
      • + + +

        从类继承的字段 org.mybatis.generator.api.PluginAdapter

        +context, properties
      • +
      +
    • +
    + + + +
      +
    • + + +

      方法概要

      + + + + + + + + + + + + + + + + + + + + + + +
      所有方法 实例方法 具体方法 
      限定符和类型方法和说明
      List<org.mybatis.generator.api.GeneratedJavaFile>contextGenerateAdditionalJavaFiles(org.mybatis.generator.api.IntrospectedTable introspectedTable) +
      核心方法:视图表过滤 + 生成完整Repository代码
      +
      voidsetContext(org.mybatis.generator.config.Context context) 
      voidsetProperties(Properties properties) 
      booleanvalidate(List<String> warnings) 
      + +
        +
      • + + +

        从接口继承的方法 org.mybatis.generator.api.Plugin

        +clientBasicCountMethodGenerated, clientBasicCountMethodGenerated, clientBasicDeleteMethodGenerated, clientBasicDeleteMethodGenerated, clientBasicInsertMethodGenerated, clientBasicInsertMethodGenerated, clientBasicInsertMultipleHelperMethodGenerated, clientBasicInsertMultipleHelperMethodGenerated, clientBasicInsertMultipleMethodGenerated, clientBasicInsertMultipleMethodGenerated, clientBasicSelectManyMethodGenerated, clientBasicSelectManyMethodGenerated, clientBasicSelectOneMethodGenerated, clientBasicSelectOneMethodGenerated, clientBasicUpdateMethodGenerated, clientBasicUpdateMethodGenerated, clientColumnListPropertyGenerated, clientCountByExampleMethodGenerated, clientDeleteByExampleMethodGenerated, clientDeleteByPrimaryKeyMethodGenerated, clientDeleteByPrimaryKeyMethodGenerated, clientGeneralCountMethodGenerated, clientGeneralCountMethodGenerated, clientGeneralDeleteMethodGenerated, clientGeneralDeleteMethodGenerated, clientGeneralSelectDistinctMethodGenerated, clientGeneralSelectDistinctMethodGenerated, clientGeneralSelectMethodGenerated, clientGeneralSelectMethodGenerated, clientGeneralUpdateMethodGenerated, clientGeneralUpdateMethodGenerated, clientGenerated, clientInsertMethodGenerated, clientInsertMethodGenerated, clientInsertMultipleMethodGenerated, clientInsertMultipleMethodGenerated, clientInsertMultipleVarargMethodGenerated, clientInsertSelectiveMethodGenerated, clientInsertSelectiveMethodGenerated, clientSelectAllMethodGenerated, clientSelectByExampleWithBLOBsMethodGenerated, clientSelectByExampleWithoutBLOBsMethodGenerated, clientSelectByPrimaryKeyMethodGenerated, clientSelectByPrimaryKeyMethodGenerated, clientSelectListFieldGenerated, clientSelectOneMethodGenerated, clientSelectOneMethodGenerated, clientUpdateAllColumnsMethodGenerated, clientUpdateAllColumnsMethodGenerated, clientUpdateByExampleSelectiveMethodGenerated, clientUpdateByExampleWithBLOBsMethodGenerated, clientUpdateByExampleWithoutBLOBsMethodGenerated, clientUpdateByPrimaryKeyMethodGenerated, clientUpdateByPrimaryKeySelectiveMethodGenerated, clientUpdateByPrimaryKeySelectiveMethodGenerated, clientUpdateByPrimaryKeyWithBLOBsMethodGenerated, clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated, clientUpdateSelectiveColumnsMethodGenerated, clientUpdateSelectiveColumnsMethodGenerated, contextGenerateAdditionalFiles, contextGenerateAdditionalFiles, contextGenerateAdditionalJavaFiles, contextGenerateAdditionalKotlinFiles, contextGenerateAdditionalKotlinFiles, contextGenerateAdditionalXmlFiles, contextGenerateAdditionalXmlFiles, dynamicSqlSupportGenerated, dynamicSqlSupportGenerated, initialized, kotlinDataClassGenerated, mapperExtensionsGenerated, mapperGenerated, modelBaseRecordClassGenerated, modelExampleClassGenerated, modelFieldGenerated, modelGetterMethodGenerated, modelPrimaryKeyClassGenerated, modelRecordWithBLOBsClassGenerated, modelSetterMethodGenerated, providerApplyWhereMethodGenerated, providerCountByExampleMethodGenerated, providerDeleteByExampleMethodGenerated, providerGenerated, providerInsertSelectiveMethodGenerated, providerSelectByExampleWithBLOBsMethodGenerated, providerSelectByExampleWithoutBLOBsMethodGenerated, providerUpdateByExampleSelectiveMethodGenerated, providerUpdateByExampleWithBLOBsMethodGenerated, providerUpdateByExampleWithoutBLOBsMethodGenerated, providerUpdateByPrimaryKeySelectiveMethodGenerated, sqlMapBaseColumnListElementGenerated, sqlMapBlobColumnListElementGenerated, sqlMapCountByExampleElementGenerated, sqlMapDeleteByExampleElementGenerated, sqlMapDeleteByPrimaryKeyElementGenerated, sqlMapDocumentGenerated, sqlMapExampleWhereClauseElementGenerated, sqlMapGenerated, sqlMapInsertElementGenerated, sqlMapInsertSelectiveElementGenerated, sqlMapResultMapWithBLOBsElementGenerated, sqlMapResultMapWithoutBLOBsElementGenerated, sqlMapSelectAllElementGenerated, sqlMapSelectByExampleWithBLOBsElementGenerated, sqlMapSelectByExampleWithoutBLOBsElementGenerated, sqlMapSelectByPrimaryKeyElementGenerated, sqlMapUpdateByExampleSelectiveElementGenerated, sqlMapUpdateByExampleWithBLOBsElementGenerated, sqlMapUpdateByExampleWithoutBLOBsElementGenerated, sqlMapUpdateByPrimaryKeySelectiveElementGenerated, sqlMapUpdateByPrimaryKeyWithBLOBsElementGenerated, sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      构造器详细资料

      + + + +
        +
      • +

        TapeRepositoryGeneratorPlugin

        +
        public TapeRepositoryGeneratorPlugin()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      方法详细资料

      + + + +
        +
      • +

        setContext

        +
        public void setContext(org.mybatis.generator.config.Context context)
        +
        +
        指定者:
        +
        setContext 在接口中 org.mybatis.generator.api.Plugin
        +
        覆盖:
        +
        setContext 在类中 org.mybatis.generator.api.PluginAdapter
        +
        +
      • +
      + + + +
        +
      • +

        validate

        +
        public boolean validate(List<String> warnings)
        +
      • +
      + + + +
        +
      • +

        setProperties

        +
        public void setProperties(Properties properties)
        +
        +
        指定者:
        +
        setProperties 在接口中 org.mybatis.generator.api.Plugin
        +
        覆盖:
        +
        setProperties 在类中 org.mybatis.generator.api.PluginAdapter
        +
        +
      • +
      + + + +
        +
      • +

        contextGenerateAdditionalJavaFiles

        +
        public List<org.mybatis.generator.api.GeneratedJavaFile> contextGenerateAdditionalJavaFiles(org.mybatis.generator.api.IntrospectedTable introspectedTable)
        +
        核心方法:视图表过滤 + 生成完整Repository代码
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.html b/target/apidocs/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.html new file mode 100644 index 0000000..3b3784e --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.html @@ -0,0 +1,374 @@ + + + + + + +TapeRepoviewGeneratorPlugin (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + + +
+
com.iqudoo.framework.mybatis
+

类 TapeRepoviewGeneratorPlugin

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • org.mybatis.generator.api.PluginAdapter
    • +
    • +
        +
      • com.iqudoo.framework.mybatis.TapeRepoviewGeneratorPlugin
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    所有已实现的接口:
    +
    org.mybatis.generator.api.Plugin
    +
    +
    +
    +
    public class TapeRepoviewGeneratorPlugin
    +extends org.mybatis.generator.api.PluginAdapter
    +
    MyBatis Generator 1.4.1 适配版:视图表专用 RepoView 生成插件
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      嵌套类概要

      +
        +
      • + + +

        从接口继承的嵌套类/接口 org.mybatis.generator.api.Plugin

        +org.mybatis.generator.api.Plugin.ModelClassType
      • +
      +
    • +
    + +
      +
    • + + +

      字段概要

      +
        +
      • + + +

        从类继承的字段 org.mybatis.generator.api.PluginAdapter

        +context, properties
      • +
      +
    • +
    + + + +
      +
    • + + +

      方法概要

      + + + + + + + + + + + + + + + + + + + + + + +
      所有方法 实例方法 具体方法 
      限定符和类型方法和说明
      List<org.mybatis.generator.api.GeneratedJavaFile>contextGenerateAdditionalJavaFiles(org.mybatis.generator.api.IntrospectedTable introspectedTable) +
      核心方法:仅为视图表生成 RepoView 代码
      +
      voidsetContext(org.mybatis.generator.config.Context context) 
      voidsetProperties(Properties properties) 
      booleanvalidate(List<String> warnings) 
      + +
        +
      • + + +

        从接口继承的方法 org.mybatis.generator.api.Plugin

        +clientBasicCountMethodGenerated, clientBasicCountMethodGenerated, clientBasicDeleteMethodGenerated, clientBasicDeleteMethodGenerated, clientBasicInsertMethodGenerated, clientBasicInsertMethodGenerated, clientBasicInsertMultipleHelperMethodGenerated, clientBasicInsertMultipleHelperMethodGenerated, clientBasicInsertMultipleMethodGenerated, clientBasicInsertMultipleMethodGenerated, clientBasicSelectManyMethodGenerated, clientBasicSelectManyMethodGenerated, clientBasicSelectOneMethodGenerated, clientBasicSelectOneMethodGenerated, clientBasicUpdateMethodGenerated, clientBasicUpdateMethodGenerated, clientColumnListPropertyGenerated, clientCountByExampleMethodGenerated, clientDeleteByExampleMethodGenerated, clientDeleteByPrimaryKeyMethodGenerated, clientDeleteByPrimaryKeyMethodGenerated, clientGeneralCountMethodGenerated, clientGeneralCountMethodGenerated, clientGeneralDeleteMethodGenerated, clientGeneralDeleteMethodGenerated, clientGeneralSelectDistinctMethodGenerated, clientGeneralSelectDistinctMethodGenerated, clientGeneralSelectMethodGenerated, clientGeneralSelectMethodGenerated, clientGeneralUpdateMethodGenerated, clientGeneralUpdateMethodGenerated, clientGenerated, clientInsertMethodGenerated, clientInsertMethodGenerated, clientInsertMultipleMethodGenerated, clientInsertMultipleMethodGenerated, clientInsertMultipleVarargMethodGenerated, clientInsertSelectiveMethodGenerated, clientInsertSelectiveMethodGenerated, clientSelectAllMethodGenerated, clientSelectByExampleWithBLOBsMethodGenerated, clientSelectByExampleWithoutBLOBsMethodGenerated, clientSelectByPrimaryKeyMethodGenerated, clientSelectByPrimaryKeyMethodGenerated, clientSelectListFieldGenerated, clientSelectOneMethodGenerated, clientSelectOneMethodGenerated, clientUpdateAllColumnsMethodGenerated, clientUpdateAllColumnsMethodGenerated, clientUpdateByExampleSelectiveMethodGenerated, clientUpdateByExampleWithBLOBsMethodGenerated, clientUpdateByExampleWithoutBLOBsMethodGenerated, clientUpdateByPrimaryKeyMethodGenerated, clientUpdateByPrimaryKeySelectiveMethodGenerated, clientUpdateByPrimaryKeySelectiveMethodGenerated, clientUpdateByPrimaryKeyWithBLOBsMethodGenerated, clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated, clientUpdateSelectiveColumnsMethodGenerated, clientUpdateSelectiveColumnsMethodGenerated, contextGenerateAdditionalFiles, contextGenerateAdditionalFiles, contextGenerateAdditionalJavaFiles, contextGenerateAdditionalKotlinFiles, contextGenerateAdditionalKotlinFiles, contextGenerateAdditionalXmlFiles, contextGenerateAdditionalXmlFiles, dynamicSqlSupportGenerated, dynamicSqlSupportGenerated, initialized, kotlinDataClassGenerated, mapperExtensionsGenerated, mapperGenerated, modelBaseRecordClassGenerated, modelExampleClassGenerated, modelFieldGenerated, modelGetterMethodGenerated, modelPrimaryKeyClassGenerated, modelRecordWithBLOBsClassGenerated, modelSetterMethodGenerated, providerApplyWhereMethodGenerated, providerCountByExampleMethodGenerated, providerDeleteByExampleMethodGenerated, providerGenerated, providerInsertSelectiveMethodGenerated, providerSelectByExampleWithBLOBsMethodGenerated, providerSelectByExampleWithoutBLOBsMethodGenerated, providerUpdateByExampleSelectiveMethodGenerated, providerUpdateByExampleWithBLOBsMethodGenerated, providerUpdateByExampleWithoutBLOBsMethodGenerated, providerUpdateByPrimaryKeySelectiveMethodGenerated, sqlMapBaseColumnListElementGenerated, sqlMapBlobColumnListElementGenerated, sqlMapCountByExampleElementGenerated, sqlMapDeleteByExampleElementGenerated, sqlMapDeleteByPrimaryKeyElementGenerated, sqlMapDocumentGenerated, sqlMapExampleWhereClauseElementGenerated, sqlMapGenerated, sqlMapInsertElementGenerated, sqlMapInsertSelectiveElementGenerated, sqlMapResultMapWithBLOBsElementGenerated, sqlMapResultMapWithoutBLOBsElementGenerated, sqlMapSelectAllElementGenerated, sqlMapSelectByExampleWithBLOBsElementGenerated, sqlMapSelectByExampleWithoutBLOBsElementGenerated, sqlMapSelectByPrimaryKeyElementGenerated, sqlMapUpdateByExampleSelectiveElementGenerated, sqlMapUpdateByExampleWithBLOBsElementGenerated, sqlMapUpdateByExampleWithoutBLOBsElementGenerated, sqlMapUpdateByPrimaryKeySelectiveElementGenerated, sqlMapUpdateByPrimaryKeyWithBLOBsElementGenerated, sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      构造器详细资料

      + + + +
        +
      • +

        TapeRepoviewGeneratorPlugin

        +
        public TapeRepoviewGeneratorPlugin()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      方法详细资料

      + + + +
        +
      • +

        setContext

        +
        public void setContext(org.mybatis.generator.config.Context context)
        +
        +
        指定者:
        +
        setContext 在接口中 org.mybatis.generator.api.Plugin
        +
        覆盖:
        +
        setContext 在类中 org.mybatis.generator.api.PluginAdapter
        +
        +
      • +
      + + + +
        +
      • +

        validate

        +
        public boolean validate(List<String> warnings)
        +
      • +
      + + + +
        +
      • +

        setProperties

        +
        public void setProperties(Properties properties)
        +
        +
        指定者:
        +
        setProperties 在接口中 org.mybatis.generator.api.Plugin
        +
        覆盖:
        +
        setProperties 在类中 org.mybatis.generator.api.PluginAdapter
        +
        +
      • +
      + + + +
        +
      • +

        contextGenerateAdditionalJavaFiles

        +
        public List<org.mybatis.generator.api.GeneratedJavaFile> contextGenerateAdditionalJavaFiles(org.mybatis.generator.api.IntrospectedTable introspectedTable)
        +
        核心方法:仅为视图表生成 RepoView 代码
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/abstracts/AbstractWithLimitPlugin.html b/target/apidocs/com/iqudoo/framework/mybatis/abstracts/AbstractWithLimitPlugin.html new file mode 100644 index 0000000..f39ce4d --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/abstracts/AbstractWithLimitPlugin.html @@ -0,0 +1,445 @@ + + + + + + +AbstractWithLimitPlugin (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + + +
+
com.iqudoo.framework.mybatis.abstracts
+

类 AbstractWithLimitPlugin

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • org.mybatis.generator.api.PluginAdapter
    • +
    • +
        +
      • com.iqudoo.framework.mybatis.abstracts.AbstractWithLimitPlugin
      • +
      +
    • +
    +
  • +
+
+ +
+
+
    +
  • + +
      +
    • + + +

      嵌套类概要

      +
        +
      • + + +

        从接口继承的嵌套类/接口 org.mybatis.generator.api.Plugin

        +org.mybatis.generator.api.Plugin.ModelClassType
      • +
      +
    • +
    + +
      +
    • + + +

      字段概要

      +
        +
      • + + +

        从类继承的字段 org.mybatis.generator.api.PluginAdapter

        +context, properties
      • +
      +
    • +
    + + + +
      +
    • + + +

      方法概要

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      所有方法 实例方法 具体方法 
      限定符和类型方法和说明
      voidgenerateLimitElement(org.mybatis.generator.api.dom.xml.XmlElement element) 
      voidinitialized(org.mybatis.generator.api.IntrospectedTable introspectedTable) 
      booleanmodelExampleClassGenerated(org.mybatis.generator.api.dom.java.TopLevelClass topLevelClass, + org.mybatis.generator.api.IntrospectedTable introspectedTable) 
      booleansqlMapSelectAllElementGenerated(org.mybatis.generator.api.dom.xml.XmlElement element, + org.mybatis.generator.api.IntrospectedTable introspectedTable) 
      booleansqlMapSelectByExampleWithBLOBsElementGenerated(org.mybatis.generator.api.dom.xml.XmlElement element, + org.mybatis.generator.api.IntrospectedTable introspectedTable) 
      booleansqlMapSelectByExampleWithoutBLOBsElementGenerated(org.mybatis.generator.api.dom.xml.XmlElement element, + org.mybatis.generator.api.IntrospectedTable introspectedTable) 
      booleanvalidate(List<String> list) 
      +
        +
      • + + +

        从类继承的方法 org.mybatis.generator.api.PluginAdapter

        +setContext, setProperties
      • +
      + +
        +
      • + + +

        从接口继承的方法 org.mybatis.generator.api.Plugin

        +clientBasicCountMethodGenerated, clientBasicCountMethodGenerated, clientBasicDeleteMethodGenerated, clientBasicDeleteMethodGenerated, clientBasicInsertMethodGenerated, clientBasicInsertMethodGenerated, clientBasicInsertMultipleHelperMethodGenerated, clientBasicInsertMultipleHelperMethodGenerated, clientBasicInsertMultipleMethodGenerated, clientBasicInsertMultipleMethodGenerated, clientBasicSelectManyMethodGenerated, clientBasicSelectManyMethodGenerated, clientBasicSelectOneMethodGenerated, clientBasicSelectOneMethodGenerated, clientBasicUpdateMethodGenerated, clientBasicUpdateMethodGenerated, clientColumnListPropertyGenerated, clientCountByExampleMethodGenerated, clientDeleteByExampleMethodGenerated, clientDeleteByPrimaryKeyMethodGenerated, clientDeleteByPrimaryKeyMethodGenerated, clientGeneralCountMethodGenerated, clientGeneralCountMethodGenerated, clientGeneralDeleteMethodGenerated, clientGeneralDeleteMethodGenerated, clientGeneralSelectDistinctMethodGenerated, clientGeneralSelectDistinctMethodGenerated, clientGeneralSelectMethodGenerated, clientGeneralSelectMethodGenerated, clientGeneralUpdateMethodGenerated, clientGeneralUpdateMethodGenerated, clientGenerated, clientInsertMethodGenerated, clientInsertMethodGenerated, clientInsertMultipleMethodGenerated, clientInsertMultipleMethodGenerated, clientInsertMultipleVarargMethodGenerated, clientInsertSelectiveMethodGenerated, clientInsertSelectiveMethodGenerated, clientSelectAllMethodGenerated, clientSelectByExampleWithBLOBsMethodGenerated, clientSelectByExampleWithoutBLOBsMethodGenerated, clientSelectByPrimaryKeyMethodGenerated, clientSelectByPrimaryKeyMethodGenerated, clientSelectListFieldGenerated, clientSelectOneMethodGenerated, clientSelectOneMethodGenerated, clientUpdateAllColumnsMethodGenerated, clientUpdateAllColumnsMethodGenerated, clientUpdateByExampleSelectiveMethodGenerated, clientUpdateByExampleWithBLOBsMethodGenerated, clientUpdateByExampleWithoutBLOBsMethodGenerated, clientUpdateByPrimaryKeyMethodGenerated, clientUpdateByPrimaryKeySelectiveMethodGenerated, clientUpdateByPrimaryKeySelectiveMethodGenerated, clientUpdateByPrimaryKeyWithBLOBsMethodGenerated, clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated, clientUpdateSelectiveColumnsMethodGenerated, clientUpdateSelectiveColumnsMethodGenerated, contextGenerateAdditionalFiles, contextGenerateAdditionalFiles, contextGenerateAdditionalJavaFiles, contextGenerateAdditionalJavaFiles, contextGenerateAdditionalKotlinFiles, contextGenerateAdditionalKotlinFiles, contextGenerateAdditionalXmlFiles, contextGenerateAdditionalXmlFiles, dynamicSqlSupportGenerated, dynamicSqlSupportGenerated, kotlinDataClassGenerated, mapperExtensionsGenerated, mapperGenerated, modelBaseRecordClassGenerated, modelFieldGenerated, modelGetterMethodGenerated, modelPrimaryKeyClassGenerated, modelRecordWithBLOBsClassGenerated, modelSetterMethodGenerated, providerApplyWhereMethodGenerated, providerCountByExampleMethodGenerated, providerDeleteByExampleMethodGenerated, providerGenerated, providerInsertSelectiveMethodGenerated, providerSelectByExampleWithBLOBsMethodGenerated, providerSelectByExampleWithoutBLOBsMethodGenerated, providerUpdateByExampleSelectiveMethodGenerated, providerUpdateByExampleWithBLOBsMethodGenerated, providerUpdateByExampleWithoutBLOBsMethodGenerated, providerUpdateByPrimaryKeySelectiveMethodGenerated, sqlMapBaseColumnListElementGenerated, sqlMapBlobColumnListElementGenerated, sqlMapCountByExampleElementGenerated, sqlMapDeleteByExampleElementGenerated, sqlMapDeleteByPrimaryKeyElementGenerated, sqlMapDocumentGenerated, sqlMapExampleWhereClauseElementGenerated, sqlMapGenerated, sqlMapInsertElementGenerated, sqlMapInsertSelectiveElementGenerated, sqlMapResultMapWithBLOBsElementGenerated, sqlMapResultMapWithoutBLOBsElementGenerated, sqlMapSelectByPrimaryKeyElementGenerated, sqlMapUpdateByExampleSelectiveElementGenerated, sqlMapUpdateByExampleWithBLOBsElementGenerated, sqlMapUpdateByExampleWithoutBLOBsElementGenerated, sqlMapUpdateByPrimaryKeySelectiveElementGenerated, sqlMapUpdateByPrimaryKeyWithBLOBsElementGenerated, sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      构造器详细资料

      + + + +
        +
      • +

        AbstractWithLimitPlugin

        +
        public AbstractWithLimitPlugin()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      方法详细资料

      + + + +
        +
      • +

        validate

        +
        public boolean validate(List<String> list)
        +
        +
        指定者:
        +
        validate 在接口中 org.mybatis.generator.api.Plugin
        +
        +
      • +
      + + + +
        +
      • +

        initialized

        +
        public void initialized(org.mybatis.generator.api.IntrospectedTable introspectedTable)
        +
        +
        指定者:
        +
        initialized 在接口中 org.mybatis.generator.api.Plugin
        +
        +
      • +
      + + + +
        +
      • +

        modelExampleClassGenerated

        +
        public boolean modelExampleClassGenerated(org.mybatis.generator.api.dom.java.TopLevelClass topLevelClass,
        +                                          org.mybatis.generator.api.IntrospectedTable introspectedTable)
        +
        +
        指定者:
        +
        modelExampleClassGenerated 在接口中 org.mybatis.generator.api.Plugin
        +
        +
      • +
      + + + +
        +
      • +

        sqlMapSelectAllElementGenerated

        +
        public boolean sqlMapSelectAllElementGenerated(org.mybatis.generator.api.dom.xml.XmlElement element,
        +                                               org.mybatis.generator.api.IntrospectedTable introspectedTable)
        +
        +
        指定者:
        +
        sqlMapSelectAllElementGenerated 在接口中 org.mybatis.generator.api.Plugin
        +
        +
      • +
      + + + +
        +
      • +

        sqlMapSelectByExampleWithoutBLOBsElementGenerated

        +
        public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(org.mybatis.generator.api.dom.xml.XmlElement element,
        +                                                                 org.mybatis.generator.api.IntrospectedTable introspectedTable)
        +
        +
        指定者:
        +
        sqlMapSelectByExampleWithoutBLOBsElementGenerated 在接口中 org.mybatis.generator.api.Plugin
        +
        +
      • +
      + + + +
        +
      • +

        sqlMapSelectByExampleWithBLOBsElementGenerated

        +
        public boolean sqlMapSelectByExampleWithBLOBsElementGenerated(org.mybatis.generator.api.dom.xml.XmlElement element,
        +                                                              org.mybatis.generator.api.IntrospectedTable introspectedTable)
        +
        +
        指定者:
        +
        sqlMapSelectByExampleWithBLOBsElementGenerated 在接口中 org.mybatis.generator.api.Plugin
        +
        +
      • +
      + + + + +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/abstracts/class-use/AbstractWithLimitPlugin.html b/target/apidocs/com/iqudoo/framework/mybatis/abstracts/class-use/AbstractWithLimitPlugin.html new file mode 100644 index 0000000..9419614 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/abstracts/class-use/AbstractWithLimitPlugin.html @@ -0,0 +1,166 @@ + + + + + + +类 com.iqudoo.framework.mybatis.abstracts.AbstractWithLimitPlugin的使用 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

类的使用
com.iqudoo.framework.mybatis.abstracts.AbstractWithLimitPlugin

+
+
+ +
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-frame.html b/target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-frame.html new file mode 100644 index 0000000..5f17718 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-frame.html @@ -0,0 +1,21 @@ + + + + + + +com.iqudoo.framework.mybatis.abstracts (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + +

com.iqudoo.framework.mybatis.abstracts

+ + + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-summary.html b/target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-summary.html new file mode 100644 index 0000000..af2b9d7 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-summary.html @@ -0,0 +1,144 @@ + + + + + + +com.iqudoo.framework.mybatis.abstracts (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

程序包 com.iqudoo.framework.mybatis.abstracts

+
+
+ +
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-tree.html b/target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-tree.html new file mode 100644 index 0000000..72b0559 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-tree.html @@ -0,0 +1,143 @@ + + + + + + +com.iqudoo.framework.mybatis.abstracts 类分层结构 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

程序包com.iqudoo.framework.mybatis.abstracts的分层结构

+程序包分层结构: + +
+
+

类分层结构

+ +
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-use.html b/target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-use.html new file mode 100644 index 0000000..ee2afd0 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/abstracts/package-use.html @@ -0,0 +1,159 @@ + + + + + + +程序包 com.iqudoo.framework.mybatis.abstracts的使用 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

程序包的使用
com.iqudoo.framework.mybatis.abstracts

+
+
+ +
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/class-use/TapeMybatisGeneratorPlugin.html b/target/apidocs/com/iqudoo/framework/mybatis/class-use/TapeMybatisGeneratorPlugin.html new file mode 100644 index 0000000..3c6b20c --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/class-use/TapeMybatisGeneratorPlugin.html @@ -0,0 +1,126 @@ + + + + + + +类 com.iqudoo.framework.mybatis.TapeMybatisGeneratorPlugin的使用 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

类的使用
com.iqudoo.framework.mybatis.TapeMybatisGeneratorPlugin

+
+
没有com.iqudoo.framework.mybatis.TapeMybatisGeneratorPlugin的用法
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/class-use/TapeRepositoryGeneratorPlugin.html b/target/apidocs/com/iqudoo/framework/mybatis/class-use/TapeRepositoryGeneratorPlugin.html new file mode 100644 index 0000000..ae62b7e --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/class-use/TapeRepositoryGeneratorPlugin.html @@ -0,0 +1,126 @@ + + + + + + +类 com.iqudoo.framework.mybatis.TapeRepositoryGeneratorPlugin的使用 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

类的使用
com.iqudoo.framework.mybatis.TapeRepositoryGeneratorPlugin

+
+
没有com.iqudoo.framework.mybatis.TapeRepositoryGeneratorPlugin的用法
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/class-use/TapeRepoviewGeneratorPlugin.html b/target/apidocs/com/iqudoo/framework/mybatis/class-use/TapeRepoviewGeneratorPlugin.html new file mode 100644 index 0000000..954a92f --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/class-use/TapeRepoviewGeneratorPlugin.html @@ -0,0 +1,126 @@ + + + + + + +类 com.iqudoo.framework.mybatis.TapeRepoviewGeneratorPlugin的使用 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

类的使用
com.iqudoo.framework.mybatis.TapeRepoviewGeneratorPlugin

+
+
没有com.iqudoo.framework.mybatis.TapeRepoviewGeneratorPlugin的用法
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/hook/ISelectSelectivePluginHook.html b/target/apidocs/com/iqudoo/framework/mybatis/hook/ISelectSelectivePluginHook.html new file mode 100644 index 0000000..54602ab --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/hook/ISelectSelectivePluginHook.html @@ -0,0 +1,227 @@ + + + + + + +ISelectSelectivePluginHook (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + + +
+
com.iqudoo.framework.mybatis.hook
+

接口 ISelectSelectivePluginHook

+
+
+
+ +
+
+ +
+
+
    +
  • + +
      +
    • + + +

      方法详细资料

      + + + +
        +
      • +

        generateLimitElement

        +
        void generateLimitElement(org.mybatis.generator.api.dom.xml.XmlElement element)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/hook/class-use/ISelectSelectivePluginHook.html b/target/apidocs/com/iqudoo/framework/mybatis/hook/class-use/ISelectSelectivePluginHook.html new file mode 100644 index 0000000..12d4882 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/hook/class-use/ISelectSelectivePluginHook.html @@ -0,0 +1,188 @@ + + + + + + +接口 com.iqudoo.framework.mybatis.hook.ISelectSelectivePluginHook的使用 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

接口的使用
com.iqudoo.framework.mybatis.hook.ISelectSelectivePluginHook

+
+
+ +
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/hook/package-frame.html b/target/apidocs/com/iqudoo/framework/mybatis/hook/package-frame.html new file mode 100644 index 0000000..ed74118 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/hook/package-frame.html @@ -0,0 +1,21 @@ + + + + + + +com.iqudoo.framework.mybatis.hook (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + +

com.iqudoo.framework.mybatis.hook

+ + + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/hook/package-summary.html b/target/apidocs/com/iqudoo/framework/mybatis/hook/package-summary.html new file mode 100644 index 0000000..12200e5 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/hook/package-summary.html @@ -0,0 +1,144 @@ + + + + + + +com.iqudoo.framework.mybatis.hook (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

程序包 com.iqudoo.framework.mybatis.hook

+
+
+ +
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/hook/package-tree.html b/target/apidocs/com/iqudoo/framework/mybatis/hook/package-tree.html new file mode 100644 index 0000000..a8faf98 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/hook/package-tree.html @@ -0,0 +1,135 @@ + + + + + + +com.iqudoo.framework.mybatis.hook 类分层结构 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

程序包com.iqudoo.framework.mybatis.hook的分层结构

+程序包分层结构: + +
+
+

接口分层结构

+ +
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/hook/package-use.html b/target/apidocs/com/iqudoo/framework/mybatis/hook/package-use.html new file mode 100644 index 0000000..edb8378 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/hook/package-use.html @@ -0,0 +1,178 @@ + + + + + + +程序包 com.iqudoo.framework.mybatis.hook的使用 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

程序包的使用
com.iqudoo.framework.mybatis.hook

+
+
+ +
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/package-frame.html b/target/apidocs/com/iqudoo/framework/mybatis/package-frame.html new file mode 100644 index 0000000..af84265 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/package-frame.html @@ -0,0 +1,23 @@ + + + + + + +com.iqudoo.framework.mybatis (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + +

com.iqudoo.framework.mybatis

+ + + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/package-summary.html b/target/apidocs/com/iqudoo/framework/mybatis/package-summary.html new file mode 100644 index 0000000..041ffbc --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/package-summary.html @@ -0,0 +1,156 @@ + + + + + + +com.iqudoo.framework.mybatis (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

程序包 com.iqudoo.framework.mybatis

+
+
+ +
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/package-tree.html b/target/apidocs/com/iqudoo/framework/mybatis/package-tree.html new file mode 100644 index 0000000..a71701b --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/package-tree.html @@ -0,0 +1,149 @@ + + + + + + +com.iqudoo.framework.mybatis 类分层结构 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

程序包com.iqudoo.framework.mybatis的分层结构

+程序包分层结构: + +
+
+

类分层结构

+ +
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/package-use.html b/target/apidocs/com/iqudoo/framework/mybatis/package-use.html new file mode 100644 index 0000000..80da010 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/package-use.html @@ -0,0 +1,126 @@ + + + + + + +程序包 com.iqudoo.framework.mybatis的使用 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

程序包的使用
com.iqudoo.framework.mybatis

+
+
没有com.iqudoo.framework.mybatis的用法
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/utils/ElementTools.html b/target/apidocs/com/iqudoo/framework/mybatis/utils/ElementTools.html new file mode 100644 index 0000000..f6a8707 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/utils/ElementTools.html @@ -0,0 +1,463 @@ + + + + + + +ElementTools (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + + +
+
com.iqudoo.framework.mybatis.utils
+

类 ElementTools

+
+
+ +
+
    +
  • +
    +
    +
    public class ElementTools
    +extends Object
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      构造器概要

      + + + + + + + + +
      构造器 
      构造器和说明
      ElementTools() 
      +
    • +
    + +
      +
    • + + +

      方法概要

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      所有方法 静态方法 具体方法 
      限定符和类型方法和说明
      static org.mybatis.generator.api.dom.java.FieldgenerateField(String fieldName, + org.mybatis.generator.api.dom.java.JavaVisibility visibility, + org.mybatis.generator.api.dom.java.FullyQualifiedJavaType javaType, + String initString) +
      生成属性
      +
      static org.mybatis.generator.api.dom.java.MethodgenerateGetterMethod(org.mybatis.generator.api.dom.java.Field field) +
      生成Filed的Get方法
      +
      static org.mybatis.generator.api.dom.java.MethodgenerateMethod(String methodName, + org.mybatis.generator.api.dom.java.JavaVisibility visibility, + org.mybatis.generator.api.dom.java.FullyQualifiedJavaType returnType, + org.mybatis.generator.api.dom.java.Parameter... parameters) +
      生成方法
      +
      static org.mybatis.generator.api.dom.java.MethodgenerateMethodBody(org.mybatis.generator.api.dom.java.Method method, + String... bodyLines) +
      生成方法实现体
      +
      static org.mybatis.generator.api.dom.java.MethodgenerateSetterMethod(org.mybatis.generator.api.dom.java.Field field) +
      生成Filed的Set方法
      +
      static org.mybatis.generator.api.dom.java.FieldgenerateStaticFinalField(String fieldName, + org.mybatis.generator.api.dom.java.FullyQualifiedJavaType javaType, + String initString) +
      生成静态常量
      +
      static org.mybatis.generator.api.dom.java.FullyQualifiedJavaTypegetModelTypeWithBLOBs(org.mybatis.generator.api.IntrospectedTable introspectedTable) +
      获取Model有BLOBs类时的类型
      +
      static org.mybatis.generator.api.dom.java.FullyQualifiedJavaTypegetModelTypeWithoutBLOBs(org.mybatis.generator.api.IntrospectedTable introspectedTable) +
      获取Model没有BLOBs类时的类型
      +
      + +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      构造器详细资料

      + + + +
        +
      • +

        ElementTools

        +
        public ElementTools()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      方法详细资料

      + + + +
        +
      • +

        generateStaticFinalField

        +
        public static org.mybatis.generator.api.dom.java.Field generateStaticFinalField(String fieldName,
        +                                                                                org.mybatis.generator.api.dom.java.FullyQualifiedJavaType javaType,
        +                                                                                String initString)
        +
        生成静态常量
        +
        +
        参数:
        +
        fieldName - 常量名称
        +
        javaType - 类型
        +
        initString - 初始化字段
        +
        返回:
        +
        Field
        +
        +
      • +
      + + + +
        +
      • +

        generateField

        +
        public static org.mybatis.generator.api.dom.java.Field generateField(String fieldName,
        +                                                                     org.mybatis.generator.api.dom.java.JavaVisibility visibility,
        +                                                                     org.mybatis.generator.api.dom.java.FullyQualifiedJavaType javaType,
        +                                                                     String initString)
        +
        生成属性
        +
        +
        参数:
        +
        fieldName - 常量名称
        +
        visibility - 可见性
        +
        javaType - 类型
        +
        initString - 初始化字段
        +
        返回:
        +
        Method
        +
        +
      • +
      + + + +
        +
      • +

        generateMethod

        +
        public static org.mybatis.generator.api.dom.java.Method generateMethod(String methodName,
        +                                                                       org.mybatis.generator.api.dom.java.JavaVisibility visibility,
        +                                                                       org.mybatis.generator.api.dom.java.FullyQualifiedJavaType returnType,
        +                                                                       org.mybatis.generator.api.dom.java.Parameter... parameters)
        +
        生成方法
        +
        +
        参数:
        +
        methodName - 方法名
        +
        visibility - 可见性
        +
        returnType - 返回值类型
        +
        parameters - 参数列表
        +
        返回:
        +
        Method
        +
        +
      • +
      + + + +
        +
      • +

        generateMethodBody

        +
        public static org.mybatis.generator.api.dom.java.Method generateMethodBody(org.mybatis.generator.api.dom.java.Method method,
        +                                                                           String... bodyLines)
        +
        生成方法实现体
        +
        +
        参数:
        +
        method - 方法
        +
        bodyLines - 方法实现行
        +
        返回:
        +
        Method
        +
        +
      • +
      + + + +
        +
      • +

        generateSetterMethod

        +
        public static org.mybatis.generator.api.dom.java.Method generateSetterMethod(org.mybatis.generator.api.dom.java.Field field)
        +
        生成Filed的Set方法
        +
        +
        参数:
        +
        field - field
        +
        返回:
        +
        Method
        +
        +
      • +
      + + + +
        +
      • +

        generateGetterMethod

        +
        public static org.mybatis.generator.api.dom.java.Method generateGetterMethod(org.mybatis.generator.api.dom.java.Field field)
        +
        生成Filed的Get方法
        +
        +
        参数:
        +
        field - field
        +
        返回:
        +
        Method
        +
        +
      • +
      + + + +
        +
      • +

        getModelTypeWithoutBLOBs

        +
        public static org.mybatis.generator.api.dom.java.FullyQualifiedJavaType getModelTypeWithoutBLOBs(org.mybatis.generator.api.IntrospectedTable introspectedTable)
        +
        获取Model没有BLOBs类时的类型
        +
        +
        参数:
        +
        introspectedTable - introspectedTable
        +
        返回:
        +
        FullyQualifiedJavaType
        +
        +
      • +
      + + + +
        +
      • +

        getModelTypeWithBLOBs

        +
        public static org.mybatis.generator.api.dom.java.FullyQualifiedJavaType getModelTypeWithBLOBs(org.mybatis.generator.api.IntrospectedTable introspectedTable)
        +
        获取Model有BLOBs类时的类型
        +
        +
        参数:
        +
        introspectedTable - introspectedTable
        +
        返回:
        +
        FullyQualifiedJavaType
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/utils/FormatTools.html b/target/apidocs/com/iqudoo/framework/mybatis/utils/FormatTools.html new file mode 100644 index 0000000..4b3ea1e --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/utils/FormatTools.html @@ -0,0 +1,446 @@ + + + + + + +FormatTools (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + + +
+
com.iqudoo.framework.mybatis.utils
+

类 FormatTools

+
+
+ +
+
    +
  • +
    +
    +
    public class FormatTools
    +extends Object
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      构造器概要

      + + + + + + + + +
      构造器 
      构造器和说明
      FormatTools() 
      +
    • +
    + +
      +
    • + + +

      方法概要

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      所有方法 静态方法 具体方法 
      限定符和类型方法和说明
      static voidaddElementWithBestPosition(org.mybatis.generator.api.dom.xml.XmlElement rootElement, + org.mybatis.generator.api.dom.xml.XmlElement element) +
      在最佳位置添加节点
      +
      static voidaddMethodWithBestPosition(org.mybatis.generator.api.dom.java.InnerClass innerClass, + org.mybatis.generator.api.dom.java.Method method) +
      在最佳位置添加方法
      +
      static voidaddMethodWithBestPosition(org.mybatis.generator.api.dom.java.InnerEnum innerEnum, + org.mybatis.generator.api.dom.java.Method method) +
      在最佳位置添加方法
      +
      static voidaddMethodWithBestPosition(org.mybatis.generator.api.dom.java.Interface anInterface, + org.mybatis.generator.api.dom.java.Method method) +
      在最佳位置添加方法
      +
      static voidaddMethodWithBestPosition(org.mybatis.generator.api.dom.java.TopLevelClass topLevelClass, + org.mybatis.generator.api.dom.java.Method method) +
      在最佳位置添加方法
      +
      static voidreplaceComment(org.mybatis.generator.api.CommentGenerator commentGenerator, + org.mybatis.generator.api.dom.xml.XmlElement element) +
      替换已有注释
      +
      static voidreplaceGeneralMethodComment(org.mybatis.generator.api.CommentGenerator commentGenerator, + org.mybatis.generator.api.dom.java.Method method, + org.mybatis.generator.api.IntrospectedTable introspectedTable) +
      替换已有方法注释
      +
      static StringupFirstChar(String str) +
      首字母大写
      +
      + +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      构造器详细资料

      + + + +
        +
      • +

        FormatTools

        +
        public FormatTools()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      方法详细资料

      + + + +
        +
      • +

        addMethodWithBestPosition

        +
        public static void addMethodWithBestPosition(org.mybatis.generator.api.dom.java.InnerClass innerClass,
        +                                             org.mybatis.generator.api.dom.java.Method method)
        +
        在最佳位置添加方法
        +
        +
        参数:
        +
        innerClass - innerClass
        +
        method - method
        +
        +
      • +
      + + + +
        +
      • +

        addMethodWithBestPosition

        +
        public static void addMethodWithBestPosition(org.mybatis.generator.api.dom.java.Interface anInterface,
        +                                             org.mybatis.generator.api.dom.java.Method method)
        +
        在最佳位置添加方法
        +
        +
        参数:
        +
        anInterface - anInterface
        +
        method - method
        +
        +
      • +
      + + + +
        +
      • +

        addMethodWithBestPosition

        +
        public static void addMethodWithBestPosition(org.mybatis.generator.api.dom.java.InnerEnum innerEnum,
        +                                             org.mybatis.generator.api.dom.java.Method method)
        +
        在最佳位置添加方法
        +
        +
        参数:
        +
        innerEnum - innerEnum
        +
        method - method
        +
        +
      • +
      + + + +
        +
      • +

        addMethodWithBestPosition

        +
        public static void addMethodWithBestPosition(org.mybatis.generator.api.dom.java.TopLevelClass topLevelClass,
        +                                             org.mybatis.generator.api.dom.java.Method method)
        +
        在最佳位置添加方法
        +
        +
        参数:
        +
        topLevelClass - topLevelClass
        +
        method - method
        +
        +
      • +
      + + + +
        +
      • +

        addElementWithBestPosition

        +
        public static void addElementWithBestPosition(org.mybatis.generator.api.dom.xml.XmlElement rootElement,
        +                                              org.mybatis.generator.api.dom.xml.XmlElement element)
        +
        在最佳位置添加节点
        +
        +
        参数:
        +
        rootElement - rootElement
        +
        element - element
        +
        +
      • +
      + + + +
        +
      • +

        replaceGeneralMethodComment

        +
        public static void replaceGeneralMethodComment(org.mybatis.generator.api.CommentGenerator commentGenerator,
        +                                               org.mybatis.generator.api.dom.java.Method method,
        +                                               org.mybatis.generator.api.IntrospectedTable introspectedTable)
        +
        替换已有方法注释
        +
        +
        参数:
        +
        commentGenerator - commentGenerator
        +
        method - method
        +
        introspectedTable - introspectedTable
        +
        +
      • +
      + + + +
        +
      • +

        replaceComment

        +
        public static void replaceComment(org.mybatis.generator.api.CommentGenerator commentGenerator,
        +                                  org.mybatis.generator.api.dom.xml.XmlElement element)
        +
        替换已有注释
        +
        +
        参数:
        +
        commentGenerator - commentGenerator
        +
        element - element
        +
        +
      • +
      + + + +
        +
      • +

        upFirstChar

        +
        public static String upFirstChar(String str)
        +
        首字母大写
        +
        +
        参数:
        +
        str - str
        +
        返回:
        +
        str
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/utils/class-use/ElementTools.html b/target/apidocs/com/iqudoo/framework/mybatis/utils/class-use/ElementTools.html new file mode 100644 index 0000000..1c6cf55 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/utils/class-use/ElementTools.html @@ -0,0 +1,126 @@ + + + + + + +类 com.iqudoo.framework.mybatis.utils.ElementTools的使用 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

类的使用
com.iqudoo.framework.mybatis.utils.ElementTools

+
+
没有com.iqudoo.framework.mybatis.utils.ElementTools的用法
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/utils/class-use/FormatTools.html b/target/apidocs/com/iqudoo/framework/mybatis/utils/class-use/FormatTools.html new file mode 100644 index 0000000..58427e4 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/utils/class-use/FormatTools.html @@ -0,0 +1,126 @@ + + + + + + +类 com.iqudoo.framework.mybatis.utils.FormatTools的使用 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

类的使用
com.iqudoo.framework.mybatis.utils.FormatTools

+
+
没有com.iqudoo.framework.mybatis.utils.FormatTools的用法
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/utils/package-frame.html b/target/apidocs/com/iqudoo/framework/mybatis/utils/package-frame.html new file mode 100644 index 0000000..2de7696 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/utils/package-frame.html @@ -0,0 +1,22 @@ + + + + + + +com.iqudoo.framework.mybatis.utils (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + +

com.iqudoo.framework.mybatis.utils

+ + + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/utils/package-summary.html b/target/apidocs/com/iqudoo/framework/mybatis/utils/package-summary.html new file mode 100644 index 0000000..ef1219e --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/utils/package-summary.html @@ -0,0 +1,148 @@ + + + + + + +com.iqudoo.framework.mybatis.utils (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

程序包 com.iqudoo.framework.mybatis.utils

+
+
+ +
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/utils/package-tree.html b/target/apidocs/com/iqudoo/framework/mybatis/utils/package-tree.html new file mode 100644 index 0000000..e1bd188 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/utils/package-tree.html @@ -0,0 +1,140 @@ + + + + + + +com.iqudoo.framework.mybatis.utils 类分层结构 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

程序包com.iqudoo.framework.mybatis.utils的分层结构

+程序包分层结构: + +
+
+

类分层结构

+ +
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/com/iqudoo/framework/mybatis/utils/package-use.html b/target/apidocs/com/iqudoo/framework/mybatis/utils/package-use.html new file mode 100644 index 0000000..2a2ef95 --- /dev/null +++ b/target/apidocs/com/iqudoo/framework/mybatis/utils/package-use.html @@ -0,0 +1,126 @@ + + + + + + +程序包 com.iqudoo.framework.mybatis.utils的使用 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + + + + +
+

程序包的使用
com.iqudoo.framework.mybatis.utils

+
+
没有com.iqudoo.framework.mybatis.utils的用法
+ + + + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/constant-values.html b/target/apidocs/constant-values.html new file mode 100644 index 0000000..3fdc965 --- /dev/null +++ b/target/apidocs/constant-values.html @@ -0,0 +1,126 @@ + + + + + + +常量字段值 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + +
+ + + + + + + +
+ + +
+

常量字段值

+

目录

+
+ +
+ + + + + + + +
+ + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/deprecated-list.html b/target/apidocs/deprecated-list.html new file mode 100644 index 0000000..2c89d2f --- /dev/null +++ b/target/apidocs/deprecated-list.html @@ -0,0 +1,126 @@ + + + + + + +已过时的列表 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + +
+ + + + + + + +
+ + +
+

已过时的 API

+

目录

+
+ +
+ + + + + + + +
+ + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/help-doc.html b/target/apidocs/help-doc.html new file mode 100644 index 0000000..fc92e47 --- /dev/null +++ b/target/apidocs/help-doc.html @@ -0,0 +1,231 @@ + + + + + + +API 帮助 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + +
+ + + + + + + +
+ + +
+

此 API 文档的组织方式

+
此 API (应用程序编程接口) 文档包含对应于导航栏中的项目的页面, 如下所述。
+
+
+
    +
  • +

    概览

    +

    概览 页面是此 API 文档的首页, 提供了所有程序包的列表及其概要。此页面也可能包含这些程序包的总体说明。

    +
  • +
  • +

    程序包

    +

    每个程序包都有一个页面, 其中包含它的类和接口的列表及其概要。此页面可以包含六个类别:

    +
      +
    • 接口 (斜体)
    • +
    • +
    • 枚举
    • +
    • 异常错误
    • +
    • 错误
    • +
    • 注释类型
    • +
    +
  • +
  • +

    类/接口

    +

    每个类, 接口, 嵌套类和嵌套接口都有各自的页面。其中每个页面都由三部分 (类/接口说明, 概要表, 以及详细的成员说明) 组成:

    +
      +
    • 类继承图
    • +
    • 直接子类
    • +
    • 所有已知子接口
    • +
    • 所有已知实现类
    • +
    • 类/接口声明
    • +
    • 类/接口说明
    • +
    +
      +
    • 嵌套类概要
    • +
    • 字段概要
    • +
    • 构造器概要
    • +
    • 方法概要
    • +
    +
      +
    • 字段详细资料
    • +
    • 构造器详细资料
    • +
    • 方法详细资料
    • +
    +

    每个概要条目都包含该项目的详细说明的第一句。概要条目按字母顺序排列, 而详细说明则按其在源代码中出现的顺序排列。这样保持了程序员所建立的逻辑分组。

    +
  • +
  • +

    注释类型

    +

    每个注释类型都有各自的页面, 其中包含以下部分:

    +
      +
    • 注释类型声明
    • +
    • 注释类型说明
    • +
    • 必需元素概要
    • +
    • 可选元素概要
    • +
    • 元素详细资料
    • +
    +
  • +
  • +

    枚举

    +

    每个枚举都有各自的页面, 其中包含以下部分:

    +
      +
    • 枚举声明
    • +
    • 枚举说明
    • +
    • 枚举常量概要
    • +
    • 枚举常量详细资料
    • +
    +
  • +
  • +

    使用

    +

    每个已文档化的程序包, 类和接口都有各自的“使用”页面。此页面介绍了使用给定类或程序包的任何部分的程序包, 类, 方法, 构造器和字段。对于给定的类或接口 A, 其“使用”页面包含 A 的子类, 声明为 A 的字段, 返回 A 的方法, 以及带有类型为 A 的参数的方法和构造器。访问此页面的方法是: 首先转至程序包, 类或接口, 然后单击导航栏中的 "使用" 链接。

    +
  • +
  • +

    树 (类分层结构)

    +

    对于所有程序包, 有一个类分层结构页面, 以及每个程序包的分层结构。每个分层结构页面都包含类的列表和接口的列表。从java.lang.Object开始, 按继承结构对类进行排列。接口不从java.lang.Object继承。

    +
      +
    • 查看“概览”页面时, 单击 "树" 将显示所有程序包的分层结构。
    • +
    • 查看特定程序包, 类或接口页面时, 单击 "树" 将仅显示该程序包的分层结构。
    • +
    +
  • +
  • +

    已过时的 API

    +

    已过时的 API 页面列出了所有已过时的 API。一般由于进行了改进并且通常提供了替代的 API, 所以建议不要使用已过时的 API。在将来的实现过程中, 可能会删除已过时的 API。

    +
  • +
  • +

    索引

    +

    索引 包含按字母顺序排列的所有类, 接口, 构造器, 方法和字段的列表。

    +
  • +
  • +

    上一个/下一个

    +

    这些链接使您可以转至下一个或上一个类, 接口, 程序包或相关页面。

    +
  • +
  • +

    框架/无框架

    +

    这些链接用于显示和隐藏 HTML 框架。所有页面均具有有框架和无框架两种显示方式。

    +
  • +
  • +

    所有类

    +

    所有类链接显示所有类和接口 (除了非静态嵌套类型)。

    +
  • +
  • +

    序列化表格

    +

    每个可序列化或可外部化的类都有其序列化字段和方法的说明。此信息对重新实现者有用, 而对使用 API 的开发者则没有什么用处。尽管导航栏中没有链接, 但您可以通过下列方式获取此信息: 转至任何序列化类, 然后单击类说明的 "另请参阅" 部分中的 "序列化表格"。

    +
  • +
  • +

    常量字段值

    +

    常量字段值页面列出了静态最终字段及其值。

    +
  • +
+此帮助文件适用于使用标准 doclet 生成的 API 文档。
+ +
+ + + + + + + +
+ + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/index-all.html b/target/apidocs/index-all.html new file mode 100644 index 0000000..08b0687 --- /dev/null +++ b/target/apidocs/index-all.html @@ -0,0 +1,337 @@ + + + + + + +索引 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + +
+ + + + + + + +
+ + +
A C E F G I M R S T U V  + + +

A

+
+
AbstractWithLimitPlugin - com.iqudoo.framework.mybatis.abstracts中的类
+
 
+
AbstractWithLimitPlugin() - 类 的构造器com.iqudoo.framework.mybatis.abstracts.AbstractWithLimitPlugin
+
 
+
addElementWithBestPosition(XmlElement, XmlElement) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.FormatTools
+
+
在最佳位置添加节点
+
+
addMethodWithBestPosition(InnerClass, Method) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.FormatTools
+
+
在最佳位置添加方法
+
+
addMethodWithBestPosition(Interface, Method) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.FormatTools
+
+
在最佳位置添加方法
+
+
addMethodWithBestPosition(InnerEnum, Method) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.FormatTools
+
+
在最佳位置添加方法
+
+
addMethodWithBestPosition(TopLevelClass, Method) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.FormatTools
+
+
在最佳位置添加方法
+
+
+ + + +

C

+
+
clientGenerated(Interface, IntrospectedTable) - 类 中的方法com.iqudoo.framework.mybatis.TapeMybatisGeneratorPlugin
+
 
+
com.iqudoo.framework.mybatis - 程序包 com.iqudoo.framework.mybatis
+
 
+
com.iqudoo.framework.mybatis.abstracts - 程序包 com.iqudoo.framework.mybatis.abstracts
+
 
+
com.iqudoo.framework.mybatis.hook - 程序包 com.iqudoo.framework.mybatis.hook
+
 
+
com.iqudoo.framework.mybatis.utils - 程序包 com.iqudoo.framework.mybatis.utils
+
 
+
contextGenerateAdditionalJavaFiles(IntrospectedTable) - 类 中的方法com.iqudoo.framework.mybatis.TapeRepositoryGeneratorPlugin
+
+
核心方法:视图表过滤 + 生成完整Repository代码
+
+
contextGenerateAdditionalJavaFiles(IntrospectedTable) - 类 中的方法com.iqudoo.framework.mybatis.TapeRepoviewGeneratorPlugin
+
+
核心方法:仅为视图表生成 RepoView 代码
+
+
+ + + +

E

+
+
ElementTools - com.iqudoo.framework.mybatis.utils中的类
+
 
+
ElementTools() - 类 的构造器com.iqudoo.framework.mybatis.utils.ElementTools
+
 
+
+ + + +

F

+
+
FormatTools - com.iqudoo.framework.mybatis.utils中的类
+
 
+
FormatTools() - 类 的构造器com.iqudoo.framework.mybatis.utils.FormatTools
+
 
+
+ + + +

G

+
+
generateField(String, JavaVisibility, FullyQualifiedJavaType, String) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.ElementTools
+
+
生成属性
+
+
generateGetterMethod(Field) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.ElementTools
+
+
生成Filed的Get方法
+
+
generateLimitElement(XmlElement) - 类 中的方法com.iqudoo.framework.mybatis.abstracts.AbstractWithLimitPlugin
+
 
+
generateLimitElement(XmlElement) - 接口 中的方法com.iqudoo.framework.mybatis.hook.ISelectSelectivePluginHook
+
 
+
generateMethod(String, JavaVisibility, FullyQualifiedJavaType, Parameter...) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.ElementTools
+
+
生成方法
+
+
generateMethodBody(Method, String...) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.ElementTools
+
+
生成方法实现体
+
+
generateSetterMethod(Field) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.ElementTools
+
+
生成Filed的Set方法
+
+
generateStaticFinalField(String, FullyQualifiedJavaType, String) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.ElementTools
+
+
生成静态常量
+
+
getModelTypeWithBLOBs(IntrospectedTable) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.ElementTools
+
+
获取Model有BLOBs类时的类型
+
+
getModelTypeWithoutBLOBs(IntrospectedTable) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.ElementTools
+
+
获取Model没有BLOBs类时的类型
+
+
+ + + +

I

+
+
initialized(IntrospectedTable) - 类 中的方法com.iqudoo.framework.mybatis.abstracts.AbstractWithLimitPlugin
+
 
+
ISelectSelectivePluginHook - com.iqudoo.framework.mybatis.hook中的接口
+
 
+
+ + + +

M

+
+
modelExampleClassGenerated(TopLevelClass, IntrospectedTable) - 类 中的方法com.iqudoo.framework.mybatis.abstracts.AbstractWithLimitPlugin
+
 
+
+ + + +

R

+
+
replaceComment(CommentGenerator, XmlElement) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.FormatTools
+
+
替换已有注释
+
+
replaceGeneralMethodComment(CommentGenerator, Method, IntrospectedTable) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.FormatTools
+
+
替换已有方法注释
+
+
+ + + +

S

+
+
setContext(Context) - 类 中的方法com.iqudoo.framework.mybatis.TapeRepositoryGeneratorPlugin
+
 
+
setContext(Context) - 类 中的方法com.iqudoo.framework.mybatis.TapeRepoviewGeneratorPlugin
+
 
+
setProperties(Properties) - 类 中的方法com.iqudoo.framework.mybatis.TapeRepositoryGeneratorPlugin
+
 
+
setProperties(Properties) - 类 中的方法com.iqudoo.framework.mybatis.TapeRepoviewGeneratorPlugin
+
 
+
sqlMapDocumentGenerated(Document, IntrospectedTable) - 类 中的方法com.iqudoo.framework.mybatis.TapeMybatisGeneratorPlugin
+
 
+
sqlMapSelectAllElementGenerated(XmlElement, IntrospectedTable) - 类 中的方法com.iqudoo.framework.mybatis.abstracts.AbstractWithLimitPlugin
+
 
+
sqlMapSelectByExampleWithBLOBsElementGenerated(XmlElement, IntrospectedTable) - 类 中的方法com.iqudoo.framework.mybatis.abstracts.AbstractWithLimitPlugin
+
 
+
sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement, IntrospectedTable) - 类 中的方法com.iqudoo.framework.mybatis.abstracts.AbstractWithLimitPlugin
+
 
+
+ + + +

T

+
+
TapeMybatisGeneratorPlugin - com.iqudoo.framework.mybatis中的类
+
 
+
TapeMybatisGeneratorPlugin() - 类 的构造器com.iqudoo.framework.mybatis.TapeMybatisGeneratorPlugin
+
 
+
TapeRepositoryGeneratorPlugin - com.iqudoo.framework.mybatis中的类
+
+
MyBatis Generator 1.4.1
+
+
TapeRepositoryGeneratorPlugin() - 类 的构造器com.iqudoo.framework.mybatis.TapeRepositoryGeneratorPlugin
+
 
+
TapeRepoviewGeneratorPlugin - com.iqudoo.framework.mybatis中的类
+
+
MyBatis Generator 1.4.1 适配版:视图表专用 RepoView 生成插件
+
+
TapeRepoviewGeneratorPlugin() - 类 的构造器com.iqudoo.framework.mybatis.TapeRepoviewGeneratorPlugin
+
 
+
+ + + +

U

+
+
upFirstChar(String) - 类 中的静态方法com.iqudoo.framework.mybatis.utils.FormatTools
+
+
首字母大写
+
+
+ + + +

V

+
+
validate(List<String>) - 类 中的方法com.iqudoo.framework.mybatis.abstracts.AbstractWithLimitPlugin
+
 
+
validate(List<String>) - 类 中的方法com.iqudoo.framework.mybatis.TapeRepositoryGeneratorPlugin
+
 
+
validate(List<String>) - 类 中的方法com.iqudoo.framework.mybatis.TapeRepoviewGeneratorPlugin
+
 
+
+A C E F G I M R S T U V 
+ +
+ + + + + + + +
+ + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/index.html b/target/apidocs/index.html new file mode 100644 index 0000000..fc20996 --- /dev/null +++ b/target/apidocs/index.html @@ -0,0 +1,76 @@ + + + + + + +tape-mybatis-generator-plugin 1.0-SNAPSHOT API + + + + + + + + + +<noscript> +<div>您的浏览器已禁用 JavaScript。</div> +</noscript> +<h2>框架预警</h2> +<p>请使用框架功能查看此文档。如果看到此消息, 则表明您使用的是不支持框架的 Web 客户机。链接到<a href="overview-summary.html">非框架版本</a>。</p> + + + diff --git a/target/apidocs/overview-frame.html b/target/apidocs/overview-frame.html new file mode 100644 index 0000000..faf91c2 --- /dev/null +++ b/target/apidocs/overview-frame.html @@ -0,0 +1,25 @@ + + + + + + +概览列表 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + +

 

+ + diff --git a/target/apidocs/overview-summary.html b/target/apidocs/overview-summary.html new file mode 100644 index 0000000..8508f05 --- /dev/null +++ b/target/apidocs/overview-summary.html @@ -0,0 +1,152 @@ + + + + + + +概览 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + +
+ + + + + + + +
+ + +
+

tape-mybatis-generator-plugin 1.0-SNAPSHOT API

+
+ + +
+ + + + + + + +
+ + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/overview-tree.html b/target/apidocs/overview-tree.html new file mode 100644 index 0000000..41bdb9c --- /dev/null +++ b/target/apidocs/overview-tree.html @@ -0,0 +1,158 @@ + + + + + + +类分层结构 (tape-mybatis-generator-plugin 1.0-SNAPSHOT API) + + + + + + + + +
+ + + + + + + +
+ + + +
+

类分层结构

+ +

接口分层结构

+ +
+ +
+ + + + + + + +
+ + +

Copyright © 2026. All rights reserved.

+ + diff --git a/target/apidocs/package-list b/target/apidocs/package-list new file mode 100644 index 0000000..68387df --- /dev/null +++ b/target/apidocs/package-list @@ -0,0 +1,4 @@ +com.iqudoo.framework.mybatis +com.iqudoo.framework.mybatis.abstracts +com.iqudoo.framework.mybatis.hook +com.iqudoo.framework.mybatis.utils diff --git a/target/apidocs/script.js b/target/apidocs/script.js new file mode 100644 index 0000000..b346356 --- /dev/null +++ b/target/apidocs/script.js @@ -0,0 +1,30 @@ +function show(type) +{ + count = 0; + for (var key in methods) { + var row = document.getElementById(key); + if ((methods[key] & type) != 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) +{ + for (var value in tabs) { + var sNode = document.getElementById(tabs[value][0]); + var spanNode = sNode.firstChild; + if (value == type) { + sNode.className = activeTableTab; + spanNode.innerHTML = tabs[value][1]; + } + else { + sNode.className = tableTab; + spanNode.innerHTML = "" + tabs[value][1] + ""; + } + } +} diff --git a/target/apidocs/stylesheet.css b/target/apidocs/stylesheet.css new file mode 100644 index 0000000..98055b2 --- /dev/null +++ b/target/apidocs/stylesheet.css @@ -0,0 +1,574 @@ +/* Javadoc style sheet */ +/* +Overall document style +*/ + +@import url('resources/fonts/dejavu.css'); + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a:hover, a:focus { + text-decoration:none; + color:#bb7a2a; +} +a:active { + text-decoration:none; + color:#4A6782; +} +a[name] { + color:#353833; +} +a[name]:hover { + text-decoration:none; + color:#353833; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; + font-style:italic; +} +h4 { + font-size:13px; +} +h5 { + font-size:12px; +} +h6 { + font-size:11px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +table tr td dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +/* +Document title and Copyright styles +*/ +.clear { + clear:both; + height:0px; + overflow:hidden; +} +.aboutLanguage { + float:right; + padding:0px 21px; + font-size:11px; + z-index:200; + margin-top:-9px; +} +.legalCopy { + margin-left:.5em; +} +.bar a, .bar a:link, .bar a:visited, .bar a:active { + color:#FFFFFF; + text-decoration:none; +} +.bar a:hover, .bar a:focus { + color:#bb7a2a; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* +Navigation bar styles +*/ +.bar { + background-color:#4D7A97; + color:#FFFFFF; + padding:.8em .5em .4em .8em; + height:auto;/*height:1.8em;*/ + font-size:11px; + margin:0; +} +.topNav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.bottomNav { + margin-top:10px; + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.subNav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.subNav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +ul.navList, ul.subNavList { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.navList li{ + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +ul.subNavList li{ + list-style:none; + float:left; +} +.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.topNav a:hover, .bottomNav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.navBarCell1Rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skipNav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* +Page header and footer styles +*/ +.header, .footer { + clear:both; + margin:0 20px; + padding:5px 0 0 0; +} +.indexHeader { + margin:10px; + position:relative; +} +.indexHeader span{ + margin-right:15px; +} +.indexHeader h1 { + font-size:13px; +} +.title { + color:#2c4557; + margin:10px 0; +} +.subTitle { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.footer ul { + margin:20px 0 5px 0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* +Heading styles +*/ +div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList li.blockList h3 { + padding:0; + margin:15px 0; +} +ul.blockList li.blockList h2 { + padding:0px 0 20px 0; +} +/* +Page layout container styles +*/ +.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { + clear:both; + padding:10px 20px; + position:relative; +} +.indexContainer { + margin:10px; + position:relative; + font-size:12px; +} +.indexContainer h2 { + font-size:13px; + padding:0 0 3px 0; +} +.indexContainer ul { + margin:0; + padding:0; +} +.indexContainer ul li { + list-style:none; + padding-top:2px; +} +.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { + margin:5px 0 10px 0px; + font-size:14px; + font-family:'DejaVu Sans Mono',monospace; +} +.serializedFormContainer dl.nameValue dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +.serializedFormContainer dl.nameValue dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* +List styles +*/ +ul.horizontal li { + display:inline; + font-size:0.9em; +} +ul.inheritance { + margin:0; + padding:0; +} +ul.inheritance li { + display:inline; + list-style:none; +} +ul.inheritance li ul.inheritance { + margin-left:15px; + padding-left:15px; + padding-top:1px; +} +ul.blockList, ul.blockListLast { + margin:10px 0 10px 0; + padding:0; +} +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { + padding:0px 20px 5px 10px; + border:1px solid #ededed; + background-color:#f8f8f8; +} +ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { + margin-left:0; + padding-left:0; + padding-bottom:15px; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; + border-bottom:none; + padding-bottom:0; +} +table tr td dl, table tr td dl dt, table tr td dl dd { + margin-top:0; + margin-bottom:1px; +} +/* +Table styles +*/ +.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { + width:100%; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; +} +.overviewSummary, .memberSummary { + padding:0px; +} +.overviewSummary caption, .memberSummary caption, .typeSummary caption, +.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0px; + padding-top:10px; + padding-left:1px; + margin:0px; + white-space:pre; +} +.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, +.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, +.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, +.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, +.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, +.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, +.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, +.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { + color:#FFFFFF; +} +.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, +.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +.memberSummary caption span.activeTableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#F8981D; + height:16px; +} +.memberSummary caption span.tableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#4D7A97; + height:16px; +} +.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { + padding-top:0px; + padding-left:0px; + padding-right:0px; + background-image:none; + float:none; + display:inline; +} +.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, +.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { + display:none; + width:5px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .activeTableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .tableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + background-color:#4D7A97; + float:left; + +} +.overviewSummary td, .memberSummary td, .typeSummary td, +.useSummary td, .constantsSummary td, .deprecatedSummary td { + text-align:left; + padding:0px 0px 12px 10px; +} +th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, +td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ + vertical-align:top; + padding-right:0px; + padding-top:8px; + padding-bottom:3px; +} +th.colFirst, th.colLast, th.colOne, .constantsSummary th { + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} +td.colFirst, th.colFirst { + white-space:nowrap; + font-size:13px; +} +td.colLast, th.colLast { + font-size:13px; +} +td.colOne, th.colOne { + font-size:13px; +} +.overviewSummary td.colFirst, .overviewSummary th.colFirst, +.useSummary td.colFirst, .useSummary th.colFirst, +.overviewSummary td.colOne, .overviewSummary th.colOne, +.memberSummary td.colFirst, .memberSummary th.colFirst, +.memberSummary td.colOne, .memberSummary th.colOne, +.typeSummary td.colFirst{ + width:25%; + vertical-align:top; +} +td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { + font-weight:bold; +} +.tableSubHeadingColor { + background-color:#EEEEFF; +} +.altColor { + background-color:#FFFFFF; +} +.rowColor { + background-color:#EEEEEF; +} +/* +Content styles +*/ +.description pre { + margin-top:0; +} +.deprecatedContent { + margin:0; + padding:10px 0; +} +.docSummary { + padding:0; +} + +ul.blockList ul.blockList ul.blockList li.blockList h3 { + font-style:normal; +} + +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} + +td.colLast div { + padding-top:0px; +} + + +td.colLast a { + padding-bottom:3px; +} +/* +Formatting effect styles +*/ +.sourceLineNo { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:3px 10px 2px 0px; + color:#474747; +} +.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, +.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, +.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { + font-weight:bold; +} +.deprecationComment, .emphasizedPhrase, .interfaceName { + font-style:italic; +} + +div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, +div.block div.block span.interfaceName { + font-style:normal; +} + +div.contentContainer ul.blockList li.blockList h2{ + padding-bottom:0px; +} diff --git a/target/classes/com/iqudoo/framework/mybatis/TapeMybatisGeneratorPlugin.class b/target/classes/com/iqudoo/framework/mybatis/TapeMybatisGeneratorPlugin.class new file mode 100644 index 0000000000000000000000000000000000000000..c80c95efa90557a4b9d5d941cb524419c499ba2b GIT binary patch literal 4613 zcmbtX`*#z^75>JSwL+|c2nbP{hcG1g1tKBfVA&3~1Bnyc7~2>`)6kVPwg*4Uz~rjL}ip^wm34sn~N=k%xMf9mO--PPI#TN0^#&S++5=FXk(yRZ4r ze?R&dz+?DV98G9e5K+;BD8oSBET+YRTQJS^tfdwC1=Bj8E|zneBkZ)6vmHyzJ9c_7 z=$#VI{HQ1jXF_-9guxK)6NYdG7@FHVX5xrpgMzq;GyC7yS9VOq=SoMFoxccwLq+DX@NM3FxAw|9)*fsEa&wr4hA6E-W@qT((j7!H4C zNer>E?9kx!$kYLb%>SX0#Alm|?YNs^8(nn55=G4_Kg-L*rtTIEn;}70KBv8)rCmqp z=}}=jnT@yyNd@<+_#EzI*tB|@A!3V51Qro6B9}g(;z6WnOb0M*ZyyN+>Y6c^KAt;A zm}eBUF?2Tuh_6~4JF#2ELwJ}WNs^Dbx?VovYPy&eyzmTZJY6o;rK~{K=BdB-_Dme@ z=upt9qDvlBgR(l32uMOp&&ILwC3C*HwdYL_8QFA zIWFVd{v#?L1=+|ZI{WBFtyt2zkIJ?xs~!ncjwOsa@3IG_A0Co4`K+&;@0d~WI77$! zG=*A?acABv#L!FR*jy)ymrZM^9H!S!a_~%DDq}H&d89JS5c52xs^O}Fz-;j^26CU z@hQW>tcp1~zx}q5CRZpBb4&76RA}7gE#C;i&=j{%K5U2ui&c$tX3*o(H8QbaO8SS>kba9O%9Jmt-%a^=+S7gsHO*;mj5 zjqrL?#kb@IV~*(~q2SvDTJ2yi4PcsIbOK9`<1Lvj=J8z>-^2HbcnSl-979hd<|Ko+ zBa6FWn->tS;)e=;q~gc;35ls$eokv8KIWIALDVpYsv8^SEl-E; z>S^>2ex~5(D&EB}7&_~N^rV>&N(PzdCrz^one?(+1#8vUSDY`)@n5O1#gwWpA%SnNaCBO3atFu~&g*CuBx!Vhf z)q;Wq2epAOI7&qW)n$|bYUmf95M)h?x>JspKToC*ARa4(7S~-zkTmbm5a>-6+%tS( zP+fd`;-G?cd7ZC$JyvdUBZm9dEjy&sYUMPb;>(t+R6FV5*sg9a&;{GOlf}IuY8vhV`dLzlm-U_;x z(4M8$`xo(8Z_5&TvWdfs$n-{&(MSb-$>Lnxx?~$>AQLSN9^GzfL+ddwLIH3-uF-V=HNYH$Clk;9mOQL+`*Y+>iZu0EdvmFxoJVU6{sh zs_z~`9uLE&Rb_N|cYfNxS8!*#A>PMz50lII1O7-Tb>Srbgg?`{`!RtJs23rr{kTEB z7Lxra{(`>}j(;P4B4|=uX*Y$e0J%45O^jwfZ5X-SxCC}3lojyah{R8VH=j+MTZAsb zTS76LFeR1?6*$58VzOn`_);?BkC*ULb`f7nyi&mxBIQcrRcc7;YqI|hYAX0=^b+o#|gGcED^;2#wm}GNgu9|kWWzoS*(OGB;;Luh?_*n z5xjwqs28CVUL`_q64)njiB4T2Laq_zf2VKC3Tm4050cb`kMU3Xjg#C>blxXNlK%s? CVq_x# literal 0 HcmV?d00001 diff --git a/target/classes/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.class b/target/classes/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.class new file mode 100644 index 0000000000000000000000000000000000000000..8be11ececf4cf2dbf9e2cedf2af993298d161130 GIT binary patch literal 29070 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 z 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 E58PNc4gdfE literal 0 HcmV?d00001 diff --git a/target/classes/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.class b/target/classes/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.class new file mode 100644 index 0000000000000000000000000000000000000000..a6e98156b9aff9b9b9eff7a1b718a3ed629377d5 GIT binary patch literal 12808 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/iqudoo/framework/mybatis/abstracts/AbstractWithLimitPlugin.class b/target/classes/com/iqudoo/framework/mybatis/abstracts/AbstractWithLimitPlugin.class new file mode 100644 index 0000000000000000000000000000000000000000..5c0904a4b6d5bfb25e08a69119bc75a5f18d2af5 GIT binary patch literal 7907 zcmbVR33yyp75?vJc`uXKHkoXFX`xdoZIa2-7Gz1mzfdMS|N~CQQ4UX6?qE08uFnDtmuh`>&#OJd!y01zF079oED93OTq@b z<5n!#W5w$l-PZA@wY9|zo0hYOKwjJm#;mqrzab!+C66;T%tC=czTDLehRoBAUV+6G zEt50c9I;~2_<+%48ND6B?vT+?+3AH3MGA^Fl%Q1L$jPaDd4yAf+kLph3$F#p_mwjIa^0I-=1~ zTwsQ)t;QPD2vIfet7x&WFBFXQ*R@+QGt%Gie=wK{$;2AcFn<5c^h5Gbb*M&-f?5rA zSWHFF;BGpi11-jOBeXIUj8h9A^r}rp+-i%)=}4jxfh`&FoTf(^*^JA&bgv81sp0rExvfo+n~E-hoRD;F z()(=I@LB14a@#gGwKT7kN`I1ulcj4`=mVweQxFuW&OrU!g7T%|4SBHzJ@P%{EwyEI z;>-=$K4G7Rer&a00Q-S7obwCpn?Ox7x%zc!UNs|;Pr~x%Otwo(iZ+yiVBOnQaEd^| zSOZcK5-7B`n(QtOge`=eXqf{x>WLHZ zDI*RtR}=Vbfo3ye`Fq;j1EjLN!UY?R4U%Z1Luq`TBXC%{{3;S`*No+?(qA>YEm=8N zpfpuuk}PrVe7-I+`bmiVLV-rJ&tH+UepD7|42&6ew2@-3^q-;Pi+rR~w6S(nNZj)h z2AMlme3>Co>Ka!w>YU@)c!9A;BlTApRJj~GdU2V+>G`Jn5>J?nfa+SzxYdx4tMDBKS8KQi*U~512AZ6v!kTo6GKi

aUxuY?3OcrnHTnUc82n&W2pO zlmdrmqH8i4v}AJalG&`kJ<7WKa;bQSDO!RLdvgVU5m+{5c)K+k-B#D^n1l0WKJ3&8 zj^Px2)vDEN8aK9doZQ~gcwEQHZH;SJbDNb>J14g~gP}nqi**jcYhD@cHJH{&o9Bbr zZN%)703lkUJ;6|CFlNeAxP#g9Wf3^KWlHv@Eo3y%{cdOBpf_l7?;=-?lFqrIauXQ~ z(Tg*%asrysIlAj~&KL{3+$|WhcG>t~Xa%>2!ZbD)XKK3jFXUw+!)`7u$!g@reHmp`MN8FywS4cxZ8{ymi-RP%Awn24a4gwfee#aof~H~Q#(>y3th#K)-uejL zBK%XnHRH5W5lnLr&tS`m^gs~{1S&Ehc5h5EoYEMd;c0Xw{Y~XDOUyo7lC4pzm2p$@ zF(@_roI4mhQIwoWUG8m<4#s*|iwn{D%$=mpTPtOpJ)gB>4+P%jw;b<5WBadk+8+Fk z|5#6ETjdz*)BOIOy(8@PtPoX=KvZSl1?4t-{rmjN7z8X8XS1C854I$l9Q`Lg;IF{H z@Nce=D95lT*Lt#V<~IwHTJ8Xp+LWcvtV=2R`4Io%{C~N^L6svPapYr;c<>2ZEK&0- z(bsZBqUToyMlfRxlQX#;Fo#E)OV$oZ*)Bi1T|Sc%{_*1xSq^B9%GGnY*G0QfIE=DZ z-<;cVK#lL9T{yTtJD_I|Bj8(N4;>x%+?9BC*dSc1;$UlqV|HOBIKe3ncYLlKNsv{U!Tsr2)NE(p;KK zQ>K@>G+&i8UrW+lZqt+n^fJ;=h~KQAts=f z4lH9?t_giug&5Xh2aBs`appXhJ1@bpxQyk_E4k_#bmDpz5N}2o?!YGOW`XbloQQ{6 z6?}pS&!QVIpa-wQz*|In2V1$nNlRoM3Q^Vdqpu@Gw^_TM3k^KlWEmGqLi&!Ok{2qWo#ATEpeTg%~m1a7ncj2Eg!!F zqMWTFu|-shIcybEJ}2c?wFDXe(ppp23^O3bB4oSpE9&WJbwv&Dhb zh0VzN#M6#)1*(E-Ma)ygd_^3T_J^C4{rI~|Vch|XKcr(7GGTVSB9$o1_NQ7ERrJQn*=Vn3EK zHnZc&u^$jE&KR4O2^aeV(&g|>LwoRem+x02cxrw19z4_K`?YWH2!1<^7n2jM zd>ZVDSDXoUU+eO{F@oO@2T+ z-%Fi+j{m#)JpIE9Sc(^M6!y^4wEqD}TTC$k literal 0 HcmV?d00001 diff --git a/target/classes/com/iqudoo/framework/mybatis/utils/ElementTools.class b/target/classes/com/iqudoo/framework/mybatis/utils/ElementTools.class new file mode 100644 index 0000000000000000000000000000000000000000..b8122922b45455f0327e2d570aeacd07d9076a49 GIT binary patch literal 5214 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 + + + + + + + + src/main/javadoc + diff --git a/target/javadoc-bundle-options/package-list b/target/javadoc-bundle-options/package-list new file mode 100644 index 0000000..351c186 --- /dev/null +++ b/target/javadoc-bundle-options/package-list @@ -0,0 +1,217 @@ +java.applet +java.awt +java.awt.color +java.awt.datatransfer +java.awt.dnd +java.awt.event +java.awt.font +java.awt.geom +java.awt.im +java.awt.im.spi +java.awt.image +java.awt.image.renderable +java.awt.print +java.beans +java.beans.beancontext +java.io +java.lang +java.lang.annotation +java.lang.instrument +java.lang.invoke +java.lang.management +java.lang.ref +java.lang.reflect +java.math +java.net +java.nio +java.nio.channels +java.nio.channels.spi +java.nio.charset +java.nio.charset.spi +java.nio.file +java.nio.file.attribute +java.nio.file.spi +java.rmi +java.rmi.activation +java.rmi.dgc +java.rmi.registry +java.rmi.server +java.security +java.security.acl +java.security.cert +java.security.interfaces +java.security.spec +java.sql +java.text +java.text.spi +java.time +java.time.chrono +java.time.format +java.time.temporal +java.time.zone +java.util +java.util.concurrent +java.util.concurrent.atomic +java.util.concurrent.locks +java.util.function +java.util.jar +java.util.logging +java.util.prefs +java.util.regex +java.util.spi +java.util.stream +java.util.zip +javax.accessibility +javax.activation +javax.activity +javax.annotation +javax.annotation.processing +javax.crypto +javax.crypto.interfaces +javax.crypto.spec +javax.imageio +javax.imageio.event +javax.imageio.metadata +javax.imageio.plugins.bmp +javax.imageio.plugins.jpeg +javax.imageio.spi +javax.imageio.stream +javax.jws +javax.jws.soap +javax.lang.model +javax.lang.model.element +javax.lang.model.type +javax.lang.model.util +javax.management +javax.management.loading +javax.management.modelmbean +javax.management.monitor +javax.management.openmbean +javax.management.relation +javax.management.remote +javax.management.remote.rmi +javax.management.timer +javax.naming +javax.naming.directory +javax.naming.event +javax.naming.ldap +javax.naming.spi +javax.net +javax.net.ssl +javax.print +javax.print.attribute +javax.print.attribute.standard +javax.print.event +javax.rmi +javax.rmi.CORBA +javax.rmi.ssl +javax.script +javax.security.auth +javax.security.auth.callback +javax.security.auth.kerberos +javax.security.auth.login +javax.security.auth.spi +javax.security.auth.x500 +javax.security.cert +javax.security.sasl +javax.sound.midi +javax.sound.midi.spi +javax.sound.sampled +javax.sound.sampled.spi +javax.sql +javax.sql.rowset +javax.sql.rowset.serial +javax.sql.rowset.spi +javax.swing +javax.swing.border +javax.swing.colorchooser +javax.swing.event +javax.swing.filechooser +javax.swing.plaf +javax.swing.plaf.basic +javax.swing.plaf.metal +javax.swing.plaf.multi +javax.swing.plaf.nimbus +javax.swing.plaf.synth +javax.swing.table +javax.swing.text +javax.swing.text.html +javax.swing.text.html.parser +javax.swing.text.rtf +javax.swing.tree +javax.swing.undo +javax.tools +javax.transaction +javax.transaction.xa +javax.xml +javax.xml.bind +javax.xml.bind.annotation +javax.xml.bind.annotation.adapters +javax.xml.bind.attachment +javax.xml.bind.helpers +javax.xml.bind.util +javax.xml.crypto +javax.xml.crypto.dom +javax.xml.crypto.dsig +javax.xml.crypto.dsig.dom +javax.xml.crypto.dsig.keyinfo +javax.xml.crypto.dsig.spec +javax.xml.datatype +javax.xml.namespace +javax.xml.parsers +javax.xml.soap +javax.xml.stream +javax.xml.stream.events +javax.xml.stream.util +javax.xml.transform +javax.xml.transform.dom +javax.xml.transform.sax +javax.xml.transform.stax +javax.xml.transform.stream +javax.xml.validation +javax.xml.ws +javax.xml.ws.handler +javax.xml.ws.handler.soap +javax.xml.ws.http +javax.xml.ws.soap +javax.xml.ws.spi +javax.xml.ws.spi.http +javax.xml.ws.wsaddressing +javax.xml.xpath +org.ietf.jgss +org.omg.CORBA +org.omg.CORBA.DynAnyPackage +org.omg.CORBA.ORBPackage +org.omg.CORBA.TypeCodePackage +org.omg.CORBA.portable +org.omg.CORBA_2_3 +org.omg.CORBA_2_3.portable +org.omg.CosNaming +org.omg.CosNaming.NamingContextExtPackage +org.omg.CosNaming.NamingContextPackage +org.omg.Dynamic +org.omg.DynamicAny +org.omg.DynamicAny.DynAnyFactoryPackage +org.omg.DynamicAny.DynAnyPackage +org.omg.IOP +org.omg.IOP.CodecFactoryPackage +org.omg.IOP.CodecPackage +org.omg.Messaging +org.omg.PortableInterceptor +org.omg.PortableInterceptor.ORBInitInfoPackage +org.omg.PortableServer +org.omg.PortableServer.CurrentPackage +org.omg.PortableServer.POAManagerPackage +org.omg.PortableServer.POAPackage +org.omg.PortableServer.ServantLocatorPackage +org.omg.PortableServer.portable +org.omg.SendingContext +org.omg.stub.java.rmi +org.w3c.dom +org.w3c.dom.bootstrap +org.w3c.dom.events +org.w3c.dom.ls +org.w3c.dom.views +org.xml.sax +org.xml.sax.ext +org.xml.sax.helpers diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 0000000..ef0f385 --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,3 @@ +artifactId=tape-mybatis-generator-plugin +groupId=com.iqudoo.framework +version=1.0-SNAPSHOT diff --git a/target/maven-javadoc-plugin-stale-data.txt b/target/maven-javadoc-plugin-stale-data.txt new file mode 100644 index 0000000..bbb355b --- /dev/null +++ b/target/maven-javadoc-plugin-stale-data.txt @@ -0,0 +1,19 @@ +cmd.exe +/X +/C +""D:\Program Files\JetBrains\Jdks\corretto-1.8.0_352\bin\javadoc.exe" @options @argfile" +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\allclasses-frame.html = 1770145502546 +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\allclasses-noframe.html = 1770145502549 +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\argfile = 1770145498938 +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\constant-values.html = 1770145502237 +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\deprecated-list.html = 1770145502540 +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\help-doc.html = 1770145502562 +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\index-all.html = 1770145502527 +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\index.html = 1770145502553 +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\options = 1770145498936 +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\overview-frame.html = 1770145502029 +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\overview-summary.html = 1770145502557 +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\overview-tree.html = 1770145502449 +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\package-list = 1770145502025 +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\script.js = 1770145502744 +D:\gitea\tools\tape-mybatis-generator-plugin\target\apidocs\stylesheet.css = 1770145502740 \ No newline at end of file diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..7b9ddfe --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,7 @@ +D:\gitea\tools\tape-mybatis-generator-plugin\src\main\java\com\iqudoo\framework\mybatis\TapeRepoviewGeneratorPlugin.java +D:\gitea\tools\tape-mybatis-generator-plugin\src\main\java\com\iqudoo\framework\mybatis\TapeMybatisGeneratorPlugin.java +D:\gitea\tools\tape-mybatis-generator-plugin\src\main\java\com\iqudoo\framework\mybatis\utils\ElementTools.java +D:\gitea\tools\tape-mybatis-generator-plugin\src\main\java\com\iqudoo\framework\mybatis\utils\FormatTools.java +D:\gitea\tools\tape-mybatis-generator-plugin\src\main\java\com\iqudoo\framework\mybatis\abstracts\AbstractWithLimitPlugin.java +D:\gitea\tools\tape-mybatis-generator-plugin\src\main\java\com\iqudoo\framework\mybatis\TapeRepositoryGeneratorPlugin.java +D:\gitea\tools\tape-mybatis-generator-plugin\src\main\java\com\iqudoo\framework\mybatis\hook\ISelectSelectivePluginHook.java diff --git a/target/tape-mybatis-generator-plugin-1.0-SNAPSHOT-javadoc.jar b/target/tape-mybatis-generator-plugin-1.0-SNAPSHOT-javadoc.jar new file mode 100644 index 0000000000000000000000000000000000000000..ea3e625bf1ff4408d5a458b02b2696a9baa15561 GIT binary patch literal 82146 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%0D%8W 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 U_2oMduuTdW)HEjGYX|860Mz_E(*OVf literal 0 HcmV?d00001 diff --git a/target/tape-mybatis-generator-plugin-1.0-SNAPSHOT-sources.jar b/target/tape-mybatis-generator-plugin-1.0-SNAPSHOT-sources.jar new file mode 100644 index 0000000000000000000000000000000000000000..6912970292f7d083ff5bc5bfa4de8bc1f29547ff GIT binary patch literal 19311 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 vKp$adQ~a3<+N4Cb7F&gku-3j~ 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 Z8l~kV!N7kipuYWxy`3-+wEubce*l27z>xp| literal 0 HcmV?d00001