java - PreparedStatement setString(...) for all,即使对应的数据类型是整数

标签 java jdbc prepared-statement

我遇到了以下代码,我觉得它做错了:

(请注意,这是 JDK 1.4.2,因此未输入列表)

StringBuffer queryBuffer = new StringBuffer();
ArrayList temp = new ArrayList();

... 
queryBuffer.append("and sb.POSTCODE = ? ");
temp.add(postcode);
...

conn = ConnectionManager.getConnection();       
pstmt = conn.prepareStatement(queryBuffer.toString());

这是我关心的:

for(int i=0; i<temp.size(); i++) {
    log.debug("setString("+ (i+1) + "," + (String)temp.get(i) + ")");
    pstmt.setString(i+1, (String)temp.get(i));
}

但是我注意到数据库中有一些对应的数据类型(字段)是整数,还有日期,这样可以吗?

最佳答案

考虑使用 PreparedStatement setObject()方法而不是 setString()

如果类型在编译时未知,PreparedStatement setObject() 将尝试为您转换任何 java.lang 类型。

因此使用更新的 for 循环(假设您有 java 5.0)和通用 null 处理:

int i = 0;
for(Object value : temp) {
    if (value == null) {
        // set null parameter if value type is null and type is unknown
        pstmt.setNull(++i, Integer.MIN_VALUE); 
    } else {
        pstmt.setObject(++i, value);
    }
}

请注意 setNull()可以接受 type作为第二个参数,如果它是已知的。

关于java - PreparedStatement setString(...) for all,即使对应的数据类型是整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10610950/

相关文章:

java - Jersey 多部分表单数据默认值?

java - 释放 JDBC 资源

java - 为什么这个 mysql find max value 语句不能在 Java JDBC 中运行

java - 如何使用jnlp webstart而不缓存jar

java - hadoop jar 忽略指定的主类

mysql - 使用准备好的语句的结果作为查询中的临时表

oracle - 为什么在准备好的语句中使用 COLLECT() 时会得到 "ORA-00932: inconsistent datatypes: expected - got -"?

java - 没有为参数X指定值。如何避免?

java - 使用 FillLayout 隐藏父级中的复合控件

oracle - 如何增加 ORDS 中的 JDBC fetchSize 并提高大型结果集的响应时间?