From 30b8498ef39fad66aa382cd5d9d6cb34229151b1 Mon Sep 17 00:00:00 2001 From: iqudoo Date: Fri, 3 Jul 2026 11:33:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=95=B0=E6=8D=AE=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=BF=BD=E7=95=A5=E4=B9=90=E8=A7=82=E9=94=81=EF=BC=8C?= =?UTF-8?q?=E9=80=82=E7=94=A8=E4=BA=8E=E4=B8=8D=E9=9C=80=E8=A6=81=E9=94=81?= =?UTF-8?q?=E7=9A=84=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + ...-mybatis-generator-plugin-1.0-SNAPSHOT.jar | Bin 41182 -> 41584 bytes .../TapeTableRepositoryGeneratorPlugin.java | 75 +++++++++++++++++- 3 files changed, 75 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a417e32..75fcd63 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ | `insert(Model)` → `Model` | 插入并返回带 GUID 的记录 | | `batchInsert(List)` → `List` | 批量插入并返回记录列表 | | `update(Model)` → `int` | 按主键更新(支持乐观锁) | +| `updateIgnoreLock(Model)` → `int` | 按主键更新(忽略乐观锁) | | `updateByExampleSelective(Model, Example)` → `int` | 按条件选择性更新 | ### TapeViewRepositoryGeneratorPlugin diff --git a/releases/tape-mybatis-generator-plugin-1.0-SNAPSHOT.jar b/releases/tape-mybatis-generator-plugin-1.0-SNAPSHOT.jar index d12002582ab0434a19144bff526e9d271ce6855a..28589ed773554f67cdcd945e43564c79d005eaf8 100644 GIT binary patch delta 16768 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 delta 16379 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 diff --git a/src/main/java/com/iqudoo/framework/mybatis/TapeTableRepositoryGeneratorPlugin.java b/src/main/java/com/iqudoo/framework/mybatis/TapeTableRepositoryGeneratorPlugin.java index f118f1e..840efcd 100644 --- a/src/main/java/com/iqudoo/framework/mybatis/TapeTableRepositoryGeneratorPlugin.java +++ b/src/main/java/com/iqudoo/framework/mybatis/TapeTableRepositoryGeneratorPlugin.java @@ -335,7 +335,16 @@ public class TapeTableRepositoryGeneratorPlugin extends PluginAdapter { updateMethod.setAbstract(true); repositoryInterface.addMethod(updateMethod); - // 15. updateByExampleSelective + // 15. updateIgnoreLock + Method updateIgnoreLockMethod = new Method("updateIgnoreLock"); + updateIgnoreLockMethod.setVisibility(JavaVisibility.PUBLIC); + updateIgnoreLockMethod.setReturnType(new FullyQualifiedJavaType("int")); + updateIgnoreLockMethod.addParameter(new Parameter(new FullyQualifiedJavaType(modelClassName), "record")); + updateIgnoreLockMethod.addException(new FullyQualifiedJavaType("Throwable")); + updateIgnoreLockMethod.setAbstract(true); + repositoryInterface.addMethod(updateIgnoreLockMethod); + + // 16. updateByExampleSelective Method updateByExampleSelectiveMethod = new Method("updateByExampleSelective"); updateByExampleSelectiveMethod.setVisibility(JavaVisibility.PUBLIC); updateByExampleSelectiveMethod.setReturnType(new FullyQualifiedJavaType("int")); @@ -393,6 +402,7 @@ public class TapeTableRepositoryGeneratorPlugin extends PluginAdapter { generateInsertMethod(implClass, tableName, introspectedTable, modelClassName, mapperFieldName); generateBatchInsertMethod(implClass, tableName, introspectedTable, modelClassName, mapperFieldName); generateUpdateMethod(implClass, tableName, introspectedTable, modelClassName, exampleClassName, mapperFieldName, hasBLOBColumns); + generateUpdateIgnoreLockMethod(implClass, tableName, introspectedTable, modelClassName, exampleClassName, mapperFieldName, hasBLOBColumns); generateUpdateByExampleSelectiveMethod(implClass, tableName, introspectedTable, modelClassName, exampleClassName, mapperFieldName, hasBLOBColumns); generateDeleteByIdMethod(implClass, tableName, introspectedTable, modelClassName, exampleClassName, mapperFieldName); generateDeleteAllMethod(implClass, tableName, introspectedTable, modelClassName, exampleClassName, mapperFieldName); @@ -742,6 +752,69 @@ public class TapeTableRepositoryGeneratorPlugin extends PluginAdapter { implClass.addMethod(method); } + private void generateUpdateIgnoreLockMethod(TopLevelClass implClass, String tableName, IntrospectedTable introspectedTable, String modelClassName, String exampleClassName, + String mapperFieldName, boolean hasBLOBColumns) { + Method method = new Method("updateIgnoreLock"); + 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"); + method.addBodyLine(" = " + mapperFieldName + ".selectByPrimaryKey(record.getGuid());"); + method.addBodyLine("if (aDo == null || aDo.getIsDelete() == 1) {"); + method.addBodyLine("throw new Throwable(\"Record not found, " + modelClassName + " GUID:\" + record.getGuid());"); + method.addBodyLine("}"); + if (isChangeLogEnable(introspectedTable)) { + method.addBodyLine("Map changeDiff = new HashMap<>();"); + } + 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) {"); + if (isChangeLogEnable(introspectedTable)) { + method.addBodyLine("if (!Objects.equals(record." + getterMethod + "(), aDo." + getterMethod + "())) {"); + method.addBodyLine("changeDiff.put(\"" + fieldName + "\", new Object[]{aDo." + getterMethod + "(), record." + getterMethod + "()});"); + method.addBodyLine("}"); + } + method.addBodyLine("aDo." + setterMethod + "(record." + getterMethod + "());"); + method.addBodyLine("}"); + } + method.addBodyLine(exampleClassName + " updateWhere = new " + exampleClassName + "();"); + method.addBodyLine("updateWhere.createCriteria()"); + method.addBodyLine(" .andGuidEqualTo(aDo.getGuid());"); + method.addBodyLine("aDo.setUpdateTime(new Date());"); + method.addBodyLine("// update data version"); + method.addBodyLine("record.setUpdateTime(aDo.getUpdateTime());"); + + method.addBodyLine("long startTime = new Date().getTime();"); + String updateMethod = hasBLOBColumns ? "updateByExampleWithBLOBs" : "updateByExample"; + method.addBodyLine("int update = " + mapperFieldName + "." + updateMethod + "(aDo, updateWhere);"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + getSlowQueryLoggerTime(introspectedTable) + ") {"); + method.addBodyLine("LOGGER." + getSlowQueryLoggerLevel(introspectedTable) + "(\"[SQL] update " + modelClassName + " long time\" +"); + method.addBodyLine(" \"\\n\\t|-> table name: " + tableName + "\" +"); + method.addBodyLine(" \"\\n\\t|-> use time: \" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); + method.addBodyLine("}"); + if (isChangeLogEnable(introspectedTable)) { + method.addBodyLine("if (update > 0 && !changeDiff.isEmpty()) {"); + method.addBodyLine(changeLogContextClassName + ".addLog(\"" + tableName + "\","); + method.addBodyLine(" \"update\", aDo.getGuid(), changeDiff);"); + method.addBodyLine("}"); + } + method.addBodyLine("return update;"); + implClass.addMethod(method); + } + private void generateUpdateByExampleSelectiveMethod(TopLevelClass implClass, String tableName, IntrospectedTable introspectedTable, String modelClassName, String exampleClassName, String mapperFieldName, boolean hasBLOBColumns) { Method method = new Method("updateByExampleSelective");