Wie kann man in Java ein Prepared Statement erzeugen?
Ein Prepared Statement ist eine Form der Datenbankanweisung, die ohne Werte vorkompiliert im Datenbanksystem vorliegt und nur noch mit den gewünschten Werten versehen werden muss. Das hat den Vorteil, dass besonders etwa in Schleifen sich wiederholende Anweisungen erheblich schneller ausgeführt werden können. Nebenbei werden unerwünschte Datenbank-Injections wirkungsvoll erschwert, da die Werte auf ihre Gültigkeit hin geprüft werden.
Das Beispiel führt eine einfache Datenbankabfrage
nach dem Wohnort und der Straße eines durch Vor-
und Nachnamen definierten Angestellten aus.
Sie muss
aus zwei Gründen innerhalb eines try-catch
-Blockes
abgesichert werden: Zum Einen kann es vorkommen, dass
die Treiberklasse nicht gefunden wird, zum Anderen
müssen Fehler bei der Interaktion mit der Datenbank
abgefangen werden.
Nach der Definition der URL zur
MySQL-Datenbank wird der Datenbanktreiber geladen. Die
statische Methode DriverManager.getConnection()
liefert nach Übergabe des Benutzernamens, des
Passwortes und der URL ein Connection
-Objekt. Dessen Methode prepareStatement()
erzeugt das gewünschte Prepared Statement. Hierbei
handelt es sich um einen 'normalen' SQL-String, der als
Parameter übergeben wird. Er weist jedoch eine
Besonderheit auf: Statt fixer Werte enthält er an
deren Stelle ein '?', das ohne Anführungszeichen
als Platzhalter eingesetzt wird.
Je nach Datentyp des
Wertes stellt PreparedStatement
eine Reihe
von Setter-Methoden bereit, die die gewünschten
Werte einfügen. Im Beispiel wird zweimal setString()
verwendet. Den Methoden werden jeweils zwei Parameter
übergeben. Der erste, ein Integer-Wert, gibt an,
welcher Platzhalter angesprochen wird. Begonnen wird mit
1, nicht mit 0. Der zweite Parameter ist der
einzusetzende Wert. Die Methode executeQuery()
liefert schließlich ein ResultSet
-Objekt, das auf die übliche Art und Weise, hier
eine Ausgabe in einer while
-Schleife,
weiterverarbeitet werden kann.
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Connection;
public class PreparedStatementClass {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost/Personal";
createStmt(url);
}
public static void createStmt(String url) {
try (Connection conn = DriverManager.getConnection(url, "user", "password");
PreparedStatement ps = conn
.prepareStatement("SELECT Wohnort, Strasse FROM Angestellte WHERE Vorname=? AND Nachname=?");) {
Class.forName("com.mysql.cj.jdbc.Driver");
ps.setString(1, "Willi");
ps.setString(2, "Meier");
ResultSet rs = ps.executeQuery();
while (rs.next())
System.out.println(rs.getString(1) + "\n" + rs.getString(2));
} catch (ClassNotFoundException e) {
System.err.println("Fehler beim Laden des JDBC-Treibers");
e.printStackTrace();
} catch (SQLException e) {
System.err.println("Fehler bei der Datenbankabfrage");
e.printStackTrace();
}
}
}
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.