常量的Stringbuilder

时间:2017-12-15 07:51:14

标签: java

在应用程序中,我们使用了很多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" );

任何人都可以建议

3 个答案:

答案 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。