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)