2013-06-19 38 views
1

我正在執行查詢並將結果放入JSONObject以將其返回到EXTJS頁面。代碼的作品,但我不知道這是否是最好或最有效的方式來做到這一點。我會發布我的代碼,請看我是否需要改進它並在哪裏。我是新鮮的程序員,所以原諒明顯的錯誤。提前致謝。這是一個在java中執行查詢的好方法嗎?

public JSONObject execQuery(String invoice, String id){ 

    StringBuffer sb = new StringBuffer(); 
    JSONObject json = new JSONObject(); 
    JSONObject data = new JSONObject(); 
    JSONArray jsArray = new JSONArray(); 

    try{ 
     // get conn 
     conn = DBConnect.getInstance().dbOracleConnect(); 

     // create query 
     sb = new StringBuffer("SELECT * FROM table "); 
     sb.append("WHERE rtrim(invoice) = ? AND "); 
     sb.append("id = ? "); 

     ps = conn.prepareStatement(sb.toString()); 
     ps.setString(1, invoice); 
     ps.setString(2, id); 

     rs = ps.executeQuery(); 

     while(rs.next()){ 
      json = new JSONObject(); 

      json.put("invoice", rs.getString("invoice")); 
      json.put("id", rs.getString("id")); 
      json.put("name", rs.getString("name")); 
      json.put("gender", rs.getString("gender")); 

      jsArray.put(json); 
      // out put will be like [{"invoice":"111", "id":"123", "name":"sam", "gender":"male"}, {...}]    
     } 
     data.put("data", jsArray); 
     // out put will be like {"data":[{"invoice":"111", "id":"123", "name":"sam", "gender":"male"}, {...}]} 
    } 
    catch(Exception e){ 
     System.out.println("Error: " + e.toString()); 
    } 
    finally { 
     JDBCHelper.close(rs); 
     JDBCHelper.close(ps); 
     JDBCHelper.close(conn); 
    } 

    return data; 
} 
+1

你的聯繫是一個領域嗎?您創建並關閉每個查詢。 – Blindy

+1

如果'DBConnect#dbOracleConnect()'每次都創建一個新連接(而不是從池中重用),那麼每個查詢都會產生大量開銷。 –

+0

與問題本身無關,但我更願意在需要時聲明變量,而不是在頂部。例如'JSONObject json = new JSONObject();'可以被刪除。你甚至創建一個實例只能忽略那裏。隨着方法規模的擴大,這種風格大大降低了可讀性。 –

回答

2

你需要在你的代碼要考慮的幾件事情:

  1. 您正在關閉通過JDBCHelper連接,這意味着應該有JDBCHelper抽象掉得到一個細節的方法連接。

  2. 由於您沒有動態創建查詢,因此不需要使用StringBuffer/StringBuilder。一個普通的字符串對你的情況很有效。

  3. sb和json變量被初始化兩次,一次在頂部,然後再次在try塊中。只需在頂部聲明這些變量並在使用它們的位置初始化它們。

    1)從連接池獲得連接:

+0

我想使用StringBuffer能夠追加而不是+。實際的查詢,如果更長時間我簡化了這個職位。 – JS11

+0

謝謝大家非常有效的點數,如果還有更多的請發佈。 – JS11

1

沒有上下文,基於兩個假設看起來好像沒什麼問題。使用模式似乎表明情況正是如此。但是您需要閱讀DBConnect的文檔並驗證。

2)查詢參數化。你做不是希望將值直接連接到SQL中。這是低效和不安全的。您的查詢已設置參數化。

一些小意見:

1)它看起來像 '參數conn', 'RS', 'S' 是類的所有領域。我沒有看到需要。如果你將它們設置爲局部變量,你的課程將變得無國籍 - 更容易閱讀和維護。更好地聲明他們使用的變量,正如其他人所建議的那樣。

2)StringBuffer(或StringBuilder)在這裏是矯枉過正。

+0

向第二個#2添加細節:當所有部分都是文字時,javac編譯器將優化「start」+「middle」+「end」爲「startmiddleend」。 –

+0

神經突起,謝謝你的評論。你能告訴我更多關於第二條評論嗎? 「2)查詢是參數化的,你不希望這個值直接連接到SQL中,這是低效和不安全的,你的查詢被設置爲參數化。使用預準備語句將參數值放入SQL查詢中,直接連接到SQL中? – JS11

+0

如果沒有參數化,它將是低效率的,因爲每個唯一值都連接成一個唯一的SQL字符串。數據庫會即時執行查詢並沒有機會進行優化。而參數化查詢被視爲* one *查詢數據庫中所有不同的值。更好的數據庫編譯並優化它以獲得更好的性能。由於SQL注入的可能性,連接查詢也是不安全的(即,值是部分SQL,並且連接的查詢字符串不是您想要的)。 – neurite

相關問題