JDBC什么是PreparedStatement#setNull的目的

时间:2013-04-17 12:11:12

标签: java postgresql jdbc

我做了一个带有VARCHAR列的表的实验,该列具有空值,试图获取具有特定列NULL的行数。我用了三种形式:

表单A

SELECT COUNT(*) FROM buyers WHERE buye_resp IS NULL

表格B

 SELECT COUNT(*) FROM buyers WHERE buye_resp = ?

...其中参数随 setString(1,null)

提供

表格C

...比如表格B ,但参数设置为 setNull(1,java.sql.Types.VARCHAR)

在三种形式中,只有形式A 产生了正确的结果,形式B和C都返回0(帖子末尾的三种形式的代码)。这引出了一个问题: setNull 的目的是什么?

针对PostgreSQL 9.2数据库运行的测试。

private static int numOfRows_formA(Connection conn) throws SQLException {
    PreparedStatement pstm = null;
    ResultSet         rs   = null;
    try {
        String pstmStr = "SELECT COUNT(*) FROM buyers WHERE buye_resp IS NULL";
        pstm = conn.prepareStatement(pstmStr);
        rs =  pstm.executeQuery();
        rs.next();
        return rs.getInt(1);
    } finally {
        DbUtils.closeQuietly(null, pstm, rs);
    }
}

private static int numOfRows_formB(Connection conn) throws SQLException {
    PreparedStatement pstm = null;
    ResultSet         rs   = null;
    try {
        String pstmStr = "SELECT COUNT(*) FROM buyers WHERE buye_resp = ?";
        pstm = conn.prepareStatement(pstmStr);
        pstm.setString(1, null);
        rs = pstm.executeQuery();
        rs.next();
        return rs.getInt(1);
    } finally {
        DbUtils.closeQuietly(null, pstm, rs);
    }
}

private static int numOfRows_formC(Connection conn) throws SQLException {
    PreparedStatement pstm = null;
    ResultSet         rs   = null;
    try {
        String pstmStr = "SELECT COUNT(*) FROM buyers WHERE buye_resp = ?";
        pstm = conn.prepareStatement(pstmStr);
        pstm.setNull(1, java.sql.Types.VARCHAR);
        rs = pstm.executeQuery();
        rs.next();
        return rs.getInt(1);
    } finally {
        DbUtils.closeQuietly(null, pstm, rs);
    }
}

2 个答案:

答案 0 :(得分:8)

SQL使用ternary logic,因此当buye_responsible = ?unknown时,true始终返回buye_responsible(永不null}。这就是您需要IS NULL来检查null

的原因 例如,当您需要将setNull()传递给nullINSERT语句时,可以使用

UPDATE。由于setInt()setLong()等方法采用原始类型(intlong),因此在这种情况下需要使用特殊方法传递null

答案 1 :(得分:1)

在数据库系统中,null不等于另一个null 第SELECT COUNT(*) FROM vat_refund.er_buyers WHERE buye_responsible = null行不会返回任何记录。 setNull()方法只是在索引位置设置一个null。Sets the designated parameter to SQL NULL.来自JAVA API。也就是说,它会为该索引设置一个SQL null,但它不会根据您的需要使用isNull()函数。 所以这就是为什么表格C也没有得到任何结果。