Eine
Besonderheit bei Parametern gibt es bezüglich deren Gültigkeit. Wenn eine SQL-Anweisung mehrfach
hintereinander mit wechselnden Parametern ausgeführt wird, müssen nicht vor jeder Ausführung mit
executeUpdate() alle Werte neu belegt werden. Ein Wert ist solange
an die SQL-Anweisung gebunden, bis
er entweder durch einen neuen Wert ersetzt wird (durch Aufruf einer
setXXX()-Methode mit demselben
Parameter-Index) oder alle Parameter mit der Methode clearParameters()
explizit gelöscht werden.
Das heißt, vor jedem Aufruf von executeUpdate() müssen lediglich
die Parameter neu gesetzt werden, die
bei der erneuten Ausführung mit neuen Werten belegt werden sollen.
Alle anderen Parameter werden von der letzten Ausführung
übernommen. Angenommen, einem Titel sollen viele Stichworte zugewiesen
werden, deren Nummern in einem Array gespeichert werden,
dann kann man die Ausführung folgendermaßen durchführen:
import java.sql.*;
...
Connection con;
long titId;
long sworte[];
// Initialisierung der Daten
...
// Initialisierung der SQL-Anweisung
String sql = "INSERT INTO stichworte_titel VALUES(?,?);
PrepareStatement prep = con.prepareStatement(sql);
// Einmaliges setzen der Titel-Nr
prep.setLong(2, titId);
for(int i=0; sworte.length; i++) {
prep.setLong(1, sworte[i]);
prep.executeUpdate();
}
NULL-Werte können bei vorbereitetem SQL auf zwei verschiedene Arten gesetzt werden:
- Direkt in der SQL-Anweisung über das SQL-Schlüsselwort NULL.
- In Bind-Variablen über die Methode setNull().
Interessant ist vor allen Dingen das Setzen von NULL-Werten als Parameter.
In der Shop-Anwendung gibt es eine
Kategorien-Hierarchie, in der die Wurzelkategorien einen NULL-Wert in der Spalte haben, in der
die übergeordnete Kategorie eingetragen ist. Wie man
vorbereitetem SQL und JDBC eine neue Wurzelkategorie einfügt,
zeigt folgendes Beispiel:
Connection con;
...
String sql = "INSERT INTO kategorien VALUES(?,?,?)";
PreparedStatement prep = con.prepareStatement(sql);
prep.setString(1, "Informatik"); // Name
prep.setNull(2, Types.INTEGER); // übergeordnete Kategorie
prep.setInt(3, 1); // Primärschlüssel
prep.executeUpdate();
...
Das Setzen des NULL-Werts wird von der Methode setNull durchgeführt.
Die Methode erwartet den Spalten-Index und den Code des entsprechenden
JDBC-Datentyps (siehe Abschnitt 18.3).