Browse Source

AlwaysUpdateSomeColumnById 选装件完工并向苗人凤拍了块板砖

miemie 6 years ago
parent
commit
fcab8f8931

+ 8 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/AbstractMethod.java

@@ -17,6 +17,7 @@ package com.baomidou.mybatisplus.core.injector;
 
 
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
 import org.apache.ibatis.builder.MapperBuilderAssistant;
 import org.apache.ibatis.builder.MapperBuilderAssistant;
 import org.apache.ibatis.executor.keygen.KeyGenerator;
 import org.apache.ibatis.executor.keygen.KeyGenerator;
@@ -204,6 +205,13 @@ public abstract class AbstractMethod implements Constants {
         }
         }
     }
     }
 
 
+    protected String optlockVersion() {
+        return "<if test=\"et instanceof java.util.Map\">" +
+            " AND ${et." + Constants.MP_OPTLOCK_VERSION_COLUMN +
+            "}=#{et." + Constants.MP_OPTLOCK_VERSION_ORIGINAL + StringPool.RIGHT_BRACE +
+            "</if>";
+    }
+
     /**
     /**
      * 查询
      * 查询
      */
      */

+ 0 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/AbstractSqlInjector.java

@@ -31,7 +31,6 @@ import java.lang.reflect.WildcardType;
 import java.util.List;
 import java.util.List;
 import java.util.Set;
 import java.util.Set;
 
 
-
 /**
 /**
  * SQL 自动注入器
  * SQL 自动注入器
  *
  *

+ 62 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/ChooseTableField.java

@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2011-2019, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * https://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.core.injector;
+
+import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+/**
+ * 带有进行字段筛选功能
+ *
+ * @author miemie
+ * @since 2019-04-12
+ */
+public abstract class ChooseTableField<Children> extends AbstractMethod {
+
+    /**
+     * 筛选条件集合
+     */
+    private List<Predicate<TableFieldInfo>> predicates = new ArrayList<>();
+
+    /**
+     * 设置字段删选函数
+     * <p> 注意: 推荐设置的函数是: <strong>过滤掉</strong>不要的字段 </p>
+     *
+     * @param predicate 函数
+     */
+    @SuppressWarnings("unchecked")
+    public Children addPredicate(Predicate<TableFieldInfo> predicate) {
+        Assert.notNull(predicate, "this predicate can not be null !");
+        this.predicates.add(predicate);
+        return (Children) this;
+    }
+
+    /**
+     * 进行字段筛选
+     */
+    protected Stream<TableFieldInfo> filters(List<TableFieldInfo> fieldInfos) {
+        Stream<TableFieldInfo> stream = fieldInfos.stream();
+        for (Predicate<TableFieldInfo> predicate : predicates) {
+            stream = stream.filter(predicate);
+        }
+        return stream;
+    }
+}

+ 0 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/DefaultSqlInjector.java

@@ -22,7 +22,6 @@ import java.util.stream.Stream;
 
 
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toList;
 
 
-
 /**
 /**
  * SQL 默认注入器
  * SQL 默认注入器
  *
  *

+ 4 - 15
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/methods/UpdateById.java

@@ -15,14 +15,11 @@
  */
  */
 package com.baomidou.mybatisplus.core.injector.methods;
 package com.baomidou.mybatisplus.core.injector.methods;
 
 
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.SqlSource;
-
 import com.baomidou.mybatisplus.core.enums.SqlMethod;
 import com.baomidou.mybatisplus.core.enums.SqlMethod;
 import com.baomidou.mybatisplus.core.injector.AbstractMethod;
 import com.baomidou.mybatisplus.core.injector.AbstractMethod;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import com.baomidou.mybatisplus.core.toolkit.Constants;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlSource;
 
 
 /**
 /**
  * 根据 ID 更新有值字段
  * 根据 ID 更新有值字段
@@ -36,18 +33,10 @@ public class UpdateById extends AbstractMethod {
     public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
     public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
         boolean logicDelete = tableInfo.isLogicDelete();
         boolean logicDelete = tableInfo.isLogicDelete();
         SqlMethod sqlMethod = SqlMethod.UPDATE_BY_ID;
         SqlMethod sqlMethod = SqlMethod.UPDATE_BY_ID;
-        StringBuilder append = new StringBuilder("<if test=\"et instanceof java.util.Map\">")
-            .append("<if test=\"et.").append(Constants.MP_OPTLOCK_VERSION_ORIGINAL).append("!=null\">")
-            .append(" AND ${et.").append(Constants.MP_OPTLOCK_VERSION_COLUMN)
-            .append("}=#{et.").append(Constants.MP_OPTLOCK_VERSION_ORIGINAL).append(StringPool.RIGHT_BRACE)
-            .append("</if></if>");
-        if (logicDelete) {
-            append.append(tableInfo.getLogicDeleteSql(true, false));
-        }
+        final String additional = optlockVersion() + tableInfo.getLogicDeleteSql(true, false);
         String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(),
         String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(),
             sqlSet(logicDelete, false, tableInfo, false, ENTITY, ENTITY_DOT),
             sqlSet(logicDelete, false, tableInfo, false, ENTITY, ENTITY_DOT),
-            tableInfo.getKeyColumn(), ENTITY_DOT + tableInfo.getKeyProperty(),
-            append);
+            tableInfo.getKeyColumn(), ENTITY_DOT + tableInfo.getKeyProperty(), additional);
         SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
         SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
         return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
         return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
     }
     }

+ 5 - 14
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableFieldInfo.java

@@ -15,26 +15,20 @@
  */
  */
 package com.baomidou.mybatisplus.core.metadata;
 package com.baomidou.mybatisplus.core.metadata;
 
 
-import java.lang.reflect.Field;
-
-import com.baomidou.mybatisplus.annotation.DbType;
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.FieldStrategy;
-import com.baomidou.mybatisplus.annotation.SqlCondition;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
 import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
-
 import lombok.AccessLevel;
 import lombok.AccessLevel;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Getter;
 import lombok.ToString;
 import lombok.ToString;
 
 
+import java.lang.reflect.Field;
+
 /**
 /**
  * 数据库表字段反射信息
  * 数据库表字段反射信息
  *
  *
@@ -205,7 +199,7 @@ public class TableFieldInfo implements Constants {
     }
     }
 
 
     /**
     /**
-     * 是否开启逻辑删除
+     * 是否注解了逻辑删除
      */
      */
     public boolean isLogicDelete() {
     public boolean isLogicDelete() {
         return StringUtils.isNotEmpty(logicDeleteValue);
         return StringUtils.isNotEmpty(logicDeleteValue);
@@ -327,13 +321,10 @@ public class TableFieldInfo implements Constants {
         } else {
         } else {
             sqlSet += SqlScriptUtils.safeParam(newPrefix + el);
             sqlSet += SqlScriptUtils.safeParam(newPrefix + el);
         }
         }
+        sqlSet += COMMA;
         if (ignoreIf) {
         if (ignoreIf) {
-            /**
-             * 忽略 IF 条件
-             */
             return sqlSet;
             return sqlSet;
         }
         }
-        sqlSet += COMMA;
         if (fieldFill == FieldFill.UPDATE || fieldFill == FieldFill.INSERT_UPDATE) {
         if (fieldFill == FieldFill.UPDATE || fieldFill == FieldFill.INSERT_UPDATE) {
             // 不进行 if 包裹
             // 不进行 if 包裹
             return sqlSet;
             return sqlSet;

+ 0 - 31
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableInfo.java

@@ -233,37 +233,6 @@ public class TableInfo implements Constants {
         return EMPTY;
         return EMPTY;
     }
     }
 
 
-
-    /**
-     * 根据 predicate 过滤后获取 insert 时候插入值 sql 脚本片段
-     * <p>insert into table (字段) values (值)</p>
-     * <p>位于 "值" 部位</p>
-     *
-     * <li> 自选部位,不生成 if 标签 </li>
-     *
-     * @return sql 脚本片段
-     */
-    public String getSomeInsertSqlProperty(final String prefix, Predicate<TableFieldInfo> predicate) {
-        final String newPrefix = prefix == null ? EMPTY : prefix;
-        return getKeyInsertSqlProperty(newPrefix, false) + fieldList.stream()
-            .filter(predicate).map(i -> i.getInsertSqlProperty(newPrefix)).collect(joining(EMPTY));
-    }
-
-    /**
-     * 根据 predicate 过滤后获取 insert 时候字段 sql 脚本片段
-     * <p>insert into table (字段) values (值)</p>
-     * <p>位于 "字段" 部位</p>
-     *
-     * <li> 自选部位,不生成 if 标签 </li>
-     *
-     * @return sql 脚本片段
-     */
-    public String getSomeInsertSqlColumn(Predicate<TableFieldInfo> predicate) {
-        return getKeyInsertSqlColumn(false) + fieldList.stream().filter(predicate)
-            .map(TableFieldInfo::getInsertSqlColumn).collect(joining(EMPTY));
-    }
-
-
     /**
     /**
      * 获取所有 insert 时候插入值 sql 脚本片段
      * 获取所有 insert 时候插入值 sql 脚本片段
      * <p>insert into table (字段) values (值)</p>
      * <p>insert into table (字段) values (值)</p>

+ 33 - 24
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/injector/methods/additional/UpdateAllColumnById.java → mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/injector/methods/additional/AlwaysUpdateSomeColumnById.java

@@ -15,42 +15,51 @@
  */
  */
 package com.baomidou.mybatisplus.extension.injector.methods.additional;
 package com.baomidou.mybatisplus.extension.injector.methods.additional;
 
 
-import static java.util.stream.Collectors.joining;
-
+import com.baomidou.mybatisplus.core.enums.SqlMethod;
+import com.baomidou.mybatisplus.core.injector.ChooseTableField;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
 import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.SqlSource;
 import org.apache.ibatis.mapping.SqlSource;
 
 
-import com.baomidou.mybatisplus.core.enums.SqlMethod;
-import com.baomidou.mybatisplus.core.injector.AbstractMethod;
-import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import com.baomidou.mybatisplus.core.toolkit.Constants;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import static java.util.stream.Collectors.joining;
 
 
 /**
 /**
- * 根据 ID 更新所有字段
+ * 根据 ID 更新固定的那几个字段(但是不包含逻辑删除)
+ *
+ * <p>
+ * 自己的通用 mapper 如下使用:
+ * <pre>
+ * int alwaysUpdateSomeColumnById(@Param(Constants.ENTITY) T entity);
+ * </pre>
+ * </p>
+ *
+ * <p> 如何筛选字段参考请 {@link InsertBatchSomeColumn} 里面的注释 </p>
  *
  *
  * @author hubin
  * @author hubin
  * @since 2019-04-12
  * @since 2019-04-12
  */
  */
-public class UpdateAllColumnById extends AbstractMethod {
+public class AlwaysUpdateSomeColumnById extends ChooseTableField<AlwaysUpdateSomeColumnById> {
+
+    /**
+     * mapper 对应的方法名
+     */
+    private static final String MAPPER_METHOD = "alwaysUpdateSomeColumnById";
+
+    public AlwaysUpdateSomeColumnById() {
+        this.addPredicate(t -> !t.isLogicDelete());
+    }
 
 
     @Override
     @Override
     public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
     public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
-        boolean logicDelete = tableInfo.isLogicDelete();
-        SqlMethod sqlMethod = SqlMethod.UPDATE_ALL_COLUMN_BY_ID;
-        StringBuilder append = new StringBuilder("<if test=\"et instanceof java.util.Map\">")
-            .append(" AND ${et.").append(Constants.MP_OPTLOCK_VERSION_COLUMN)
-            .append("}=#{et.").append(Constants.MP_OPTLOCK_VERSION_ORIGINAL).append(StringPool.RIGHT_BRACE)
-            .append("</if>");
-        if (logicDelete) {
-            append.append(tableInfo.getLogicDeleteSql(true, false));
-        }
-        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(),
-            tableInfo.getFieldList().stream().filter(i -> !(tableInfo.isLogicDelete() && i.isLogicDelete()))
-                .map(i -> i.getSqlSet(true, ENTITY_DOT)).collect(joining(DOT_NEWLINE)),
-            tableInfo.getKeyColumn(), ENTITY_DOT + tableInfo.getKeyProperty(),
-            append);
+        SqlMethod sqlMethod = SqlMethod.UPDATE_BY_ID;
+        final String additional = optlockVersion() + tableInfo.getLogicDeleteSql(true, false);
+        String sqlSet = this.filters(tableInfo.getFieldList())
+            .map(i -> i.getSqlSet(true, ENTITY_DOT)).collect(joining(NEWLINE));
+        sqlSet = SqlScriptUtils.convertSet(sqlSet);
+        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlSet,
+            tableInfo.getKeyColumn(), ENTITY_DOT + tableInfo.getKeyProperty(), additional);
         SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
         SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
-        return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
+        return addUpdateMappedStatement(mapperClass, modelClass, MAPPER_METHOD, sqlSource);
     }
     }
 }
 }

+ 23 - 16
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/injector/methods/additional/InsertBatchSomeColumn.java

@@ -17,21 +17,24 @@ package com.baomidou.mybatisplus.extension.injector.methods.additional;
 
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.core.enums.SqlMethod;
 import com.baomidou.mybatisplus.core.enums.SqlMethod;
-import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.injector.ChooseTableField;
 import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
 import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
 import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
+import lombok.NoArgsConstructor;
 import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator;
 import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator;
 import org.apache.ibatis.executor.keygen.KeyGenerator;
 import org.apache.ibatis.executor.keygen.KeyGenerator;
 import org.apache.ibatis.executor.keygen.NoKeyGenerator;
 import org.apache.ibatis.executor.keygen.NoKeyGenerator;
 import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.SqlSource;
 import org.apache.ibatis.mapping.SqlSource;
 
 
+import java.util.List;
 import java.util.function.Predicate;
 import java.util.function.Predicate;
 
 
+import static java.util.stream.Collectors.joining;
+
 /**
 /**
  * 批量新增数据,自选字段 insert
  * 批量新增数据,自选字段 insert
  * <p> 不同的数据库支持度不一样!!!  只在 mysql 下测试过!!!  只在 mysql 下测试过!!!  只在 mysql 下测试过!!! </p>
  * <p> 不同的数据库支持度不一样!!!  只在 mysql 下测试过!!!  只在 mysql 下测试过!!!  只在 mysql 下测试过!!! </p>
@@ -44,42 +47,46 @@ import java.util.function.Predicate;
  * </pre>
  * </pre>
  * </p>
  * </p>
  *
  *
- * <li> 注意1: 不要加任何注解 !! </li>
- * <li> 注意2: 自选字段 insert !!,如果个别字段在 entity 里为 null 但是数据库中有配置默认值, insert 后数据库字段是为 null 而不是默认值 </li>
+ * <li> 注意: 这是自选字段 insert !!,如果个别字段在 entity 里为 null 但是数据库中有配置默认值, insert 后数据库字段是为 null 而不是默认值 </li>
  *
  *
  * <p>
  * <p>
- * 常用的构造入参:
+ * 常用的 {@link Predicate}:
  * </p>
  * </p>
  *
  *
- * <li> 例1: new InsertBatchSomeColumn(t -> true) , 表示用于全字段 </li>
- * <li> 例2: new InsertBatchSomeColumn(t -> !t.isLogicDelete()) , 表示非逻辑删除字段外全字段 </li>
- * <li> 例3: new InsertBatchSomeColumn(t -> t.getFieldFill() != FieldFill.UPDATE) , 表示填充策略为 UPDATE 字段 </li>
+ * <li> 例1: t -> !t.isLogicDelete() , 表示不要逻辑删除字段 </li>
+ * <li> 例2: t -> !t.getProperty().equals("version") , 表示不要字段名为 version 的字段 </li>
+ * <li> 例3: t -> t.getFieldFill() != FieldFill.UPDATE) , 表示不要填充策略为 UPDATE 的字段 </li>
  *
  *
  * @author miemie
  * @author miemie
  * @since 2018-11-29
  * @since 2018-11-29
  */
  */
-@SuppressWarnings("all")
-public class InsertBatchSomeColumn extends AbstractMethod {
+@NoArgsConstructor
+public class InsertBatchSomeColumn extends ChooseTableField<InsertBatchSomeColumn> {
 
 
     /**
     /**
      * mapper 对应的方法名
      * mapper 对应的方法名
      */
      */
     private static final String MAPPER_METHOD = "insertBatchSomeColumn";
     private static final String MAPPER_METHOD = "insertBatchSomeColumn";
 
 
-    private Predicate<TableFieldInfo> predicate;
-
+    /**
+     * @deprecated please to use {@link #addPredicate(Predicate)}
+     */
+    @Deprecated
     public InsertBatchSomeColumn(Predicate<TableFieldInfo> predicate) {
     public InsertBatchSomeColumn(Predicate<TableFieldInfo> predicate) {
-        Assert.notNull(predicate, "this predicate can not be null !");
-        this.predicate = predicate;
+        this.addPredicate(predicate);
     }
     }
 
 
+    @SuppressWarnings("Duplicates")
     @Override
     @Override
     public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
     public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
         KeyGenerator keyGenerator = new NoKeyGenerator();
         KeyGenerator keyGenerator = new NoKeyGenerator();
         SqlMethod sqlMethod = SqlMethod.INSERT_ONE;
         SqlMethod sqlMethod = SqlMethod.INSERT_ONE;
-        String insertSqlColumn = tableInfo.getSomeInsertSqlColumn(predicate);
+        List<TableFieldInfo> fieldList = tableInfo.getFieldList();
+        String insertSqlColumn = tableInfo.getKeyInsertSqlColumn(false) + this.filters(fieldList)
+            .map(TableFieldInfo::getInsertSqlColumn).collect(joining(EMPTY));
         String columnScript = LEFT_BRACKET + insertSqlColumn.substring(0, insertSqlColumn.length() - 1) + RIGHT_BRACKET;
         String columnScript = LEFT_BRACKET + insertSqlColumn.substring(0, insertSqlColumn.length() - 1) + RIGHT_BRACKET;
-        String insertSqlProperty = tableInfo.getSomeInsertSqlProperty(ENTITY_DOT, predicate);
+        String insertSqlProperty = tableInfo.getKeyInsertSqlProperty(ENTITY_DOT, false) + this.filters(fieldList)
+            .map(i -> i.getInsertSqlProperty(ENTITY_DOT)).collect(joining(EMPTY));
         insertSqlProperty = LEFT_BRACKET + insertSqlProperty.substring(0, insertSqlProperty.length() - 1) + RIGHT_BRACKET;
         insertSqlProperty = LEFT_BRACKET + insertSqlProperty.substring(0, insertSqlProperty.length() - 1) + RIGHT_BRACKET;
         String valuesScript = SqlScriptUtils.convertForeach(insertSqlProperty, "list", null, ENTITY, COMMA);
         String valuesScript = SqlScriptUtils.convertForeach(insertSqlProperty, "list", null, ENTITY, COMMA);
         String keyProperty = null;
         String keyProperty = null;

+ 4 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/mapper/MyBaseMapper.java

@@ -16,6 +16,8 @@
 package com.baomidou.mybatisplus.test.base.mapper;
 package com.baomidou.mybatisplus.test.base.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Param;
 
 
 import java.util.List;
 import java.util.List;
 
 
@@ -28,4 +30,6 @@ public interface MyBaseMapper<T> extends BaseMapper<T> {
     int deleteByIdWithFill(T entity);
     int deleteByIdWithFill(T entity);
 
 
     int insertBatchSomeColumn(List<T> entityList);
     int insertBatchSomeColumn(List<T> entityList);
+
+    int alwaysUpdateSomeColumnById(@Param(Constants.ENTITY) T entity);
 }
 }

+ 15 - 17
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/config/MybatisPlusConfig.java

@@ -15,20 +15,6 @@
  */
  */
 package com.baomidou.mybatisplus.test.h2.config;
 package com.baomidou.mybatisplus.test.h2.config;
 
 
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.sql.DataSource;
-
-import org.apache.ibatis.plugin.Interceptor;
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.apache.ibatis.type.EnumOrdinalTypeHandler;
-import org.apache.ibatis.type.JdbcType;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.io.ResourceLoader;
-
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.core.MybatisConfiguration;
 import com.baomidou.mybatisplus.core.MybatisConfiguration;
@@ -38,20 +24,31 @@ import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
 import com.baomidou.mybatisplus.core.parser.AbstractJsqlParser;
 import com.baomidou.mybatisplus.core.parser.AbstractJsqlParser;
 import com.baomidou.mybatisplus.core.parser.ISqlParser;
 import com.baomidou.mybatisplus.core.parser.ISqlParser;
 import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
 import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
+import com.baomidou.mybatisplus.extension.injector.methods.additional.AlwaysUpdateSomeColumnById;
 import com.baomidou.mybatisplus.extension.injector.methods.additional.InsertBatchSomeColumn;
 import com.baomidou.mybatisplus.extension.injector.methods.additional.InsertBatchSomeColumn;
 import com.baomidou.mybatisplus.extension.injector.methods.additional.LogicDeleteByIdWithFill;
 import com.baomidou.mybatisplus.extension.injector.methods.additional.LogicDeleteByIdWithFill;
-import com.baomidou.mybatisplus.extension.injector.methods.additional.UpdateAllColumnById;
 import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.SqlExplainInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.SqlExplainInterceptor;
 import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
 import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
 import com.baomidou.mybatisplus.test.h2.H2MetaObjectHandler;
 import com.baomidou.mybatisplus.test.h2.H2MetaObjectHandler;
-
 import net.sf.jsqlparser.statement.delete.Delete;
 import net.sf.jsqlparser.statement.delete.Delete;
 import net.sf.jsqlparser.statement.insert.Insert;
 import net.sf.jsqlparser.statement.insert.Insert;
 import net.sf.jsqlparser.statement.select.SelectBody;
 import net.sf.jsqlparser.statement.select.SelectBody;
 import net.sf.jsqlparser.statement.update.Update;
 import net.sf.jsqlparser.statement.update.Update;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ResourceLoader;
+
+import javax.sql.DataSource;
+import java.util.ArrayList;
+import java.util.List;
 
 
 /**
 /**
  * Mybatis Plus Config
  * Mybatis Plus Config
@@ -122,7 +119,8 @@ public class MybatisPlusConfig {
             public List<AbstractMethod> getMethodList() {
             public List<AbstractMethod> getMethodList() {
                 List<AbstractMethod> methodList = super.getMethodList();
                 List<AbstractMethod> methodList = super.getMethodList();
                 methodList.add(new LogicDeleteByIdWithFill());
                 methodList.add(new LogicDeleteByIdWithFill());
-                methodList.add(new UpdateAllColumnById());
+                methodList.add(new AlwaysUpdateSomeColumnById()
+                    .addPredicate(t -> t.getFieldFill() != FieldFill.INSERT));
                 methodList.add(new InsertBatchSomeColumn(t -> !(t.getFieldFill() == FieldFill.UPDATE
                 methodList.add(new InsertBatchSomeColumn(t -> !(t.getFieldFill() == FieldFill.UPDATE
                     || t.isLogicDelete() || t.getProperty().equals("version"))));
                     || t.isLogicDelete() || t.getProperty().equals("version"))));
                 return methodList;
                 return methodList;

+ 0 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/MysqlTestDataMapperTest.java

@@ -36,7 +36,6 @@ import java.util.Map;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.*;
 import static org.junit.jupiter.api.Assertions.*;
 
 
-
 /**
 /**
  * Mybatis Plus mysql Junit Test
  * Mybatis Plus mysql Junit Test
  *
  *

+ 13 - 2
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/config/MybatisPlusConfig.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.injector.AbstractMethod;
 import com.baomidou.mybatisplus.core.injector.AbstractMethod;
 import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
 import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
 import com.baomidou.mybatisplus.core.parser.ISqlParser;
 import com.baomidou.mybatisplus.core.parser.ISqlParser;
+import com.baomidou.mybatisplus.extension.injector.methods.additional.AlwaysUpdateSomeColumnById;
 import com.baomidou.mybatisplus.extension.injector.methods.additional.InsertBatchSomeColumn;
 import com.baomidou.mybatisplus.extension.injector.methods.additional.InsertBatchSomeColumn;
 import com.baomidou.mybatisplus.extension.injector.methods.additional.LogicDeleteByIdWithFill;
 import com.baomidou.mybatisplus.extension.injector.methods.additional.LogicDeleteByIdWithFill;
 import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
@@ -92,8 +93,18 @@ public class MybatisPlusConfig {
             public List<AbstractMethod> getMethodList() {
             public List<AbstractMethod> getMethodList() {
                 List<AbstractMethod> methodList = super.getMethodList();
                 List<AbstractMethod> methodList = super.getMethodList();
                 methodList.add(new LogicDeleteByIdWithFill());
                 methodList.add(new LogicDeleteByIdWithFill());
-                methodList.add(new InsertBatchSomeColumn(t -> !(t.getFieldFill() == FieldFill.UPDATE
-                    || t.isLogicDelete() || t.getProperty().equals("version"))));
+                methodList.add(new InsertBatchSomeColumn()
+                    // 不要逻辑删除字段
+                    .addPredicate(t -> !t.isLogicDelete())
+                    // 不要字段名是 version 的字段
+                    .addPredicate(t -> !t.getProperty().equals("version"))
+                    // 不要填充策略是 UPDATE 的字段
+                    .addPredicate(t -> t.getFieldFill() != FieldFill.UPDATE));
+                methodList.add(new AlwaysUpdateSomeColumnById()
+                    // 不要填充策略是 INSERT 的字段
+                    .addPredicate(t -> t.getFieldFill() != FieldFill.INSERT)
+                    // 不要字段名是 column4 的字段
+                    .addPredicate(t -> !t.getProperty().equals("column4")));
                 return methodList;
                 return methodList;
             }
             }
         };
         };