读书人

小弟我有个哥们写sql语句喜欢用String

发布时间: 2012-04-22 18:34:46 作者: rapoo

我有个哥们写sql语句喜欢用StringBuffer,你喜欢用什么啊?
我一般都用String ,哪个好点啊?

[解决办法]
此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
楼主【dd121011】截止到2008-06-26 14:07:31的历史汇总数据(不包括此帖):
发帖数:109 发帖分:2511
结贴数:104 结贴分:2251
未结数:5 未结分:260
结贴率:95.41 % 结分率:89.65 %
值得尊敬
[解决办法]
这不是喜好的问题,是与占多少内存有关的。
关键看你的sql是一个字符串还是多个部分拼成的,如果是一个字符串用String,多个部分拼成的就必须用StringBuffer。

另外,其实多数情况下,SQL是放在.properties文件里的。
[解决办法]

探讨
这不是喜好的问题,是与占多少内存有关的。
关键看你的sql是一个字符串还是多个部分拼成的,如果是一个字符串用String,多个部分拼成的就必须用StringBuffer。

另外,其实多数情况下,SQL是放在.properties文件里的。

[解决办法]
个人觉得还是StringBuffer要好些,可以根据条件进行SQL的拼接啊。效率要比你用+号连起来高
不过如果你的sql很固定,没有必要拼接,那就领当别论了。
[解决办法]
去看下stringBuffer的源码就明白了
[解决办法]
StringBuilder 更快。
[解决办法]
效率不一样,
StringBuffer适用于字符串本身频繁变化的情况,比如经常附加一段新字符串到原字符串上;
String适合那些定义以后不怎么变化,只是引用他的情况
[解决办法]
前几天正好也在研究这个问题,我把我找到的资料与你分享下:

(下面是转贴的)
使用String还是StringBuffer?

出于方便的考虑,我们在进行字符串的内容处理的时候往往会出现以下的代码:
        String result="";
        result+="ok";

这段代码看上去好像没有什么问题,但是需要指出的是其性能很低,原因是java中的String类不可变的(immutable),这段代码实际的工作过程会是如何的呢?通过使用javap工具我们可以知道其实上面的代码在编译成字节码的时候等同的源代码是:
        String result="";
        StringBuffer temp=new StringBuffer();
        temp.append(result);
        temp.append("ok");
        result=temp.toString();

短短的两个语句怎么呢变成这么多呢?问题的原因就在String类的不可变性上,而java程序为了方便简单的字符串使用方式对+操作符进行了重载,而这个重载的处理可能因此误导很多对java中String的使用。
下面给出一个完整的代码:
1. public class Perf {
2.   public static String detab1(String s)
3.   {
4.     if (s.indexOf('\t') == -1)
5.       return s;
6.     String res = "";
7.     int len = s.length();
8.     int pos = 0;
9.     int i = 0;
10.     for (; i < len && s.charAt(i) == '\t'; i++) 
11.     {
12.       res += "        ";
13.       pos += 8;
14.     }
15.     for (; i < len; i++) 
16.     {
17.       char c = s.charAt(i);
18.       if (c == '\t') {
19.         do {


20.           res += " ";
21.           pos++;
22.         } while (pos % 8 != 0);
23.       }
24.       else {
25.         res += c;
26.         pos++;
27.       }
28.     }
29.     return res;
30.   }
31.       
32.   public static String detab2(String s)
33.   {
34.     if (s.indexOf('\t') == -1)
35.       return s;
36.     StringBuffer sb = new StringBuffer();
37.     int len = s.length();
38.     int pos = 0;
39.     int i = 0;
40.     for (; i < len && s.charAt(i) == '\t'; i++) 
41.     {
42.       sb.append("        ");
43.       pos += 8;
44.     }
45.     for (; i < len; i++) {
46.       char c = s.charAt(i);
47.       if (c == '\t') {
48.         do {
49.           sb.append(' ');
50.           pos++;
51.         } while (pos % 8 != 0);
52.       }
53.       else {
54.         sb.append(c);
55.         pos++;
56.       }
57.     }
58.     return sb.toString();
59.   }
60.         
61.   public static String testlist[] = {
62.     "",
63.     "\t",
64.     "\t\t\tabc",
65.     "abc\tdef",
66.     "1234567\t8",
67.     "12345678\t9",
68.     "123456789\t"
69.   };
70.         
71.   public static void main(String args[])
72.   {
73.     for (int i = 0; i < testlist.length; i++) {
74.       String tc = testlist[i];
75.       if (!detab1(tc).equals(detab2(tc)))


76.         System.err.println(tc);
77.      }
78.         
79.      String test_string =
80.        "\t\tthis is a test\tof detabbing performance";
81.      int N = 5000;
82.      int i = 0;
83.         
84.      long ct = System.currentTimeMillis();
85.      for (i = 1; i <= N; i++)
86.        detab1(test_string);
87.      long elapsed = System.currentTimeMillis() - ct;
88.      System.out.println("String time = " + elapsed);
89.          
90.      ct = System.currentTimeMillis();
91.      for (i = 1; i <= N; i++)
92.        detab2(test_string);
93.      elapsed = System.currentTimeMillis() - ct;
94.      System.out.println("StringBuffer time = " 
95.        + elapsed);
96.    }
97. }
执行以上代码的结果可以看到使用StringBuffer的版本的方法比使用String版本的一般都快十倍以上(本人使用的是JDK1.4.0),你可以执行一下看看结果到底如何。

因此得到的结论是:如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法好了!也许这就是你的程序的性能瓶颈!
[解决办法]
意义不大效率上的差别可以忽略不计了还影响了美观
[解决办法]
以前写代码的时候也明和的String
后面看公司里的系统,别人都用StringBuffer,问了我同事,也没说什么实质的东西,就知道这么写比较好,所以现在一直用这种方式,不仅是写SQL语句,还有其他的,需要字符串连接等功能的时候都会使用StringBuffer
[解决办法]
影响很大吗?
[解决办法]
如果用string和StringBuilder来拼接字符串的话StringBuilder肯定要好点
比如String str="";str=str+"aaa";
这样str就是两个对象,如果用StringBuilder就不存在这个问题了
[解决办法]
俺们公司要求stringbuffer
毕竟是省点内存的
[解决办法]

探讨
StringBuilder 更快!!!!!!因为省去了作线程同步的开销和时间。

[解决办法]
9楼的很详细

对于要拼接的SQL用StringBuffer
[解决办法]
一个sql语句就用String,如果进行拼接操作的话,还是StringBuffer吧,确实省内存。能省点尽量省点。
[解决办法]
探讨
一个sql语句就用String,如果进行拼接操作的话,还是StringBuffer吧,确实省内存。能省点尽量省点。

[解决办法]
探讨
个人觉得还是StringBuffer要好些,可以根据条件进行SQL的拼接啊。效率要比你用+号连起来高
不过如果你的sql很固定,没有必要拼接,那就领当别论了。

[解决办法]
string 不可变
StringBuffer可变,省内存
------解决方案--------------------


给你看段我们现在在改的stringbuffer。。。
==================================================================

Java code
StringBuffer q = new StringBuffer();                            //バッファ        String pdtnm_tableName = CssDAO.getWithDBO(GmPdtnm.TABLE_NAME);        //PDT名称テブル名の保存                // PDT名称DBのフィルド名称配列        String [] pdtnm_fields = new String [] {            GmPdtnm.pdtkind,    GmPdtnm.cd1,    GmPdtnm.cd2,    GmPdtnm.cd3,            GmPdtnm.snm1,        GmPdtnm.snm2,    GmPdtnm.nm,        GmPdtnm.entdttm,            GmPdtnm.dttm,        GmPdtnm.who,        };                // Select句の作成        q.append("SELECT ");        for(int i = 0; i < pdtnm_fields.length; i++){            q.append(pdtnm_fields[i]).append(", ");        }        q.append(" CASE WHEN ").append(GmPdtnm.pdtkind).append("=").append(GmPdtnm.PDTKIND7_PDT);        q.append(" THEN LPAD(TRIM(").append(GmPdtnm.cd1).append("),2,'0') ");        q.append(" ELSE ").append(GmPdtnm.cd1).append(" END AS cd1Sort,");        q.append(" LPAD(").append(GmPdtnm.pdtkind).append(",2,'8') AS SORTKEY ");                // From句の作成        q.append(" FROM ").append(pdtnm_tableName).append(" ");                // Where句の作成        q.append(" WHERE NOT ( ").append(GmPdtnm.pdtkind).append("=").append(GmPdtnm.PDTKIND7_PDT);        q.append(" AND ").append(GmPdtnm.cd1).append("=").append(GmPdtnm.PDTKIND7_PDT).append(") ");        if (searchCondition != null) {            String searchCondition_pdtkind    = (String)searchCondition.get(PdtnmScreenParams.Pdtkind);            String searchCondition_snm1        = (String)searchCondition.get(PdtnmScreenParams.Snm1);                                    String searchCondition_snm2        = (String)searchCondition.get(PdtnmScreenParams.Snm2);                                    boolean b_where = false;            // PDT条件の付加            if ( searchCondition_pdtkind != null && searchCondition_pdtkind.length() > 0){                b_where = MasterCommon.EditWildCard(q, GmPdtnm.pdtkind, searchCondition_pdtkind, b_where);            }            if ( searchCondition_snm1 != null && searchCondition_snm1.length() > 0){                b_where = MasterCommon.EditWildCard(q, GmPdtnm.snm1, searchCondition_snm1, b_where);            }                        if ( searchCondition_snm2 != null && searchCondition_snm2.length() > 0){                b_where = MasterCommon.EditWildCard(q, GmPdtnm.snm2, searchCondition_snm2, b_where);            }                    }                // Order by句の作成        q.append("order by SORTKEY,cd1Sort");        q.append(", ").append(GmPdtnm.cd2);        q.append(", ").append(GmPdtnm.cd3); 

读书人网 >Java Web开发

热点推荐