JDBC - Anweisungen, PreparedStatement und CallableStatement

Sobald eine Verbindung hergestellt ist, können wir mit der Datenbank interagieren. Die Schnittstellen JDBC- Anweisung, CallableStatement und PreparedStatement definieren die Methoden und Eigenschaften, mit denen Sie SQL- oder PL / SQL-Befehle senden und Daten aus Ihrer Datenbank empfangen können.

Sie definieren auch Methoden, mit denen Datentypunterschiede zwischen Java- und SQL-Datentypen, die in einer Datenbank verwendet werden, überbrückt werden können.

Die folgende Tabelle enthält eine Zusammenfassung des Zwecks jeder Schnittstelle, um die zu verwendende Schnittstelle zu bestimmen.

Schnittstellen Empfohlene Verwendung
Erklärung Verwenden Sie diese Option für den allgemeinen Zugriff auf Ihre Datenbank. Nützlich, wenn Sie zur Laufzeit statische SQL-Anweisungen verwenden. Die Anweisungsschnittstelle kann keine Parameter akzeptieren.
PreparedStatement Verwenden Sie diese Option, wenn Sie die SQL-Anweisungen mehrmals verwenden möchten. Die PreparedStatement-Schnittstelle akzeptiert zur Laufzeit Eingabeparameter.
CallableStatement Verwenden Sie diese Option, wenn Sie auf die gespeicherten Datenbankprozeduren zugreifen möchten. Die CallableStatement-Schnittstelle kann auch Laufzeit-Eingabeparameter akzeptieren.

Die Anweisungsobjekte

Anweisungsobjekt erstellen

Bevor Sie ein Anweisungsobjekt zum Ausführen einer SQL-Anweisung verwenden können, müssen Sie eine mit der Methode createStatement () des Verbindungsobjekts erstellen, wie im folgenden Beispiel:

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

Nachdem Sie ein Anweisungsobjekt erstellt haben, können Sie damit eine SQL-Anweisung mit einer der drei Ausführungsmethoden ausführen.

  • boolean execute (String SQL): Gibt einen booleschen Wert von true zurück, wenn ein ResultSet-Objekt abgerufen werden kann. Andernfalls wird false zurückgegeben. Verwenden Sie diese Methode, um SQL-DDL-Anweisungen auszuführen oder wenn Sie wirklich dynamisches SQL verwenden müssen.

  • int executeUpdate (String SQL): Gibt die Anzahl der Zeilen zurück, die von der Ausführung der SQL-Anweisung betroffen sind. Verwenden Sie diese Methode, um SQL-Anweisungen auszuführen, für die voraussichtlich mehrere Zeilen betroffen sind, z. B. eine INSERT-, UPDATE- oder DELETE-Anweisung.

  • ResultSet executeQuery (String SQL): Gibt ein ResultSet-Objekt zurück. Verwenden Sie diese Methode, wenn Sie eine Ergebnismenge erwarten, wie Sie es mit einer SELECT-Anweisung tun würden.

Abschlussobjekt

So wie Sie ein Verbindungsobjekt schließen, um Datenbankressourcen zu sparen, sollten Sie aus demselben Grund auch das Anweisungsobjekt schließen.

Ein einfacher Aufruf der Methode close () erledigt den Job. Wenn Sie das Verbindungsobjekt zuerst schließen, wird auch das Anweisungsobjekt geschlossen. Sie sollten das Statement-Objekt jedoch immer explizit schließen, um eine ordnungsgemäße Bereinigung sicherzustellen.

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   stmt.close();
}

Zum besseren Verständnis empfehlen wir Ihnen, das Tutorial Statement - Beispiel zu lesen .

Die PreparedStatement-Objekte

Die PreparedStatement- Schnittstelle erweitert die Anweisungsschnittstelle, die Ihnen zusätzliche Funktionen mit einigen Vorteilen gegenüber einem generischen Anweisungsobjekt bietet.

Diese Anweisung bietet Ihnen die Flexibilität, Argumente dynamisch bereitzustellen.

PreparedStatement-Objekt erstellen

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

Alle Parameter in JDBC werden durch die dargestellt ?Symbol, das als Parametermarkierung bezeichnet wird. Sie müssen Werte für jeden Parameter angeben, bevor Sie die SQL-Anweisung ausführen.

Das setXXX() Methoden binden Werte an die Parameter, wobei XXXstellt den Java-Datentyp des Werts dar, den Sie an den Eingabeparameter binden möchten. Wenn Sie vergessen, die Werte anzugeben, erhalten Sie eine SQLException.

Jeder Parametermarker wird durch seine Ordnungsposition bezeichnet. Der erste Marker repräsentiert Position 1, die nächste Position 2 und so weiter. Diese Methode unterscheidet sich von der von Java-Array-Indizes, die bei 0 beginnen.

Alle der Statement object'sMethoden für die Interaktion mit der Datenbank (a) execute (), (b) executeQuery () und (c) executeUpdate () funktionieren auch mit dem PreparedStatement-Objekt. Die Methoden werden jedoch so geändert, dass SQL-Anweisungen verwendet werden, mit denen die Parameter eingegeben werden können.

Schließen des PreparedStatement-Objekts

So wie Sie ein Statement-Objekt schließen, sollten Sie aus demselben Grund auch das PreparedStatement-Objekt schließen.

Ein einfacher Aufruf der Methode close () erledigt den Job. Wenn Sie das Verbindungsobjekt zuerst schließen, wird auch das PreparedStatement-Objekt geschlossen. Sie sollten das PreparedStatement-Objekt jedoch immer explizit schließen, um eine ordnungsgemäße Bereinigung sicherzustellen.

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   pstmt.close();
}

Lassen Sie uns zum besseren Verständnis Prepare - Example Code studieren .

Die CallableStatement-Objekte

So wie ein Connection-Objekt die Statement- und PreparedStatement-Objekte erstellt, erstellt es auch das CallableStatement-Objekt, mit dem ein Aufruf einer gespeicherten Datenbankprozedur ausgeführt wird.

CallableStatement-Objekt erstellen

Angenommen, Sie müssen die folgende gespeicherte Oracle-Prozedur ausführen:

CREATE OR REPLACE PROCEDURE getEmpName 
   (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END;

NOTE: Die oben gespeicherte Prozedur wurde für Oracle geschrieben, aber wir arbeiten mit der MySQL-Datenbank. Schreiben wir also dieselbe gespeicherte Prozedur für MySQL wie folgt, um sie in der EMP-Datenbank zu erstellen.

DELIMITER $$

DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName` 
   (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END $$

DELIMITER ;

Es gibt drei Arten von Parametern: IN, OUT und INOUT. Das PreparedStatement-Objekt verwendet nur den Parameter IN. Das CallableStatement-Objekt kann alle drei verwenden.

Hier sind die Definitionen von jedem -

Parameter Beschreibung
IM Ein Parameter, dessen Wert beim Erstellen der SQL-Anweisung unbekannt ist. Sie binden Werte mit den Methoden setXXX () an IN-Parameter.
AUS Ein Parameter, dessen Wert von der zurückgegebenen SQL-Anweisung bereitgestellt wird. Sie rufen Werte aus den OUT-Parametern mit den Methoden getXXX () ab.
INOUT Ein Parameter, der sowohl Eingabe- als auch Ausgabewerte bereitstellt. Sie binden Variablen mit den Methoden setXXX () und rufen Werte mit den Methoden getXXX () ab.

Das folgende Codefragment zeigt, wie das verwendet wird Connection.prepareCall() Methode zur Instanziierung a CallableStatement Objekt basierend auf der vorhergehenden gespeicherten Prozedur -

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

Die String-Variable SQL repräsentiert die gespeicherte Prozedur mit Parameterplatzhaltern.

Die Verwendung der CallableStatement-Objekte ähnelt der Verwendung der PreparedStatement-Objekte. Sie müssen Werte an alle Parameter binden, bevor Sie die Anweisung ausführen. Andernfalls erhalten Sie eine SQLException.

Wenn Sie IN-Parameter haben, befolgen Sie einfach dieselben Regeln und Techniken, die für ein PreparedStatement-Objekt gelten. Verwenden Sie die Methode setXXX (), die dem zu bindenden Java-Datentyp entspricht.

Wenn Sie die Parameter OUT und INOUT verwenden, müssen Sie eine zusätzliche CallableStatement-Methode verwenden, registerOutParameter (). Die Methode registerOutParameter () bindet den JDBC-Datentyp an den Datentyp, den die gespeicherte Prozedur voraussichtlich zurückgeben wird.

Sobald Sie Ihre gespeicherte Prozedur aufrufen, rufen Sie den Wert mit der entsprechenden Methode getXXX () aus dem Parameter OUT ab. Diese Methode wandelt den abgerufenen Wert des SQL-Typs in einen Java-Datentyp um.

CallableStatement-Objekt schließen

Genau wie Sie ein anderes Anweisungsobjekt schließen, sollten Sie aus demselben Grund auch das CallableStatement-Objekt schließen.

Ein einfacher Aufruf der Methode close () erledigt den Job. Wenn Sie das Verbindungsobjekt zuerst schließen, wird auch das CallableStatement-Objekt geschlossen. Sie sollten das CallableStatement-Objekt jedoch immer explizit schließen, um eine ordnungsgemäße Bereinigung sicherzustellen.

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   cstmt.close();
}

Zum besseren Verständnis würde ich vorschlagen, Callable - Example Code zu studieren .