我理解SQL中的最佳做法是不要在数值周围使用单引号以避免将它们转换为字符串。但是,当我在JDBC中使用PreparedStatement然后要求查看该语句时,单引号放在我设置的所有值周围,包括数字。在下面的示例中,我发送三个列表 - 列名称为字符串列表,数据类型列表为字符串,值列表为字符串。当数据类型为" int"时,我将值转换为整数并使用setInt()进入语句,否则我使用setString()。但是,PreparedStatement.toString()的println会在我使用setInt()的任何内容周围生成单引号。
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 :(得分:1)
这只是提供信息。如果在toString()
的PostgreSQL实例上调用PreparedStatement
,它将只使用当前参数值呈现查询。它只是信息性的(例如用于记录),而不是查询如何发送到服务器。
请参阅:
PgPreparedStatement.toString()
返回替换当前模板值的SQL语句。
Query.toString(ParameterList parameters)
将此查询字符串化为人类可读的形式,将特定参数值替换为参数占位符。
这是特定于驱动程序的行为,因为某些实现只返回已准备好的语句字符串,而其他实现将返回默认的Object.toString()
。
旁注:您使用的是相当旧版本的PostgreSQL JDBC驱动程序,请注意the driver version is not related to the server version。因此,如果由于某种原因你还在使用PostgreSQL 8.4,你仍然可以使用支持PostgreSQL 8.2及更高版本的最新驱动程序(42.0.0)。