miemie 4 年之前
父節點
當前提交
935008e011

+ 36 - 6
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractWrapper.java

@@ -23,6 +23,7 @@ import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
 import com.baomidou.mybatisplus.core.enums.SqlKeyword;
 import com.baomidou.mybatisplus.core.enums.SqlLike;
 import com.baomidou.mybatisplus.core.toolkit.*;
+import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.StringEscape;
 
@@ -386,21 +387,50 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
      */
     protected abstract Children instance();
 
-    protected final String formatParamIfNeed(boolean need, String sqlStr, String mapping, Object... params) {
-        if (!need || StringUtils.isBlank(sqlStr)) {
+    /**
+     * 格式化 sql
+     * <p>
+     * 支持 "{0}" 这种,或者 "sql {0} sql" 这种
+     *
+     * @param need    是否需要进行操作
+     * @param sqlStr  可能是sql片段
+     * @param mapping 例如: "javaType=int,jdbcType=NUMERIC,typeHandler=xxx.xxx.MyTypeHandler" 这种
+     * @param params  参数
+     * @return sql片段
+     */
+    protected final String formatSqlMaybeWithParam(String sqlStr, String mapping, Object... params) {
+        if (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]);
+                sqlStr = sqlStr.replace(String.format("{%s}", i), formatParam(mapping, params[i]));
             }
         }
         return sqlStr;
     }
 
+    /**
+     * 处理入参
+     *
+     * @param mapping 例如: "javaType=int,jdbcType=NUMERIC,typeHandler=xxx.xxx.MyTypeHandler" 这种
+     * @param param   参数
+     * @return value
+     */
+    protected final String formatParam(String mapping, Object param) {
+        final String genParamName = Constants.WRAPPER_PARAM + paramNameSeq.incrementAndGet();
+        final String paramStr = Constants.WRAPPER_PARAM_PREFIX + genParamName;
+        paramNameValuePairs.put(genParamName, param);
+        return SqlScriptUtils.safeParam(paramStr, mapping);
+    }
+
+    protected final Children maybeDoIt(boolean condition, Consumer<Children> consumer) {
+        if (condition) {
+            consumer.accept(typedThis);
+        }
+        return typedThis;
+    }
+
     /**
      * 格式化SQL
      *

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

@@ -76,14 +76,10 @@ public class UpdateWrapper<T> extends AbstractWrapper<T, String, UpdateWrapper<T
 
     @Override
     public UpdateWrapper<T> set(boolean condition, String 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 + "}";
-            }
+        return maybeDoIt(condition, i -> {
+            String sql = formatSqlMaybeWithParam("{0}", mapping, val);
             sqlSet.add(String.format("%s=%s", column, sql));
-        }
-        return typedThis;
+        });
     }
 
     @Override

+ 1 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/Constants.java

@@ -139,4 +139,5 @@ public interface Constants extends StringPool, Serializable {
 
     String WRAPPER_PARAM = "MPGENVAL";
     String WRAPPER_PARAM_FORMAT = "#{%s.paramNameValuePairs.%s}";
+    String WRAPPER_PARAM_PREFIX = WRAPPER_DOT + "paramNameValuePairs" + DOT;
 }

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

@@ -1,7 +1,9 @@
 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;
@@ -20,6 +22,11 @@ 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>()
@@ -30,5 +37,6 @@ class UpdateWrapperTest {
             "name=#{ew.paramNameValuePairs.MPGENVAL1,typeHandler=org.apache.ibatis.type.StringTypeHandler}," +
                 "name=#{ew.paramNameValuePairs.MPGENVAL2,typeHandler=org.apache.ibatis.type.StringTypeHandler,jdbcType=VARCHAR}," +
                 "name=#{ew.paramNameValuePairs.MPGENVAL3,typeHandler=org.apache.ibatis.type.StringTypeHandler,jdbcType=VARCHAR,numericScale=2}");
+        logParams(wrapper);
     }
 }