gpt4 book ai didi

java - JDBC PreparedStatement#setNull 的目的是什么

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:57:10 33 4
gpt4 key购买 nike

我用一个表做了一个实验,该表有一个带有空值的 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);
}
}

最佳答案

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

setNull()可以使用,例如,当您需要传递 null 时s 至 INSERTUPDATE声明。由于诸如 setInt() 之类的方法和 setLong()采用原始类型( intlong )你需要一个特殊的方法来传递 null在这种情况下。

关于java - JDBC PreparedStatement#setNull 的目的是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16059634/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com