2017-02-28 53 views
2

我知道SQL中的最佳做法是不使用數字值周圍的單引號以避免將它們轉換爲字符串。但是,當我在JDBC中使用PreparedStatement並要求查看語句時,單引號將放置在我設置的所有值中,包括數字。在下面的例子中,我發送了三個列表 - 一個列名稱作爲字符串,一個數據類型列表作爲字符串,一個值列表作爲字符串。當數據類型爲「int」時,我將該值轉換爲一個整數,並在該語句中使用setInt(),否則我使用setString()。然而,PreparedStatement.toString()的println會導致圍繞我使用setInt()的任何東西的單引號。JDBC似乎在我的數字周圍放入單引號

public void update(String tableName, String colName, String valName, List<String> columnList, List<String> typeList, List<String> valueList) { 
    PreparedStatement stmt = null; 
    try { 
     String setterSet = columnList.get(0) + "=?"; 
     for (int cCol = 1; cCol < columnList.size(); cCol++) { 
     setterSet += "," + columnList.get(cCol) + "=?"; 
     } 
     stmt = theConnection.prepareStatement("UPDATE " + tableName + " SET " + setterSet + " WHERE " + colName + " = ?;"); 
     for (int cCol = 1; cCol <= valueList.size(); cCol++) { 
     if (typeList.get(cCol - 1).equals("int")) { 
      stmt.setInt(cCol, Integer.parseInt(valueList.get(cCol - 1))); 
     } 
     else { 
      stmt.setString(cCol, valueList.get(cCol - 1)); 
     } 
     } 
     stmt.setString(valueList.size() + 1, valName); 
     System.out.println("Prepared Statement: " + stmt.toString()); 
     int rows = stmt.executeUpdate(); 
     stmt.close(); 
    } 
    catch (Exception e) { 
     logger.error("Problem with the database: " + e.getMessage()); 
    } 
    } 

標準絕版看起來是這樣的:

Prepared Statement: UPDATE data_sources SET id_='e80c861c-bf6c-4300-80e0-3eab29e06cec',ds_name='test001',num_files='75' WHERE ds_name = 'test001' 

是它通常是75引述?

編輯:爲了澄清,我使用PostgreSQL和我的JDBC驅動程序是:

<dependency> 
    <groupId>postgresql</groupId> 
    <artifactId>postgresql</artifactId> 
    <version>8.4-702.jdbc4</version> 
</dependency> 
+0

我不這樣做,如果它是平常的但它沒有區別 – user489872

+2

'PreparedStatement#toString()'的具體行爲是依賴於實現的。如果你想要的東西不僅僅是猜測,你應該[編輯]你的問題來提及(和標記)你正在使用的JDBC驅動程序。 –

+3

您是否檢查過這是否也發送到服務器?我猜想這只是'toString()'方法的簡單實現來顯示_some_信息 - 但不是發送到服務器的確切數據。 –

回答

1

這僅僅是提供信息。如果您在PreparedStatement的PostgreSQL實例上調用toString(),它將僅使用當前參數值呈現查詢。它只是信息性的(例如,用於記錄),而不是如何將查詢發送到服務器。

參見:

這是驅動程序特定的行爲,因爲一些實現只會返回準備,而其他的實現將返回默認Object.toString()語句字符串。

旁註:您使用的是舊版PostgreSQL JDBC驅動程序,請注意the driver version is not related to the server version。所以如果由於某種原因,你仍然在使用PostgreSQL 8.4,你仍然可以使用支持PostgreSQL 8.2和更高版本的最新驅動程序(42.0.0)。

相關問題