miemie преди 4 години
родител
ревизия
f3cd818f3e

+ 72 - 93
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractWrapper.java

@@ -188,14 +188,14 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
 
     @Override
     public Children between(boolean condition, R column, Object val1, Object val2) {
-        return doIt(condition, () -> columnToString(column), BETWEEN, () -> formatSql("{0}", val1), AND,
-            () -> formatSql("{0}", val2));
+        return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), BETWEEN,
+            () -> formatParam(null, val1), AND, () -> formatParam(null, val2)));
     }
 
     @Override
     public Children notBetween(boolean condition, R column, Object val1, Object val2) {
-        return doIt(condition, () -> columnToString(column), NOT_BETWEEN, () -> formatSql("{0}", val1), AND,
-            () -> formatSql("{0}", val2));
+        return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), NOT_BETWEEN,
+            () -> formatParam(null, val1), AND, () -> formatParam(null, val2)));
     }
 
     @Override
@@ -220,12 +220,13 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
 
     @Override
     public Children or(boolean condition) {
-        return doIt(condition, OR);
+        return maybeDo(condition, () -> appendSqlSegments(OR));
     }
 
     @Override
     public Children apply(boolean condition, String applySql, Object... values) {
-        return doIt(condition, APPLY, () -> formatSql(applySql, values));
+        return maybeDo(condition, () -> appendSqlSegments(APPLY,
+            () -> formatSqlMaybeWithParam(applySql, null, values)));
     }
 
     @Override
@@ -254,7 +255,8 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
 
     @Override
     public Children exists(boolean condition, String existsSql, Object... values) {
-        return doIt(condition, EXISTS, () -> String.format("(%s)", formatSql(existsSql, values)));
+        return maybeDo(condition, () -> appendSqlSegments(EXISTS,
+            () -> String.format("(%s)", formatSqlMaybeWithParam(existsSql, null, values))));
     }
 
     @Override
@@ -264,72 +266,70 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
 
     @Override
     public Children isNull(boolean condition, R column) {
-        return doIt(condition, () -> columnToString(column), IS_NULL);
+        return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), IS_NULL));
     }
 
     @Override
     public Children isNotNull(boolean condition, R column) {
-        return doIt(condition, () -> columnToString(column), IS_NOT_NULL);
+        return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), IS_NOT_NULL));
     }
 
     @Override
     public Children in(boolean condition, R column, Collection<?> coll) {
-        return doIt(condition, () -> columnToString(column), IN, inExpression(coll));
+        return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), IN, inExpression(coll)));
     }
 
     @Override
     public Children notIn(boolean condition, R column, Collection<?> coll) {
-        return doIt(condition, () -> columnToString(column), NOT_IN, inExpression(coll));
+        return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), NOT_IN, inExpression(coll)));
     }
 
     @Override
     public Children inSql(boolean condition, R column, String inValue) {
-        return doIt(condition, () -> columnToString(column), IN, () -> String.format("(%s)", inValue));
+        return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), IN,
+            () -> String.format("(%s)", inValue)));
     }
 
     @Override
     public Children notInSql(boolean condition, R column, String inValue) {
-        return doIt(condition, () -> columnToString(column), NOT_IN, () -> String.format("(%s)", inValue));
+        return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), NOT_IN,
+            () -> String.format("(%s)", inValue)));
     }
 
     @Override
     public Children groupBy(boolean condition, R column, R... columns) {
-        if (condition) {
+        return maybeDo(condition, () -> {
             String one = columnToString(column);
             if (ArrayUtils.isNotEmpty(columns)) {
                 one += (StringPool.COMMA + columnsToString(columns));
             }
             final String finalOne = one;
-            doIt(true, GROUP_BY, () -> finalOne);
-        }
-        return typedThis;
+            appendSqlSegments(GROUP_BY, () -> finalOne);
+        });
     }
 
     @Override
     public Children orderBy(boolean condition, boolean isAsc, R column, R... columns) {
-        if (condition) {
-            SqlKeyword mode = isAsc ? ASC : DESC;
-            doIt(true, ORDER_BY, () -> columnToString(column), mode);
+        return maybeDo(condition, () -> {
+            final SqlKeyword mode = isAsc ? ASC : DESC;
+            appendSqlSegments(ORDER_BY, columnToSqlSegment(column), mode);
             if (ArrayUtils.isNotEmpty(columns)) {
                 for (R c : columns) {
-                    doIt(true, ORDER_BY, () -> columnToString(c), mode);
+                    appendSqlSegments(ORDER_BY, columnToSqlSegment(c), mode);
                 }
             }
-        }
-        return typedThis;
+        });
     }
 
     @Override
     public Children having(boolean condition, String sqlHaving, Object... params) {
-        return doIt(condition, HAVING, () -> formatSqlIfNeed(condition, sqlHaving, params));
+        return maybeDo(condition, () -> appendSqlSegments(HAVING,
+            () -> formatSqlMaybeWithParam(sqlHaving, null, params)));
     }
 
     @Override
     public Children func(boolean condition, Consumer<Children> consumer) {
-        if (condition) {
-            consumer.accept(typedThis);
-        }
-        return typedThis;
+        return maybeDo(condition, () -> consumer.accept(typedThis));
     }
 
     /**
@@ -337,7 +337,7 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
      * <p>NOT 关键词</p>
      */
     protected Children not(boolean condition) {
-        return doIt(condition, NOT);
+        return maybeDo(condition, () -> appendSqlSegments(NOT));
     }
 
     /**
@@ -345,7 +345,7 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
      * <p>拼接 AND</p>
      */
     protected Children and(boolean condition) {
-        return doIt(condition, AND);
+        return maybeDo(condition, () -> appendSqlSegments(AND));
     }
 
     /**
@@ -353,7 +353,8 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
      * <p>拼接 LIKE 以及 值</p>
      */
     protected Children likeValue(boolean condition, SqlKeyword keyword, R column, Object val, SqlLike sqlLike) {
-        return doIt(condition, () -> columnToString(column), keyword, () -> formatSql("{0}", SqlUtils.concatLike(val, sqlLike)));
+        return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), keyword,
+            () -> formatParam(null, SqlUtils.concatLike(val, sqlLike))));
     }
 
     /**
@@ -365,7 +366,8 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
      * @param val        条件值
      */
     protected Children addCondition(boolean condition, R column, SqlKeyword sqlKeyword, Object val) {
-        return doIt(condition, () -> columnToString(column), sqlKeyword, () -> formatSql("{0}", val));
+        return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), sqlKeyword,
+            () -> formatParam(null, val)));
     }
 
     /**
@@ -374,12 +376,11 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
      * @param condition 查询条件值
      */
     protected Children addNestedCondition(boolean condition, Consumer<Children> consumer) {
-        if (condition) {
+        return maybeDo(condition, () -> {
             final Children instance = instance();
             consumer.accept(instance);
-            return doIt(true, APPLY, instance);
-        }
-        return typedThis;
+            appendSqlSegments(APPLY, instance);
+        });
     }
 
     /**
@@ -392,7 +393,6 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
      * <p>
      * 支持 "{0}" 这种,或者 "sql {0} sql" 这种
      *
-     * @param need    是否需要进行操作
      * @param sqlStr  可能是sql片段
      * @param mapping 例如: "javaType=int,jdbcType=NUMERIC,typeHandler=xxx.xxx.MyTypeHandler" 这种
      * @param params  参数
@@ -400,11 +400,13 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
      */
     protected final String formatSqlMaybeWithParam(String sqlStr, String mapping, Object... params) {
         if (StringUtils.isBlank(sqlStr)) {
+            // todo 何时会这样?
             return null;
         }
         if (ArrayUtils.isNotEmpty(params)) {
             for (int i = 0; i < params.length; ++i) {
-                sqlStr = sqlStr.replace(String.format("{%s}", i), formatParam(mapping, params[i]));
+                final String target = Constants.LEFT_BRACE + i + Constants.RIGHT_BRACE;
+                sqlStr = sqlStr.replace(target, formatParam(mapping, params[i]));
             }
         }
         return sqlStr;
@@ -424,55 +426,18 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
         return SqlScriptUtils.safeParam(paramStr, mapping);
     }
 
-    protected final Children maybeDoIt(boolean condition, Consumer<Children> consumer) {
-        if (condition) {
-            consumer.accept(typedThis);
-        }
-        return typedThis;
-    }
-
     /**
-     * 格式化SQL
-     *
-     * @param sqlStr SQL语句部分
-     * @param params 参数集
-     * @return sql
-     */
-    protected final String formatSql(String sqlStr, Object... params) {
-        return formatSqlIfNeed(true, sqlStr, params);
-    }
-
-    /**
-     * <p>
-     * 根据需要格式化SQL<br>
-     * <br>
-     * Format SQL for methods: EntityQ<T>.where/and/or...("name={0}", value);
-     * ALL the {<b>i</b>} will be replaced with #{MPGENVAL<b>i</b>}<br>
-     * <br>
-     * ew.where("sample_name=<b>{0}</b>", "haha").and("sample_age &gt;<b>{0}</b>
-     * and sample_age&lt;<b>{1}</b>", 18, 30) <b>TO</b>
-     * sample_name=<b>#{MPGENVAL1}</b> and sample_age&gt;#<b>{MPGENVAL2}</b> and
-     * sample_age&lt;<b>#{MPGENVAL3}</b><br>
-     * </p>
+     * 函数化的做事
      *
-     * @param need   是否需要格式化
-     * @param sqlStr SQL语句部分
-     * @param params 参数集
-     * @return sql
+     * @param condition 做不做
+     * @param something 做什么
+     * @return Children
      */
-    protected final String formatSqlIfNeed(boolean need, String sqlStr, Object... params) {
-        if (!need || StringUtils.isBlank(sqlStr)) {
-            return null;
-        }
-        if (ArrayUtils.isNotEmpty(params)) {
-            for (int i = 0; i < params.length; ++i) {
-                String genParamName = Constants.WRAPPER_PARAM + paramNameSeq.incrementAndGet();
-                sqlStr = sqlStr.replace(String.format("{%s}", i),
-                    String.format(Constants.WRAPPER_PARAM_FORMAT, Constants.WRAPPER, genParamName));
-                paramNameValuePairs.put(genParamName, params[i]);
-            }
+    protected final Children maybeDo(boolean condition, DoSomething something) {
+        if (condition) {
+            something.doIt();
         }
-        return sqlStr;
+        return typedThis;
     }
 
     /**
@@ -481,7 +446,10 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
      * @param value 集合
      */
     protected ISqlSegment inExpression(Collection<?> value) {
-        return () -> value.stream().map(i -> formatSql("{0}", i))
+        if (CollectionUtils.isEmpty(value)) {
+            return () -> "()";
+        }
+        return () -> value.stream().map(i -> formatParam(null, i))
             .collect(joining(StringPool.COMMA, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET));
     }
 
@@ -509,17 +477,12 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
     }
 
     /**
-     * 对sql片段进行组装
+     * 添加 where 片段
      *
-     * @param condition   是否执行
-     * @param sqlSegments sql片段数组
-     * @return children
+     * @param sqlSegments ISqlSegment 数组
      */
-    protected Children doIt(boolean condition, ISqlSegment... sqlSegments) {
-        if (condition) {
-            expression.add(sqlSegments);
-        }
-        return typedThis;
+    protected void appendSqlSegments(ISqlSegment... sqlSegments) {
+        expression.add(sqlSegments);
     }
 
     @Override
@@ -552,6 +515,13 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
         return paramNameValuePairs;
     }
 
+    /**
+     * 获取 columnName
+     */
+    protected final ISqlSegment columnToSqlSegment(R column) {
+        return () -> columnToString(column);
+    }
+
     /**
      * 获取 columnName
      */
@@ -573,4 +543,13 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
     public Children clone() {
         return SerializationUtils.clone(typedThis);
     }
+
+    /**
+     * 做事函数
+     */
+    @FunctionalInterface
+    public interface DoSomething {
+
+        void doIt();
+    }
 }

+ 6 - 10
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/LambdaUpdateWrapper.java

@@ -19,7 +19,7 @@ import com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper;
 import com.baomidou.mybatisplus.core.conditions.SharedString;
 import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 
@@ -76,14 +76,10 @@ public class LambdaUpdateWrapper<T> extends AbstractLambdaWrapper<T, LambdaUpdat
 
     @Override
     public LambdaUpdateWrapper<T> set(boolean condition, SFunction<T, ?> column, Object val, String mapping) {
-        if (condition) {
-            String sql = formatSql("{0}", val);
-            if (StringUtils.isNotBlank(mapping)) {
-                sql = sql.substring(0, sql.length() - 1) + StringPool.COMMA + mapping + "}";
-            }
-            sqlSet.add(String.format("%s=%s", columnToString(column), sql));
-        }
-        return typedThis;
+        return maybeDo(condition, () -> {
+            String sql = formatParam(mapping, val);
+            sqlSet.add(columnToString(column) + Constants.EQUALS + sql);
+        });
     }
 
     @Override
@@ -99,7 +95,7 @@ public class LambdaUpdateWrapper<T> extends AbstractLambdaWrapper<T, LambdaUpdat
         if (CollectionUtils.isEmpty(sqlSet)) {
             return null;
         }
-        return String.join(StringPool.COMMA, sqlSet);
+        return String.join(Constants.COMMA, sqlSet);
     }
 
     @Override

+ 6 - 6
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/Update.java

@@ -49,7 +49,7 @@ public interface Update<Children, R> extends Serializable {
     /**
      * ignore
      */
-    default Children set(R column, Object val, Class<? extends TypeHandler> typeHandler) {
+    default Children set(R column, Object val, Class<? extends TypeHandler<?>> typeHandler) {
         return set(true, column, val, typeHandler, null, null);
     }
 
@@ -61,28 +61,28 @@ public interface Update<Children, R> extends Serializable {
      * @param val       值
      * @return children
      */
-    default Children set(boolean condition, R column, Object val, Class<? extends TypeHandler> typeHandler) {
+    default Children set(boolean condition, R column, Object val, Class<? extends TypeHandler<?>> typeHandler) {
         return set(condition, column, val, typeHandler, null, null);
     }
 
     /**
      * ignore
      */
-    default Children set(R column, Object val, Class<? extends TypeHandler> typeHandler, JdbcType jdbcType) {
+    default Children set(R column, Object val, Class<? extends TypeHandler<?>> typeHandler, JdbcType jdbcType) {
         return set(true, column, val, typeHandler, jdbcType, null);
     }
 
     /**
      * ignore
      */
-    default Children set(boolean condition, R column, Object val, Class<? extends TypeHandler> typeHandler, JdbcType jdbcType) {
+    default Children set(boolean condition, R column, Object val, Class<? extends TypeHandler<?>> typeHandler, JdbcType jdbcType) {
         return set(condition, column, val, typeHandler, jdbcType, null);
     }
 
     /**
      * ignore
      */
-    default Children set(R column, Object val, Class<? extends TypeHandler> typeHandler, JdbcType jdbcType, Integer numericScale) {
+    default Children set(R column, Object val, Class<? extends TypeHandler<?>> typeHandler, JdbcType jdbcType, Integer numericScale) {
         return set(true, column, val, typeHandler, jdbcType, numericScale);
     }
 
@@ -94,7 +94,7 @@ public interface Update<Children, R> extends Serializable {
      * @param val       值
      * @return children
      */
-    default Children set(boolean condition, R column, Object val, Class<? extends TypeHandler> typeHandler, JdbcType jdbcType, Integer numericScale) {
+    default Children set(boolean condition, R column, Object val, Class<? extends TypeHandler<?>> typeHandler, JdbcType jdbcType, Integer numericScale) {
         String mapping = null;
         if (condition) {
             mapping = SqlScriptUtils.convertParamMapping(typeHandler, jdbcType, numericScale);

+ 5 - 5
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/UpdateWrapper.java

@@ -19,7 +19,7 @@ import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
 import com.baomidou.mybatisplus.core.conditions.SharedString;
 import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 
 import java.util.ArrayList;
@@ -71,14 +71,14 @@ public class UpdateWrapper<T> extends AbstractWrapper<T, String, UpdateWrapper<T
         if (CollectionUtils.isEmpty(sqlSet)) {
             return null;
         }
-        return String.join(StringPool.COMMA, sqlSet);
+        return String.join(Constants.COMMA, sqlSet);
     }
 
     @Override
     public UpdateWrapper<T> set(boolean condition, String column, Object val, String mapping) {
-        return maybeDoIt(condition, i -> {
-            String sql = formatSqlMaybeWithParam("{0}", mapping, val);
-            sqlSet.add(String.format("%s=%s", column, sql));
+        return maybeDo(condition, () -> {
+            String sql = formatParam(mapping, val);
+            sqlSet.add(column + Constants.EQUALS + sql);
         });
     }
 

+ 0 - 6
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/Wrappers.java

@@ -15,7 +15,6 @@
  */
 package com.baomidou.mybatisplus.core.toolkit;
 
-import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
@@ -230,11 +229,6 @@ public final class Wrappers {
             throw new UnsupportedOperationException();
         }
 
-        @Override
-        protected EmptyWrapper<T> doIt(boolean condition, ISqlSegment... sqlSegments) {
-            throw new UnsupportedOperationException();
-        }
-
         @Override
         public String getSqlSegment() {
             return null;

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/sql/SqlScriptUtils.java

@@ -210,7 +210,7 @@ public abstract class SqlScriptUtils implements Constants {
         return null;
     }
 
-    public static String convertParamMapping(Class<? extends TypeHandler> typeHandler, JdbcType jdbcType, Integer numericScale) {
+    public static String convertParamMapping(Class<? extends TypeHandler<?>> typeHandler, JdbcType jdbcType, Integer numericScale) {
         if (typeHandler == null && jdbcType == null && numericScale == null) {
             return null;
         }

+ 20 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/conditions/BaseWrapperTest.java

@@ -0,0 +1,20 @@
+package com.baomidou.mybatisplus.core.conditions;
+
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * @author miemie
+ * @since 2021-01-27
+ */
+class BaseWrapperTest {
+
+    void logParams(AbstractWrapper<?, ?, ?> wrapper) {
+        wrapper.getParamNameValuePairs().forEach((k, v) -> {
+            System.out.println("key: '" + k + "'\t\tvalue: '" + v + StringPool.SINGLE_QUOTE);
+            assertThat(k).startsWith(Constants.WRAPPER_PARAM);
+        });
+    }
+}

+ 1 - 7
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/conditions/QueryWrapperTest.java

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.MybatisConfiguration;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.test.User;
 import org.apache.ibatis.builder.MapperBuilderAssistant;
 import org.junit.jupiter.api.Test;
@@ -18,7 +17,7 @@ import static org.assertj.core.api.Assertions.assertThat;
  * @author miemie
  * @since 2021-01-27
  */
-class QueryWrapperTest {
+class QueryWrapperTest extends BaseWrapperTest {
 
     private void log(String message) {
         System.out.println(message);
@@ -31,11 +30,6 @@ class QueryWrapperTest {
         assertThat(wrapper.getTargetSql().trim()).isEqualTo(targetSql);
     }
 
-    private <T> void logParams(QueryWrapper<T> wrapper) {
-        wrapper.getParamNameValuePairs().forEach((k, v) ->
-            System.out.println("key: '" + k + "'\t\tvalue: '" + v + StringPool.SINGLE_QUOTE));
-    }
-
     @Test
     void test() {
         try {

+ 1 - 8
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/conditions/UpdateWrapperTest.java

@@ -1,9 +1,7 @@
 package com.baomidou.mybatisplus.core.conditions;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.Update;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.test.User;
 import org.apache.ibatis.type.JdbcType;
 import org.apache.ibatis.type.StringTypeHandler;
@@ -14,7 +12,7 @@ import org.junit.jupiter.api.Test;
  * @author miemie
  * @since 2021-01-27
  */
-class UpdateWrapperTest {
+class UpdateWrapperTest extends BaseWrapperTest {
 
     private void logSqlSet(String explain, Update<?, ?> wrapper, String targetSql) {
         System.out.printf(" ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓   ->(%s)<-   ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓%n", explain);
@@ -22,11 +20,6 @@ class UpdateWrapperTest {
         Assertions.assertThat(wrapper.getSqlSet().trim()).isEqualTo(targetSql);
     }
 
-    private <T> void logParams(UpdateWrapper<T> wrapper) {
-        wrapper.getParamNameValuePairs().forEach((k, v) ->
-            System.out.println("key: '" + k + "'\t\tvalue: '" + v + StringPool.SINGLE_QUOTE));
-    }
-
     @Test
     void test1() {
         UpdateWrapper<User> wrapper = new UpdateWrapper<User>()

+ 1 - 1
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/conditions/update/LambdaUpdateChainWrapper.java

@@ -42,7 +42,7 @@ public class LambdaUpdateChainWrapper<T> extends AbstractChainWrapper<T, SFuncti
 
     @Override
     public LambdaUpdateChainWrapper<T> set(boolean condition, SFunction<T, ?> column, Object val, String mapping) {
-        wrapperChildren.set(condition, column, val,mapping);
+        wrapperChildren.set(condition, column, val, mapping);
         return typedThis;
     }
 

+ 4 - 7
mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtUpdateWrapper.kt

@@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.core.conditions.SharedString
 import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments
 import com.baomidou.mybatisplus.core.conditions.update.Update
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils
+import com.baomidou.mybatisplus.core.toolkit.Constants
 import com.baomidou.mybatisplus.core.toolkit.StringPool
 import com.baomidou.mybatisplus.core.toolkit.StringUtils
 import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache
@@ -75,14 +76,10 @@ class KtUpdateWrapper<T : Any> : AbstractKtWrapper<T, KtUpdateWrapper<T>>, Updat
     }
 
     override fun set(condition: Boolean, column: KProperty<*>, value: Any?, mapping: String?): KtUpdateWrapper<T> {
-        if (condition) {
-            var sql = formatSql("{0}", value)
-            if (StringUtils.isNotBlank(mapping)) {
-                sql = sql.substring(0, sql.length - 1) + StringPool.COMMA + mapping + "}"
-            }
-            sqlSet.add(String.format("%s=%s", columnToString(column), sql))
+        return maybeDo(condition) {
+            val sql = formatParam(mapping, value)
+            sqlSet.add(columnsToString(column) + Constants.EQUALS + sql)
         }
-        return typedThis
     }
 
     override fun instance(): KtUpdateWrapper<T> {