我知道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>
我不這樣做,如果它是平常的但它沒有區別 – user489872
'PreparedStatement#toString()'的具體行爲是依賴於實現的。如果你想要的東西不僅僅是猜測,你應該[編輯]你的問題來提及(和標記)你正在使用的JDBC驅動程序。 –
您是否檢查過這是否也發送到服務器?我猜想這只是'toString()'方法的簡單實現來顯示_some_信息 - 但不是發送到服務器的確切數據。 –