JDBC什么是PreparedStatement#setNull的目的

Mar*_*tus 10 java postgresql jdbc

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

表格A.

SELECT COUNT(*) FROM buyers WHERE buye_resp IS NULL
Run Code Online (Sandbox Code Playgroud)

表格B.

 SELECT COUNT(*) FROM buyers WHERE buye_resp = ?
Run Code Online (Sandbox Code Playgroud)

...其中参数由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);
    }
}
Run Code Online (Sandbox Code Playgroud)

axt*_*avt 8

SQL使用三值逻辑,因此buye_responsible = ?总是返回unknown(永不true),当buye_responsiblenull.这就是你需要IS NULL检查的原因null.

setNull()可以使用,例如,当你需要传递nulls到INSERTUPDATE报表.由于诸如setInt()setLong()采用原始类型(int,long)之类的方法,null在这种情况下需要一种特殊的方法来传递.