PreparedStatement setNull (..)

86

Java PreparedStatement ofrece la posibilidad de establecer explícitamente un valor nulo. Esta posibilidad es:

prepStmt.setNull(parameterIndex, Types.VARCHAR);

¿La semántica de esta llamada es la misma que cuando se usa un setType específico con un parámetro nulo?

prepStmt.setString(null);

?

paweloque
fuente

Respuestas:

73

Esta guía dice:

6.1.5 Envío de JDBC NULL como parámetro IN

El método setNull permite a un programador enviar un valor JDBC NULL (un SQL NULL genérico) a la base de datos como un parámetro IN. Sin embargo, tenga en cuenta que aún se debe especificar el tipo JDBC del parámetro.

También se enviará un JDBC NULL a la base de datos cuando se pase un valor nulo de Java a un método setXXX (si toma objetos Java como argumentos). El método setObject, sin embargo, puede tomar un valor nulo solo si se especifica el tipo JDBC.

Entonces sí, son equivalentes.

djna
fuente
2
+1: Interesante. Asumí que así es como funciona setXXX con nulos, pero nunca lo probé ni leí los documentos.
Powerlord
2
Supongo que no hay algo como myPreparedStatement.setInteger (myIntegerObject) (aunque veo que el nombre exacto del método no existe) en el caso de que quiera usar un entero potencialmente nulo. De lo contrario, tendré que usar una declaración if / else, llamando a .setInt () de una manera y a .setNull () de otra manera, lo que parece un poco tedioso.
@ardave, sí, eso es lo que quiero decir con mi párrafo final
djna
1
Sé que es antiguo, pero ese vínculo está roto.
Moob
1
Nuevo enlace: PreparedStatement
candidus
76

pero cuidado con esto ...

Long nullLong = null;

preparedStatement.setLong( nullLong );

-tiene una excepción de puntero nulo-

porque el prototipo es

setLong( long )   

NO

setLong( Long )

bueno para atraparte eh.

Owen
fuente
Ese es realmente el ejemplo que me trajo aquí.
sf_jeff
13

Finalmente hice una pequeña prueba y mientras la estaba programando me vino a la mente que sin el método setNull (..) no habría forma de establecer valores nulos para las primitivas de Java. Para objetos en ambos sentidos

setNull(..)

y

set<ClassName>(.., null)) 

comportarse de la misma manera.

paweloque
fuente
9

También podría considerar usar preparedStatement.setObject(index,value,type);

bithom
fuente
4
preparedStatement.setNull(index, java.sql.Types.NULL);

eso debería funcionar para cualquier tipo. Aunque en algunos casos ocurre una falla en el lado del servidor, como: para SQL:

COALESCE(?, CURRENT_TIMESTAMP)

Oracle 18XEfalla con el tipo incorrecto: esperado DATE, obtenidoSTRING : es una falla perfectamente válida;

En pocas palabras: es bueno saber el tipo si llama .setNull()

Dmitriy Pichugin
fuente