nieqiurong vor 1 Jahr
Ursprung
Commit
875b980bf9

+ 33 - 23
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DataChangeRecorderInnerInterceptor.java

@@ -194,18 +194,18 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
     }
 
     public OperationResult processInsert(Insert insertStmt, BoundSql boundSql) {
-        OperationResult result = new OperationResult();
-        result.setOperation("insert");
-        final Table table = insertStmt.getTable();
-        final Set<String> ignoredColumns = ignoredTableColumns.get(table.getName().toUpperCase());
-        if (ignoredColumns != null && ignoredColumns.stream().anyMatch("*"::equals)) {
-            result.setTableName(table.getName() + ":*");
-            result.setRecordStatus(false);
-            return result;
+        String operation = SqlCommandType.INSERT.name().toLowerCase();
+        Table table = insertStmt.getTable();
+        String tableName = table.getName();
+        Optional<OperationResult> optionalOperationResult = ignoredTableColumns(tableName, operation);
+        if (optionalOperationResult.isPresent()) {
+            return optionalOperationResult.get();
         }
-        result.setTableName(table.getName());
+        OperationResult result = new OperationResult();
+        result.setOperation(operation);
+        result.setTableName(tableName);
         result.setRecordStatus(true);
-        Map<String, Object> updatedColumnDatas = getUpdatedColumnDatas(result.getTableName(), boundSql, insertStmt);
+        Map<String, Object> updatedColumnDatas = getUpdatedColumnDatas(tableName, boundSql, insertStmt);
         result.buildDataStr(compareAndGetUpdatedColumnDatas(result.getTableName(), null, updatedColumnDatas));
         return result;
     }
@@ -214,22 +214,18 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
         Expression where = updateStmt.getWhere();
         PlainSelect selectBody = new PlainSelect();
         Table table = updateStmt.getTable();
-        final Set<String> ignoredColumns = ignoredTableColumns.get(table.getName().toUpperCase());
-        if (ignoredColumns != null) {
-            if (ignoredColumns.stream().anyMatch("*"::equals)) {
-                OperationResult result = new OperationResult();
-                result.setOperation("update");
-                result.setTableName(table.getName() + ":*");
-                result.setRecordStatus(false);
-                return result;
-            }
+        String tableName = table.getName();
+        String operation = SqlCommandType.UPDATE.name().toLowerCase();
+        Optional<OperationResult> optionalOperationResult = ignoredTableColumns(tableName, operation);
+        if (optionalOperationResult.isPresent()) {
+            return optionalOperationResult.get();
         }
         selectBody.setFromItem(table);
         List<Column> updateColumns = new ArrayList<>();
         for (UpdateSet updateSet : updateStmt.getUpdateSets()) {
             updateColumns.addAll(updateSet.getColumns());
         }
-        Columns2SelectItemsResult buildColumns2SelectItems = buildColumns2SelectItems(table.getName(), updateColumns);
+        Columns2SelectItemsResult buildColumns2SelectItems = buildColumns2SelectItems(tableName, updateColumns);
         selectBody.setSelectItems(buildColumns2SelectItems.getSelectItems());
         selectBody.setWhere(where);
         SelectItem<PlainSelect> plainSelectSelectItem = new SelectItem<>(selectBody);
@@ -244,16 +240,30 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
                 boundSql4Select.setAdditionalParameter(ety.getKey(), ety.getValue());
             }
         }
-        Map<String, Object> updatedColumnDatas = getUpdatedColumnDatas(table.getName(), boundSql, updateStmt);
+        Map<String, Object> updatedColumnDatas = getUpdatedColumnDatas(tableName, boundSql, updateStmt);
         OriginalDataObj originalData = buildOriginalObjectData(updatedColumnDatas, selectBody, buildColumns2SelectItems.getPk(), mappedStatement, boundSql4Select, connection);
         OperationResult result = new OperationResult();
-        result.setOperation("update");
-        result.setTableName(table.getName());
+        result.setOperation(operation);
+        result.setTableName(tableName);
         result.setRecordStatus(true);
         result.buildDataStr(compareAndGetUpdatedColumnDatas(result.getTableName(), originalData, updatedColumnDatas));
         return result;
     }
 
+    private Optional<OperationResult> ignoredTableColumns(String table, String operation) {
+        final Set<String> ignoredColumns = ignoredTableColumns.get(table.toUpperCase());
+        if (ignoredColumns != null) {
+            if (ignoredColumns.stream().anyMatch("*"::equals)) {
+                OperationResult result = new OperationResult();
+                result.setOperation(operation);
+                result.setTableName(table + ":*");
+                result.setRecordStatus(false);
+                return Optional.of(result);
+            }
+        }
+        return Optional.empty();
+    }
+
     private TableInfo getTableInfoByTableName(String tableName) {
         for (TableInfo tableInfo : TableInfoHelper.getTableInfos()) {
             if (tableName.equalsIgnoreCase(tableInfo.getTableName())) {

+ 15 - 11
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/test/extension/plugins/inner/DataChangeRecorderInnerInterceptorTest.java

@@ -3,6 +3,7 @@ package com.baomidou.mybatisplus.test.extension.plugins.inner;
 import com.baomidou.mybatisplus.extension.plugins.inner.DataChangeRecorderInnerInterceptor;
 import net.sf.jsqlparser.schema.Table;
 import net.sf.jsqlparser.statement.insert.Insert;
+import net.sf.jsqlparser.statement.update.Update;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -29,31 +30,34 @@ class DataChangeRecorderInnerInterceptorTest {
     @Test
     void setProperties() throws Exception {
         final Object ignoreAllColumns = getFieldValue(interceptor, "ignoreAllColumns");
-        Assertions.assertTrue(Set.of("COLUMN1", "COLUMN2").equals(ignoreAllColumns));
-
+        Assertions.assertEquals(Set.of("COLUMN1", "COLUMN2"), ignoreAllColumns);
         final Object ignoredTableColumns = getFieldValue(interceptor, "ignoredTableColumns");
-        Assertions.assertTrue(Map.of("H2USER", Set.of("*"), "TABLE_NAME1", Set.of("COLUMN1", "COLUMN2")).equals(ignoredTableColumns));
+        Assertions.assertEquals(Map.of("H2USER", Set.of("*"), "TABLE_NAME1", Set.of("COLUMN1", "COLUMN2")), ignoredTableColumns);
     }
 
-
-
     private Object getFieldValue(Object obj, String fieldName) throws NoSuchFieldException, IllegalAccessException {
         final Field field = DataChangeRecorderInnerInterceptor.class.getDeclaredField(fieldName);
         field.setAccessible(true);
-        final Object fieldValue = field.get(obj);
-        field.setAccessible(false);
-        return fieldValue;
+        return  field.get(obj);
     }
 
     @Test
-    void processInsert() throws Exception{
+    void processInsert() {
         final Insert insert = new Insert();
         insert.setTable(new Table("H2USER"));
         final DataChangeRecorderInnerInterceptor.OperationResult operationResult = interceptor.processInsert(insert, null);
         Assertions.assertEquals(operationResult.getTableName(), "H2USER:*");
         Assertions.assertFalse(operationResult.isRecordStatus());
-        Assertions.assertEquals(operationResult.getChangedData(), null);
-
+        Assertions.assertNull(operationResult.getChangedData());
     }
 
+    @Test
+    void processUpdate() {
+        final Update update = new Update();
+        update.setTable(new Table("H2USER"));
+        final DataChangeRecorderInnerInterceptor.OperationResult operationResult = interceptor.processUpdate(update, null, null, null);
+        Assertions.assertEquals(operationResult.getTableName(), "H2USER:*");
+        Assertions.assertFalse(operationResult.isRecordStatus());
+        Assertions.assertNull(operationResult.getChangedData());
+    }
 }