postgres jdk conectar con java postgresql jdbc

java - conectar - jdk postgres



JDBC ¿cuál es el propósito de PreparedStatement#setNull (2)

Hice un experimento con una tabla que tiene una columna VARCHAR con valores nulos tratando de obtener el número de filas que tienen una columna NULL específica. Usé tres formas:

forma A

SELECT COUNT(*) FROM buyers WHERE buye_resp IS NULL

formulario B

SELECT COUNT(*) FROM buyers WHERE buye_resp = ?

... donde el parámetro se proporciona con setString (1, nulo)

formulario C

... como la forma B, pero el parámetro se establece con setNull (1, java.sql.Types.VARCHAR)

De las tres formas, solo la forma A produjo el resultado correcto, las formas B y C ambas devolvieron 0 (código de las tres formas al final de la publicación). Lo que plantea la pregunta: ¿cuál es el propósito de setNull ?

Las pruebas se ejecutan contra una base de datos PostgreSQL 9.2.

código

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); } }


En el sistema de base de datos, un nulo no es igual a otro nulo, por lo que la línea SELECT COUNT(*) FROM vat_refund.er_buyers WHERE buye_responsible = null no devolverá ningún registro. El método setNull () simplemente establece un nulo en la posición del índice. Sets the designated parameter to SQL NULL. Esto desde la API de JAVA. Es decir, establecerá un SQL nulo para ese índice, pero no utilizará la función isNull () como usted desee. Por eso, para la forma C tampoco obtienes ningún resultado.


SQL usa lógica ternaria , por buye_responsible = ? tanto buye_responsible = ? siempre devuelve unknown (y nunca true ) cuando buye_responsible es null . Es por eso que necesita IS NULL para verificar null .

setNull() se puede usar, por ejemplo, cuando se necesita pasar null s a las INSERT y UPDATE . Dado que los métodos como setInt() y setLong() toman tipos primitivos ( int , long ) necesita un método especial para pasar null en este caso.