2010-09-27 43 views
0
ArrayList queryParms = new ArrayList(); 
StringBuffer sql = new StringBuffer(); 
sql.append(
"SELECT A.FLDREC_NUM, " + 
"@CHARDATE(A.FLDDATE), " + 
"T.FLDDESCR, @DEC(A.FLDLEVEL,3) " + 
" FROM @SCHEMAALCOHOL A LEFT OUTER JOIN @SCHEMADRUGCAUS T " + 
" ON A.FLDREASON = T.FLDCODE " + 
" WHERE A.FLDEMPLOYEE = ? " + 
" ORDER BY A.FLDDATE DESC" 
); 
queryParms.add(new Long(empRec)); 
  1. 我可以使用HashSet的,而不是ArrayList的上方,這有什麼意義在性能方面?ArrayList中的Hashset或

  2. 查詢做了什麼,我們是否需要在StringBuffer中附加查詢?爲什麼我不能直接添加到ArrayList?

+1

請勿使用HashSet。它不會保持參數的順序不變,所以你的SQL可以得到非常有趣的結果(如果你有多個參數)。 – Thilo 2010-09-27 10:20:18

+0

我想你真的需要覆蓋我的[ArrayList的內部生活](http://volodial.blogspot.com/2013/07/internal-life-of-arraylist-in-java.html)教程和[內部生活HashSet](http://volodial.blogspot.com/2013/07/internal-life-of-hashset-in-java.html)教程 – 2013-07-27 08:47:42

回答

1

一般而言,您會希望使用ArrayList作爲查詢參數 - 因爲訂單很重要。當你只有一個參數時(就像你在這裏),這不是問題 - 但我肯定會使用一個一致的列表。

至於使用StringBuffer - 你還沒有在這裏顯示你在用sql在做什麼。如果您沒有附加任何其他內容,則可以使用簡單的String ...但您不會將其添加到ArrayList,因爲它是查詢本身,而不是查詢參數

最後,我建議使用泛型,例如

ArrayList<Long> queryParameters = new ArrayList<Long>(); 
+0

或者至少,使用StringBuilder而不是StringBuffer,它不同步,因此更快。 – Barthelemy 2010-09-27 09:49:57

0

更高效:

sql.append("SELECT A.FLDREC_NUM, "); 
sql.append("@CHARDATE(A.FLDDATE), "); 
...... 
+3

不,它*效率較低,因爲它在執行時而不是在編譯時連接。更高效的就是使用字符串開始。 – 2010-09-27 09:54:00

+0

是的,除非在構建查詢時有if語句或循環,否則不要使用StringBuilder。 – Thilo 2010-09-27 10:22:25

+0

Jon是對的。忘記我寫的東西。 – 2010-09-27 11:27:52

1

至於性能,可以考慮:

  1. 使用StringBuilder的(而不是StringBuffer的),這是不同步的,是不是一個問題,因爲你」爲每個請求重新創建一個新的StringBuilder()。如果它是用於每個請求的相同語句,則它應該是全局聲明的最終字符串。

  2. 如Jon所示,使用帶有泛型的ArrayList。 queryParams用作用於查詢數據庫的QueryService實現的一部分。看起來,這是一個預編譯的sql查詢,查詢參數的順序在運行時很重要。 HashSet不保證順序。

相關問題