PreparedStatement setNull (..)

84

Java PreparedStatement bietet die Möglichkeit, einen Nullwert explizit festzulegen. Diese Möglichkeit ist:

prepStmt.setNull(parameterIndex, Types.VARCHAR);

Ist die Semantik dieses Aufrufs dieselbe wie bei Verwendung eines bestimmten setType mit einem Nullparameter?

prepStmt.setString(null);

?

paweloque
quelle

Antworten:

72

Dieser Leitfaden sagt:

6.1.5 Senden von JDBC NULL als IN-Parameter

Mit der setNull-Methode kann ein Programmierer einen JDBC-NULL-Wert (einen generischen SQL-NULL-Wert) als IN-Parameter an die Datenbank senden. Beachten Sie jedoch, dass der JDBC-Typ des Parameters weiterhin angegeben werden muss.

Ein JDBC-NULL-Wert wird auch an die Datenbank gesendet, wenn ein Java-Nullwert an eine setXXX-Methode übergeben wird (wenn Java-Objekte als Argumente verwendet werden). Die Methode setObject kann jedoch nur dann einen Nullwert annehmen, wenn der JDBC-Typ angegeben ist.

Also ja, sie sind gleichwertig.

djna
quelle
2
+1: Interessant. Ich nahm an, dass setXXX so mit Nullen funktioniert, aber ich habe es nie getestet oder die Dokumente dafür gelesen.
Powerlord
2
Ich nehme nicht an, dass es so etwas wie myPreparedStatement.setInteger (myIntegerObject) gibt (obwohl ich sehe, dass der genaue Methodenname nicht existiert), falls ich eine potenziell null Ganzzahl verwenden möchte. Andernfalls muss ich eine if / else-Anweisung verwenden und .setInt () in die eine und .setNull () in die andere Richtung aufrufen, was etwas langweilig erscheint.
@ardave, ja das meine ich mit meinem letzten Absatz
djna
1
Ich weiß, dass es alt ist, aber diese Verbindung ist unterbrochen.
Moob
1
Neuer Link: PreparedStatement
Candidus
76

aber pass auf das auf ....

Long nullLong = null;

preparedStatement.setLong( nullLong );

-wirft Nullzeiger Ausnahme-

weil der Prototyp ist

setLong( long )   

NICHT

setLong( Long )

schön dich zu erwischen eh.

Owen
quelle
Das ist eigentlich das Beispiel, das mich hierher gebracht hat.
sf_jeff
13

Schließlich habe ich einen kleinen Test durchgeführt, und während ich ihn programmierte, kam mir der Gedanke, dass es ohne die Methode setNull (..) keine Möglichkeit geben würde, Nullwerte für die Java-Grundelemente festzulegen. Für Objekte in beide Richtungen

setNull(..)

und

set<ClassName>(.., null)) 

benimm dich genauso.

paweloque
quelle
8

Sie könnten auch in Betracht ziehen, zu verwenden preparedStatement.setObject(index,value,type);

bithom
quelle
2

prepareStatement.setNull (index, java.sql.Types.NULL);

das sollte für jeden Typ funktionieren. In einigen Fällen tritt jedoch ein Fehler auf der Serverseite auf, z. B.: Für SQL:

COALESCE (?, CURRENT_TIMESTAMP)

Oracle 18XE schlägt mit falschem Typ fehl: erwartetes DATUM, bekam STRING - das ist ein vollkommen gültiger Fehler;

Fazit: Es ist gut, den Typ zu kennen, wenn Sie .setNull () aufrufen.

Dmitriy Pichugin
quelle