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,23 +108,55 @@ 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 }
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;
}
} else if (ch == '"') {
if (quote == 0) {
quote = ch;
} else if (quote == '"') {
quote = 0;
}
}
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) { if (value == null) {
sql = sql.replaceFirst("\\?", "null"); return "null";
} }
// number // number
else if (value instanceof Number || value instanceof Boolean) { else if (value instanceof Number || value instanceof Boolean) {
sql = sql.replaceFirst("\\?", value.toString()); return value.toString();
} }
// array // array
else if (ClassUtil.isArray(value.getClass())) { else if (ClassUtil.isArray(value.getClass())) {
StringJoiner joiner = new StringJoiner(","); StringJoiner joiner = new StringJoiner(",", "[", "]");
for (int i = 0; i < Array.getLength(value); i++) { for (int i = 0; i < Array.getLength(value); i++) {
joiner.add(String.valueOf(Array.get(value, i))); joiner.add(String.valueOf(Array.get(value, i)));
} }
sql = sql.replaceFirst("\\?", "[" + joiner + "]"); return joiner.toString();
} }
// other // other
else { else {
@ -138,12 +170,9 @@ public class SqlUtil {
sb.append(value); sb.append(value);
} }
sb.append("'"); sb.append("'");
sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(sb.toString())); return Matcher.quoteReplacement(sb.toString());
} }
} }
}
return sql;
}
public static String buildSqlParamPlaceholder(int count) { public static String buildSqlParamPlaceholder(int count) {

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);
} }