Browse Source

处理填充参数与主键填充参数.

nieqiuqiu 5 years ago
parent
commit
609d769b8c

+ 17 - 15
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisDefaultParameterHandler.java

@@ -79,16 +79,17 @@ public class MybatisDefaultParameterHandler extends DefaultParameterHandler {
             Collection<Object> parameters = getParameters(parameterObject);
             if (null != parameters) {
                 // 感觉这里可以稍微优化一下,理论上都是同一个.
-                parameters.stream().filter(Objects::nonNull).forEach(obj -> getTableInfo(obj).ifPresent(tableInfo -> process(ms, obj, tableInfo)));
+                parameters.stream().filter(Objects::nonNull).forEach(obj -> process(ms, obj));
             } else {
-                getTableInfo(parameterObject).ifPresent(tableInfo -> process(ms, parameterObject, tableInfo));
+                process(ms, parameterObject);
             }
         }
         return parameterObject;
     }
 
-    private static Optional<TableInfo> getTableInfo(Object parameterObject) {
+    private static void process(MappedStatement ms, Object parameterObject) {
         TableInfo tableInfo = null;
+        Object entity = parameterObject;
         if (parameterObject instanceof Map) {
             Map<?, ?> map = (Map<?, ?>) parameterObject;
             String entityKey = Constants.ENTITY;
@@ -99,26 +100,27 @@ public class MybatisDefaultParameterHandler extends DefaultParameterHandler {
                         Map<?, ?> realEtMap = (Map<?, ?>) et;
                         String optLockKey = Constants.MP_OPTLOCK_ET_ORIGINAL;
                         if (realEtMap.containsKey(optLockKey)) {
-                            tableInfo = TableInfoHelper.getTableInfo(realEtMap.get(optLockKey).getClass());
+                            entity = realEtMap.get(optLockKey);
+                            tableInfo = TableInfoHelper.getTableInfo(entity.getClass());
                         }
                     } else {
-                        tableInfo = TableInfoHelper.getTableInfo(et.getClass());
+                        entity = et;
+                        tableInfo = TableInfoHelper.getTableInfo(entity.getClass());
                     }
                 }
             }
         } else {
             tableInfo = TableInfoHelper.getTableInfo(parameterObject.getClass());
         }
-        return Optional.ofNullable(tableInfo);
-    }
-
-    private static void process(MappedStatement ms, Object parameterObject, TableInfo tableInfo) {
-        MetaObject metaObject = ms.getConfiguration().newMetaObject(parameterObject);
-        if (SqlCommandType.INSERT == ms.getSqlCommandType()) {
-            insertFill(metaObject, tableInfo);
-            populateKeys(tableInfo, metaObject, parameterObject);
-        } else {
-            updateFill(metaObject, tableInfo);
+        if (tableInfo != null) {
+            //到这里就应该转换到实体参数对象了,因为填充和ID处理都是争对实体对象处理的,不用传递原参数对象下去.
+            MetaObject metaObject = ms.getConfiguration().newMetaObject(entity);
+            if (SqlCommandType.INSERT == ms.getSqlCommandType()) {
+                insertFill(metaObject, tableInfo);
+                populateKeys(tableInfo, metaObject, entity);
+            } else {
+                updateFill(metaObject, tableInfo);
+            }
         }
     }
 

+ 41 - 14
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/MybatisDefaultParameterHandlerTest.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
 import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -21,7 +22,9 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 
 class MybatisDefaultParameterHandlerTest {
@@ -44,6 +47,11 @@ class MybatisDefaultParameterHandlerTest {
         Model(String name) {
             this.name = name;
         }
+
+        Model(Long id, String name) {
+            this.id = id;
+            this.name = name;
+        }
     }
 
     @Test
@@ -70,26 +78,45 @@ class MybatisDefaultParameterHandlerTest {
                 setFieldValByName("updateOperator", "逗号", metaObject);
             }
         });
-        Model model = new Model("坦克");
-        TableInfoHelper.initTableInfo(new MapperBuilderAssistant(configuration,""), Model.class);
+        Model model1 = new Model("坦克");
+        TableInfoHelper.initTableInfo(new MapperBuilderAssistant(configuration, ""), Model.class);
         //查询
         mappedStatement = new MappedStatement.Builder(configuration, "***", staticSqlSource, SqlCommandType.SELECT).build();
-        MybatisDefaultParameterHandler.processParameter(mappedStatement, model);
-        Assertions.assertNull(model.getId());
-        Assertions.assertNull(model.getInsertOperator());
-        Assertions.assertNull(model.getUpdateOperator());
+        MybatisDefaultParameterHandler.processParameter(mappedStatement, model1);
+        Assertions.assertNull(model1.getId());
+        Assertions.assertNull(model1.getInsertOperator());
+        Assertions.assertNull(model1.getUpdateOperator());
         // 普通插入
         mappedStatement = new MappedStatement.Builder(configuration, "***", staticSqlSource, SqlCommandType.INSERT).build();
-        MybatisDefaultParameterHandler.processParameter(mappedStatement, model);
-        Assertions.assertNotNull(model.getId());
-        Assertions.assertNotNull(model.getInsertOperator());
-        Assertions.assertNull(model.getUpdateOperator());
+        MybatisDefaultParameterHandler.processParameter(mappedStatement, model1);
+        Assertions.assertNotNull(model1.getId());
+        Assertions.assertNotNull(model1.getInsertOperator());
+        Assertions.assertNull(model1.getUpdateOperator());
+        mappedStatement = new MappedStatement.Builder(configuration, "***", staticSqlSource, SqlCommandType.INSERT).build();
+        //map参数
+        Model model2 = new Model("坦克");
+        Map<String, Object> params1 = new HashMap<>();
+        params1.put(Constants.ENTITY, model2);
+        MybatisDefaultParameterHandler.processParameter(mappedStatement, params1);
+        Assertions.assertNotNull(model2.getId());
+        Assertions.assertNotNull(model2.getInsertOperator());
+        Assertions.assertNull(model2.getUpdateOperator());
+        //map参数
+        Model model3 = new Model("坦克");
+        Map<String, Object> params2 = new HashMap<>();
+        params2.put(Constants.ENTITY, new HashMap<String, Object>() {{
+            put(Constants.MP_OPTLOCK_ET_ORIGINAL, model3);
+        }});
+        MybatisDefaultParameterHandler.processParameter(mappedStatement, params2);
+        Assertions.assertNotNull(model3.getId());
+        Assertions.assertNotNull(model3.getInsertOperator());
+        Assertions.assertNull(model3.getUpdateOperator());
         //普通更新
+        Model model4 = new Model(1L,"坦克");
         mappedStatement = new MappedStatement.Builder(configuration, "***", staticSqlSource, SqlCommandType.UPDATE).build();
-        MybatisDefaultParameterHandler.processParameter(mappedStatement, model);
-        Assertions.assertNotNull(model.getId());
-        Assertions.assertNotNull(model.getInsertOperator());
-        Assertions.assertNotNull(model.getUpdateOperator());
+        MybatisDefaultParameterHandler.processParameter(mappedStatement, model4);
+        Assertions.assertNotNull(model4.getId());
+        Assertions.assertNotNull(model4.getUpdateOperator());
         //批量插入
         List<Model> list = Arrays.asList(new Model("坦克一号"), new Model("坦克二号"));
         mappedStatement = new MappedStatement.Builder(configuration, "***", staticSqlSource, SqlCommandType.INSERT).build();