This commit is contained in:
Looly 2022-12-14 18:20:05 +08:00
parent 31c5357409
commit 22933829e2

View File

@ -4,6 +4,7 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import java.util.Collection;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -72,7 +73,7 @@ public class NamedSql {
* @param paramMap 名和参数的对应Map * @param paramMap 名和参数的对应Map
*/ */
private void parse(final String namedSql, final Map<String, Object> paramMap) { private void parse(final String namedSql, final Map<String, Object> paramMap) {
if(MapUtil.isEmpty(paramMap)){ if (MapUtil.isEmpty(paramMap)) {
this.sql = namedSql; this.sql = namedSql;
return; return;
} }
@ -118,13 +119,13 @@ public class NamedSql {
* 替换变量如果无变量原样输出到SQL中去 * 替换变量如果无变量原样输出到SQL中去
* *
* @param nameStartChar 变量开始字符 * @param nameStartChar 变量开始字符
* @param name 变量名 * @param name 变量名
* @param sqlBuilder 结果SQL缓存 * @param sqlBuilder 结果SQL缓存
* @param paramMap 变量map非空 * @param paramMap 变量map非空
*/ */
private void replaceVar(final Character nameStartChar, final StringBuilder name, final StringBuilder sqlBuilder, final Map<String, Object> paramMap){ private void replaceVar(final Character nameStartChar, final StringBuilder name, final StringBuilder sqlBuilder, final Map<String, Object> paramMap) {
if(name.length() == 0){ if (name.length() == 0) {
if(null != nameStartChar){ if (null != nameStartChar) {
// 类似于:的情况需要补上: // 类似于:的情况需要补上:
sqlBuilder.append(nameStartChar); sqlBuilder.append(nameStartChar);
} }
@ -134,20 +135,25 @@ public class NamedSql {
// 变量结束 // 变量结束
final String nameStr = name.toString(); final String nameStr = name.toString();
if(paramMap.containsKey(nameStr)) { if (paramMap.containsKey(nameStr)) {
// 有变量对应值值可以为null替换占位符为?变量值放入相应index位置 // 有变量对应值值可以为null替换占位符为?变量值放入相应index位置
final Object paramValue = paramMap.get(nameStr); Object paramValue = paramMap.get(nameStr);
if(ArrayUtil.isArray(paramValue) && StrUtil.containsIgnoreCase(sqlBuilder, "in")){ if ((paramValue instanceof Collection || ArrayUtil.isArray(paramValue)) && StrUtil.containsIgnoreCase(sqlBuilder, "in")) {
if (paramValue instanceof Collection) {
// 转为数组
paramValue = ((Collection<?>) paramValue).toArray();
}
// 可能为select in (xxx)语句则拆分参数为多个参数变成in (?,?,?) // 可能为select in (xxx)语句则拆分参数为多个参数变成in (?,?,?)
final int length = ArrayUtil.length(paramValue); final int length = ArrayUtil.length(paramValue);
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
if(0 != i){ if (0 != i) {
sqlBuilder.append(','); sqlBuilder.append(',');
} }
sqlBuilder.append('?'); sqlBuilder.append('?');
this.params.add(ArrayUtil.get(paramValue, i)); this.params.add(ArrayUtil.get(paramValue, i));
} }
} else{ } else {
sqlBuilder.append('?'); sqlBuilder.append('?');
this.params.add(paramValue); this.params.add(paramValue);
} }