在应用程序中,我们使用了很多SQL查询,我们将它们分配给String常量。所以我的问题是用StringBuilder替换String,是否可以提高性能,因为我们必须为大型SQL查询进行大量的连接。这是以下两种方法,这是最好的方法:
方法1:
String sql= "select * from table1" + " table2 where column = :1";
方法2:
StringBuilder sql = new StringBuilder("select * from table1").
append( "table2 where column = :1" );
任何人都可以建议
答案 0 :(得分:3)
使用字符串连接(使用+
运算符)。
如果表达式是编译时常量表达式,那么它们将在编译时进行评估。
如果不是; e.g。
String sql = "select * from " + tableName() + " where column = :1";
让编译器优化连接仍然是更好的,无论表达式是否(运行时)是否恒定。他们应该使用StringBuilder
将上述内容转换为等效代码。
您应该明确考虑使用StringBuilder
的唯一情况是,当您执行以下操作时:
String sql= "select * from table where ";
for (String part: parts) {
sql += part + " ";
}
当前的编译器无法对上述内容进行优化。
最后,不要将StringBuilder
用于表示常量。它们是可变的......不是一成不变的。
作者注:以上示例仅供参考。想想SQL注入!使用PreparedStatement。
答案 1 :(得分:0)
如果你真的想使用stringbuilder,你当然可以在任何地方制作一些常用的utils类/ DB utils ,方法如下。
但我不认为这种情况会有更好的表现(或者可能是,我认为这不会是额外的改进)。从我的观点来看,看起来 @Stephen C 示例更好
public static String composeSQLQuery(String columns,String tableName,String restrictions) {
StringBuilder sb = new StringBuilder("Select");
sb.append(" ");
sb.append(columns);
sb.append(" ");
sb.append("from");
sb.append(" ");
sb.append(tableName);
sb.append(" ");
sb.append("where");
sb.append(" ");
sb.append(restrictions);
return sb.toString();
}
答案 2 :(得分:0)
在你的情况下,它不需要使用Stringbuilder,因为从jdk5开始,编译器会自动将浓度转换为stringbuilder。 例如:
String a = "abc" + "def" + "xyz";
等同于:
Stringbuilder a = new Stringbuilder();
a.append("abc");
a.append("def");
a.append("xyz");
但是如果浓度在循环中,例如:
String a = "";
for (int i = 0; i<10; i++){
a += "str";
}
然后,您应该使用Stringbuilder,因为在这种情况下,java无法优化代码并自动将浓度转换为Stringbuilder。