|
@@ -15,6 +15,7 @@
|
|
|
*/
|
|
|
package com.baomidou.mybatisplus.core.assist;
|
|
|
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
import org.apache.ibatis.parsing.GenericTokenParser;
|
|
|
|
|
@@ -23,6 +24,13 @@ import java.util.HashMap;
|
|
|
import java.util.Map;
|
|
|
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
|
|
|
* @since 3.5.12
|
|
@@ -34,35 +42,43 @@ public abstract class AbstractSqlRunner implements ISqlRunner {
|
|
|
*
|
|
|
* @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
|
|
|
*/
|
|
|
- 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 args 参数
|
|
|
- * @return 执行语句
|
|
|
+ * @return 执行语句 (带参数占位符)
|
|
|
* @since 3.5.12
|
|
|
*/
|
|
|
protected String parse(String sql, Object... args) {
|
|
|
if (args != null && args.length == 1) {
|
|
|
Object arg = args[0];
|
|
|
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()) {
|
|
|
- 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 {
|
|
|
- return "#{arg0." + content + "}";
|
|
|
+ return HASH_LEFT_BRACE + ARG0 + DOT + content + RIGHT_BRACE;
|
|
|
}
|
|
|
}).parse(sql);
|
|
|
}
|
|
@@ -82,7 +98,7 @@ public abstract class AbstractSqlRunner implements ISqlRunner {
|
|
|
for (int i = 0; i < args.length; i++) {
|
|
|
Object arg = args[i];
|
|
|
if (i == 0) {
|
|
|
- params.put("arg0", arg);
|
|
|
+ params.put(ARG0, arg);
|
|
|
}
|
|
|
params.put(String.valueOf(i), arg);
|
|
|
}
|
|
@@ -91,4 +107,45 @@ public abstract class AbstractSqlRunner implements ISqlRunner {
|
|
|
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;
|
|
|
+ }
|
|
|
+
|
|
|
}
|