PreparedStatement setString(...)for all,即使cororesponding数据类型是一个整数

Oh *_*oon 8 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());
Run Code Online (Sandbox Code Playgroud)

这就是我所关注的:

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));
}
Run Code Online (Sandbox Code Playgroud)

但我已经注意到数据库中的一些相应的数据类型(字段)是整数,而日期,这样会好吗?

pd4*_*d40 8

考虑使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果已知,setNull()可以接受类型作为第二个参数.

  • 在这种情况下使用`setObject()`非常好.要注意,你不应该将无类型的`null`传递给`setObject()`.+1 (2认同)