PreparedStatement setNull (..)

86

Java PreparedStatement oferece a possibilidade de definir explicitamente um valor Nulo. Essa possibilidade é:

prepStmt.setNull(parameterIndex, Types.VARCHAR);

A semântica desta chamada é a mesma de quando se usa um setType específico com um parâmetro nulo?

prepStmt.setString(null);

?

Paweloque
fonte

Respostas:

73

Este guia diz:

6.1.5 Enviando JDBC NULL como um parâmetro IN

O método setNull permite que um programador envie um valor JDBC NULL (um SQL NULL genérico) para o banco de dados como um parâmetro IN. Observe, entretanto, que ainda é necessário especificar o tipo JDBC do parâmetro.

Um JDBC NULL também será enviado ao banco de dados quando um valor nulo Java for passado para um método setXXX (se ele usar objetos Java como argumentos). O método setObject, no entanto, pode assumir um valor nulo apenas se o tipo JDBC for especificado.

Então, sim, eles são equivalentes.

djna
fonte
2
+1: interessante. Presumi que era assim que setXXX funcionava com nulos, mas nunca realmente o testei ou li a documentação para ele.
Powerlord
2
Eu não suponho que haja algo como myPreparedStatement.setInteger (myIntegerObject) (embora eu veja que o nome do método exato não existe) no caso de eu querer usar um inteiro potencialmente nulo. Caso contrário, terei que usar uma instrução if / else, chamando .setInt () de uma maneira e .setNull () de outra, o que parece um pouco tedioso.
@ardave, sim, é isso que quero dizer com meu parágrafo final
djna de
1
Eu sei que é antigo, mas esse link está quebrado.
Moob
1
Novo link: PreparedStatement
candidus
76

mas cuidado com isso ....

Long nullLong = null;

preparedStatement.setLong( nullLong );

-transmite exceção de ponteiro nulo-

porque o protótipo é

setLong( long )   

NÃO

setLong( Long )

bom te pegar eh.

Owen
fonte
Esse é realmente o exemplo que me trouxe aqui.
sf_jeff
13

Por fim, fiz um pequeno teste e, enquanto o estava programando, me veio à mente que, sem o método setNull (..), não haveria como definir valores nulos para os primitivos Java. Para objetos em ambos os sentidos

setNull(..)

e

set<ClassName>(.., null)) 

se comporte da mesma maneira.

Paweloque
fonte
9

Você também pode considerar usar preparedStatement.setObject(index,value,type);

bitom
fonte
4
preparedStatement.setNull(index, java.sql.Types.NULL);

que deve funcionar para qualquer tipo. Embora em alguns casos a falha aconteça no lado do servidor, como: para SQL:

COALESCE(?, CURRENT_TIMESTAMP)

Oracle 18XEfalha com o tipo errado: esperado DATE, obtido STRING- essa é uma falha perfeitamente válida;

Resumindo: é bom saber o tipo se você ligar .setNull()

Dmitriy Pichugin
fonte