Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


18.7.3

Verwendung von Parametern



Zum Setzen von Parametern sind in der Schnittstelle PreparedStatement viele Methoden definiert, die jeweils andere Datentypen als Argumente erwarten. Auf diese Weise steht für jeden Datentyp die passende Methode zur Verfügung. Sie entsprechen im Wesentlichen den getXXX-Methoden des Interface ResultSet (siehe Abschnitt 18.6.2; das Präfix get muss jeweils durch set ersetzt werden), daher werden sie hier nicht mehr im Detail aufgeführt. Als Argumente werden jeweils der Index des Parameters in der SQL-Anweisung und der einzufügende Wert übergeben. Abbildung 18.18 zeigt, wie das Setzen der Parameter durchgeführt wird.

Abbildung 18.18: Verwendung von Parametern
Abbildung 18.18

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

NULL-Werte können bei vorbereitetem SQL auf zwei verschiedene Arten gesetzt werden: 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).

Beim Setzen von NULL-Werten in SELECT-Anweisungen muss man bei Verwendung des Oracle-Treibers auf die korrekte Syntax achten. Angenommen in der Anwendung wird folgender SQL-String in einem PreparedStatement ausgeführt:
  String sql = "SELECT * FROM kategorien WHERE kat_kat_id = ?";
  ...
Wenn man für den Parameter NULL einsetzt, erhält man als Ergebnis keine Zeile, da der Vergleich nie wahr ist. Deshalb muss man die Überprüfung explizit mit dem Ausdruck IS NULL in den SQL-String einbauen:
  String sql = "SELECT * FROM kategorien WHERE kat_kat_id IS NULL";
  ...
Dadurch ist der SQL-String bei Abfragen auch bei vorbereitetem SQL von Parametern abhängig, die möglicherweise NULL-Werte enthalten. INSERT- und UPDATE-Anweisungen hingegen sind nicht von möglichen NULL-Werten abhängig. Parameter können dort ohne Unterscheidung gesetzt werden.


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.