【问题标题】:JDBC what's the purpose of PreparedStatement#setNullJDBC PreparedStatement#setNull 的目的是什么
【发布时间】:2013-04-10 04:35:41
【问题描述】:

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

表格A

SELECT COUNT(*) FROM buyers WHERE buye_resp IS NULL

表格 B

 SELECT COUNT(*) FROM buyers WHERE buye_resp = ?

... 参数由 setString(1, null)

提供

C 型

... 类似于 form 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);
    }
}

【问题讨论】:

标签: java postgresql jdbc


【解决方案1】:

SQL 使用ternary logic,因此当buye_responsiblenull 时,buye_responsible = ? 总是返回unknown(而不是true)。这就是为什么你需要IS NULL 来检查null

可以使用setNull(),例如,当您需要将nulls 传递给INSERTUPDATE 语句时。由于setInt()setLong() 等方法采用原始类型(intlong),在这种情况下,您需要一个特殊的方法来传递null

【讨论】:

  • 所以,如果我做对了,setNull 主要(如果不是唯一的话)用于 INSERT / UPDATE 语句,并且可能是 FIND 语句中的代码异味。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-11-24
    • 2011-07-26
    • 2013-11-14
    • 1970-01-01
    • 2021-07-19
    • 2018-11-06
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多