Procházet zdrojové kódy

调整参数组装方法(支持子类复用)

nieqiurong před 2 měsíci
rodič
revize
e7c8876d11

+ 67 - 10
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/assist/AbstractSqlRunner.java

@@ -15,6 +15,7 @@
  */
  */
 package com.baomidou.mybatisplus.core.assist;
 package com.baomidou.mybatisplus.core.assist;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import org.apache.ibatis.parsing.GenericTokenParser;
 import org.apache.ibatis.parsing.GenericTokenParser;
 
 
@@ -23,6 +24,13 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
 import java.util.regex.Pattern;
 import java.util.regex.Pattern;
 
 
+import static com.baomidou.mybatisplus.core.toolkit.StringPool.DOT;
+import static com.baomidou.mybatisplus.core.toolkit.StringPool.HASH_LEFT_BRACE;
+import static com.baomidou.mybatisplus.core.toolkit.StringPool.LEFT_BRACE;
+import static com.baomidou.mybatisplus.core.toolkit.StringPool.LEFT_SQ_BRACKET;
+import static com.baomidou.mybatisplus.core.toolkit.StringPool.RIGHT_BRACE;
+import static com.baomidou.mybatisplus.core.toolkit.StringPool.RIGHT_SQ_BRACKET;
+
 /**
 /**
  * @author nieqiurong
  * @author nieqiurong
  * @since 3.5.12
  * @since 3.5.12
@@ -34,35 +42,43 @@ public abstract class AbstractSqlRunner implements ISqlRunner {
      *
      *
      * @since 3.5.12
      * @since 3.5.12
      */
      */
-    private static final GenericTokenParser DEFAULT_TOKEN_PARSER = new GenericTokenParser("{", "}", content -> "#{" + content + "}");
+    private static final GenericTokenParser DEFAULT_TOKEN_PARSER = new GenericTokenParser(LEFT_BRACE, RIGHT_BRACE, content -> HASH_LEFT_BRACE + content + RIGHT_BRACE);
 
 
     /**
     /**
      * 校验索引正则
      * 校验索引正则
      *
      *
      * @since 3.5.12
      * @since 3.5.12
      */
      */
-    private final Pattern pattern = Pattern.compile("^\\d+$");
+    private static final Pattern INDEX_PATTERN = Pattern.compile("^\\d+$");
+
+    /**
+     * 第一个值参数key
+     *
+     * @since 3.5.12
+     */
+    private static final String ARG0 = "arg0";
+
 
 
     /**
     /**
-     * 获取执行语句
+     * 获取执行语句 (将原始占位符语句转换为标准占位符语句)
      *
      *
      * @param sql  原始sql
      * @param sql  原始sql
      * @param args 参数
      * @param args 参数
-     * @return 执行语句
+     * @return 执行语句 (带参数占位符)
      * @since 3.5.12
      * @since 3.5.12
      */
      */
     protected String parse(String sql, Object... args) {
     protected String parse(String sql, Object... args) {
         if (args != null && args.length == 1) {
         if (args != null && args.length == 1) {
             Object arg = args[0];
             Object arg = args[0];
             Class<?> clazz = arg.getClass();
             Class<?> clazz = arg.getClass();
-            return new GenericTokenParser("{", "}", content -> {
-                if (pattern.matcher(content).matches()) {
+            return new GenericTokenParser(LEFT_BRACE, RIGHT_BRACE, content -> {
+                if (INDEX_PATTERN.matcher(content).matches()) {
                     if (arg instanceof Collection || clazz.isArray()) {
                     if (arg instanceof Collection || clazz.isArray()) {
-                        return "#{arg0[" + content + "]}";
+                        return HASH_LEFT_BRACE + ARG0 + LEFT_SQ_BRACKET + content + RIGHT_SQ_BRACKET + RIGHT_BRACE;
                     }
                     }
-                    return "#{" + content + "}";
+                    return HASH_LEFT_BRACE + content + RIGHT_BRACE;
                 } else {
                 } else {
-                    return "#{arg0." + content + "}";
+                    return HASH_LEFT_BRACE + ARG0 + DOT + content + RIGHT_BRACE;
                 }
                 }
             }).parse(sql);
             }).parse(sql);
         }
         }
@@ -82,7 +98,7 @@ public abstract class AbstractSqlRunner implements ISqlRunner {
             for (int i = 0; i < args.length; i++) {
             for (int i = 0; i < args.length; i++) {
                 Object arg = args[i];
                 Object arg = args[i];
                 if (i == 0) {
                 if (i == 0) {
-                    params.put("arg0", arg);
+                    params.put(ARG0, arg);
                 }
                 }
                 params.put(String.valueOf(i), arg);
                 params.put(String.valueOf(i), arg);
             }
             }
@@ -91,4 +107,45 @@ public abstract class AbstractSqlRunner implements ISqlRunner {
         return new HashMap<>();
         return new HashMap<>();
     }
     }
 
 
+    /**
+     * 获取sqlMap参数
+     * <p>
+     * 自3.5.12开始,(当传入的参数是单参数时,支持使用Map,Array,List,JavaBean)
+     * <li>当参数为 Map 时可通过{key}进行属性访问
+     * <li>当参数为 JavaBean 时可通过{property}进行属性访问
+     * <li>当参数为 List 时直接访问索引 {0} </li>
+     * <li>当参数为 Array 时直接访问索引 {0} </li>
+     * </p>
+     *
+     * @param sql  指定参数的格式: {0}, {1} 或者 {property1}, {property2}
+     * @param args 参数
+     * @return 参数集合
+     */
+    protected Map<String, Object> sqlMap(String sql, Object... args) {
+        Map<String, Object> sqlMap = getParams(args);
+        sqlMap.put(SQL, parse(sql, args));
+        return sqlMap;
+    }
+
+    /**
+     * <p>
+     * 自3.5.12开始,(当传入的参数是单参数时,支持使用Map,Array,List,JavaBean)
+     * <li>当参数为 Map 时可通过{key}进行属性访问
+     * <li>当参数为 JavaBean 时可通过{property}进行属性访问
+     * <li>当参数为 List 时直接访问索引 {0} </li>
+     * <li>当参数为 Array 时直接访问索引 {0} </li>
+     * </p>
+     *
+     * @param sql  指定参数的格式: {0}, {1} 或者 {property1}, {property2}
+     * @param page 分页模型
+     * @param args 参数
+     * @return 参数集合
+     */
+    protected Map<String, Object> sqlMap(String sql, IPage<?> page, Object... args) {
+        Map<String, Object> sqlMap = getParams(args);
+        sqlMap.put(PAGE, page);
+        sqlMap.put(SQL, parse(sql, args));
+        return sqlMap;
+    }
+
 }
 }

+ 0 - 34
mybatis-plus-spring/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SqlRunner.java

@@ -132,40 +132,6 @@ public class SqlRunner extends AbstractSqlRunner {
         }
         }
     }
     }
 
 
-    /**
-     * 获取sqlMap参数
-     * <p>
-     * 自3.5.12开始,(当传入的参数是单参数时,支持使用Map,Array,List,JavaBean)
-     * <li>当参数为 Map 时可通过{key}进行属性访问
-     * <li>当参数为 JavaBean 时可通过{property}进行属性访问
-     * <li>当参数为 List 时直接访问索引 {0} </li>
-     * </p>
-     *
-     * @param sql  指定参数的格式: {0}, {1} 或者 {property1}, {property2}
-     * @param args 参数
-     * @return 参数集合
-     */
-    private Map<String, Object> sqlMap(String sql, Object... args) {
-        Map<String, Object> sqlMap = getParams(args);
-        sqlMap.put(SQL, parse(sql, args));
-        return sqlMap;
-    }
-
-    /**
-     * 获取sqlMap参数
-     *
-     * @param sql  指定参数的格式: {0}, {1} 或者 {property1}, {property2}
-     * @param page 分页模型
-     * @param args 参数
-     * @return 参数集合
-     */
-    private Map<String, Object> sqlMap(String sql, IPage<?> page, Object... args) {
-        Map<String, Object> sqlMap = getParams(args);
-        sqlMap.put(PAGE, page);
-        sqlMap.put(SQL, parse(sql, args));
-        return sqlMap;
-    }
-
     /**
     /**
      * 执行更新语句
      * 执行更新语句
      *
      *

+ 3 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/SqlRunnerTest.java

@@ -168,6 +168,9 @@ class SqlRunnerTest {
         Assertions.assertEquals("测试学生", resultMap.get("NAME"));
         Assertions.assertEquals("测试学生", resultMap.get("NAME"));
         Assertions.assertEquals(AgeEnum.THREE.getValue(), resultMap.get("AGE"));
         Assertions.assertEquals(AgeEnum.THREE.getValue(), resultMap.get("AGE"));
         Assertions.assertEquals(11003L, resultMap.get("ID"));
         Assertions.assertEquals(11003L, resultMap.get("ID"));
+        Assertions.assertNull(SqlRunner.db().selectOne("select * from h2student where id = {0} and name= {1}", (Object) new Object[]{11003L, "234"}));
+        Assertions.assertNull(SqlRunner.db().selectOne("select * from h2student where id = {0} and name= {1}", new Object[]{11003L, "234"}));
+        Assertions.assertNull(SqlRunner.db().selectOne("select * from h2student where id = {0} and name= {1}", 11003L, "234"));
     }
     }
 
 
     @Test
     @Test