perf: optimize pref of SqlUtil.replaceSqlParams()

This commit is contained in:
开源海哥 2023-08-02 11:21:56 +08:00
parent 65d5c6a480
commit 46651fe8ff
2 changed files with 61 additions and 34 deletions

View File

@ -108,41 +108,70 @@ public class SqlUtil {
* @return 完整的 sql * @return 完整的 sql
*/ */
public static String replaceSqlParams(String sql, Object[] params) { public static String replaceSqlParams(String sql, Object[] params) {
if (params != null && params.length > 0) { if (params == null || params.length == 0) {
for (Object value : params) { return sql;
// null }
if (value == null) {
sql = sql.replaceFirst("\\?", "null"); StringBuilder sqlBuilder = new StringBuilder();
char quote = 0;
int index = 0;
for (int i = 0; i < sql.length(); ++i) {
char ch = sql.charAt(i);
if (ch == '\'') {
if (quote == 0) {
quote = ch;
} else if (quote == '\'') {
quote = 0;
} }
// number } else if (ch == '"') {
else if (value instanceof Number || value instanceof Boolean) { if (quote == 0) {
sql = sql.replaceFirst("\\?", value.toString()); quote = ch;
} } else if (quote == '"') {
// array quote = 0;
else if (ClassUtil.isArray(value.getClass())) {
StringJoiner joiner = new StringJoiner(",");
for (int i = 0; i < Array.getLength(value); i++) {
joiner.add(String.valueOf(Array.get(value, i)));
}
sql = sql.replaceFirst("\\?", "[" + joiner + "]");
}
// other
else {
StringBuilder sb = new StringBuilder();
sb.append("'");
if (value instanceof Date) {
sb.append(DateUtil.toDateTimeString((Date) value));
} else if (value instanceof LocalDateTime) {
sb.append(DateUtil.toDateTimeString(DateUtil.toDate((LocalDateTime) value)));
} else {
sb.append(value);
}
sb.append("'");
sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(sb.toString()));
} }
} }
if (quote == 0 && ch == '?' && index < params.length) {
sqlBuilder.append(getParamString(params, index++));
} else {
sqlBuilder.append(ch);
}
}
return sqlBuilder.toString();
}
private static String getParamString(Object[] params, int index) {
Object value = params[index];
if (value == null) {
return "null";
}
// number
else if (value instanceof Number || value instanceof Boolean) {
return value.toString();
}
// array
else if (ClassUtil.isArray(value.getClass())) {
StringJoiner joiner = new StringJoiner(",", "[", "]");
for (int i = 0; i < Array.getLength(value); i++) {
joiner.add(String.valueOf(Array.get(value, i)));
}
return joiner.toString();
}
// other
else {
StringBuilder sb = new StringBuilder();
sb.append("'");
if (value instanceof Date) {
sb.append(DateUtil.toDateTimeString((Date) value));
} else if (value instanceof LocalDateTime) {
sb.append(DateUtil.toDateTimeString(DateUtil.toDate((LocalDateTime) value)));
} else {
sb.append(value);
}
sb.append("'");
return Matcher.quoteReplacement(sb.toString());
} }
return sql;
} }

View File

@ -179,9 +179,7 @@ public class AccountSqlTester {
.where(ACCOUNT.ID.ge(100)) .where(ACCOUNT.ID.ge(100))
.and(column("aaa").in("michael", "aaa")); .and(column("aaa").in("michael", "aaa"));
IDialect dialect = new CommonsDialectImpl(); System.out.println(queryWrapper.toSQL());
String sql = dialect.forSelectByQuery(queryWrapper);
System.out.println(sql);
} }