Просмотр исходного кода

新增参数填充器跳过方式(基于MappedStatement#id).

nieqiurong 1 год назад
Родитель
Сommit
cd02388217

+ 4 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisParameterHandler.java

@@ -62,9 +62,11 @@ public class MybatisParameterHandler extends DefaultParameterHandler {
     private final Object parameterObject;
     private final Configuration configuration;
     private final SqlCommandType sqlCommandType;
+    private final MappedStatement mappedStatement;
 
     public MybatisParameterHandler(MappedStatement mappedStatement, Object parameter, BoundSql boundSql) {
         super(mappedStatement, parameter, boundSql);
+        this.mappedStatement = mappedStatement;
         this.configuration = mappedStatement.getConfiguration();
         this.sqlCommandType = mappedStatement.getSqlCommandType();
         this.parameterObject = processParameter(parameter);
@@ -158,7 +160,7 @@ public class MybatisParameterHandler extends DefaultParameterHandler {
 
     protected void insertFill(MetaObject metaObject, TableInfo tableInfo) {
         GlobalConfigUtils.getMetaObjectHandler(this.configuration).ifPresent(metaObjectHandler -> {
-            if (metaObjectHandler.openInsertFill() && tableInfo.isWithInsertFill()) {
+            if (metaObjectHandler.openInsertFill() && metaObjectHandler.openInsertFill(mappedStatement) && tableInfo.isWithInsertFill()) {
                 metaObjectHandler.insertFill(metaObject);
             }
         });
@@ -166,7 +168,7 @@ public class MybatisParameterHandler extends DefaultParameterHandler {
 
     protected void updateFill(MetaObject metaObject, TableInfo tableInfo) {
         GlobalConfigUtils.getMetaObjectHandler(this.configuration).ifPresent(metaObjectHandler -> {
-            if (metaObjectHandler.openUpdateFill() && tableInfo.isWithUpdateFill()) {
+            if (metaObjectHandler.openUpdateFill() && metaObjectHandler.openUpdateFill(mappedStatement) && tableInfo.isWithUpdateFill()) {
                 metaObjectHandler.updateFill(metaObject);
             }
         });

+ 29 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/handlers/MetaObjectHandler.java

@@ -17,6 +17,7 @@ package com.baomidou.mybatisplus.core.handlers;
 
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
+import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.reflection.MetaObject;
 
 import java.util.Collections;
@@ -36,18 +37,46 @@ public interface MetaObjectHandler {
 
     /**
      * 是否开启了插入填充
+     *
+     * @deprecated 3.5.6 {@link #openInsertFill(MappedStatement)}
      */
+    @Deprecated
     default boolean openInsertFill() {
         return true;
     }
 
+    /**
+     * 是否开启插入填充
+     *
+     * @param mappedStatement {@link MappedStatement}
+     * @return 是否开启
+     * @since 3.5.6
+     */
+    default boolean openInsertFill(MappedStatement mappedStatement) {
+        return true;
+    }
+
     /**
      * 是否开启了更新填充
+     *
+     * @deprecated 3.5.6 {@link #openUpdateFill(MappedStatement)}
      */
+    @Deprecated
     default boolean openUpdateFill() {
         return true;
     }
 
+    /**
+     * 是否开启了更新填充
+     *
+     * @param mappedStatement {@link MappedStatement}
+     * @return 是否开启
+     * @since 3.5.6
+     */
+    default boolean openUpdateFill(MappedStatement mappedStatement) {
+        return true;
+    }
+
     /**
      * 插入元对象字段填充(用于插入时对公共字段的填充)
      *

+ 59 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/test/MybatisParameterHandlerTest.java

@@ -289,4 +289,63 @@ class MybatisParameterHandlerTest {
 
     }
 
+    @Test
+    void testIgnoreMapperStatement() {
+        MappedStatement mappedStatement;
+        Configuration configuration = new MybatisConfiguration();
+        BoundSql boundSql = mock(BoundSql.class);
+        StaticSqlSource staticSqlSource = mock(StaticSqlSource.class);
+        GlobalConfigUtils.getGlobalConfig(configuration).setIdentifierGenerator(DefaultIdentifierGenerator.getInstance()).setMetaObjectHandler(new MetaObjectHandler() {
+
+            @Override
+            public boolean openInsertFill(MappedStatement mappedStatement) {
+                //根据msId跳过填充
+                return !"com.baomidou.demo.ignoreFillSave".equals(mappedStatement.getId());
+            }
+
+            @Override
+            public boolean openUpdateFill(MappedStatement mappedStatement) {
+                //根据msId跳过填充
+                return !"com.baomidou.demo.ignoreFillUpdate".equals(mappedStatement.getId());
+            }
+
+            @Override
+            public void insertFill(MetaObject metaObject) {
+                setFieldValByName("id", 666L, metaObject);
+                setFieldValByName("insertOperator", "秋秋", metaObject);
+            }
+
+            @Override
+            public void updateFill(MetaObject metaObject) {
+                setFieldValByName("updateOperator", "秋秋", metaObject);
+            }
+
+        });
+        TableInfoHelper.initTableInfo(new MapperBuilderAssistant(configuration, ""), Model.class);
+        Model model;
+
+        model = new Model("测试新增忽略填充");
+        mappedStatement = new MappedStatement.Builder(configuration, "com.baomidou.demo.ignoreFillSave", staticSqlSource, SqlCommandType.INSERT).build();
+        new MybatisParameterHandler(mappedStatement, model, boundSql);
+        assertThat(model.getId()).isNull();
+        assertThat(model.getInsertOperator()).isNull();
+
+        model = new Model("测试新增填充");
+        mappedStatement = new MappedStatement.Builder(configuration, "com.baomidou.demo.save", staticSqlSource, SqlCommandType.INSERT).build();
+        new MybatisParameterHandler(mappedStatement, model, boundSql);
+        assertThat(model.getId()).isNotNull();
+        assertThat(model.getInsertOperator()).isNotNull();
+        assertThat(model.getInsertOperator()).isEqualTo("秋秋");
+
+        model = new Model("测试更新忽略填充");
+        mappedStatement = new MappedStatement.Builder(configuration, "com.baomidou.demo.ignoreFillUpdate", staticSqlSource, SqlCommandType.UPDATE).build();
+        new MybatisParameterHandler(mappedStatement, model, boundSql);
+        assertThat(model.getUpdateOperator()).isNull();
+
+        model = new Model("测试更新填充");
+        mappedStatement = new MappedStatement.Builder(configuration, "com.baomidou.demo.update", staticSqlSource, SqlCommandType.UPDATE).build();
+        new MybatisParameterHandler(mappedStatement, model, boundSql);
+        assertThat(model.getUpdateOperator()).isEqualTo("秋秋");
+    }
+
 }