Prepared Statement
Du hast vielleicht bemerkt, dass wir im vorherigen Abschnitt keine vorbereitete Anweisung verwendet haben.
Das war das erste und letzte Mal, dass du in diesem Lehrgang eine "Anweisung" gesehen hast.
Von nun an werden wir immer vorbereitete Anweisungen verwenden.
Warum?
Weil es nur Vorteile hat, ein PreparedStatement
anstelle eines Statements
zu verwenden.
- Sie verhindern SQL-Injection
- Sie ermöglichen die Stapelverarbeitung von Abfragen
- Code mit Parametern ist einfacher zu erstellen
- Sie sind vorkompiliert und ermöglichen Caching auf der Datenbankseite.
- Beschleunigt die Kommunikation über ein binäres Nicht-SQL-Protokoll
Eine ausführlichere Erklärung findest du unter Baeldung
Ein PreparedStatement
wird von der Connection
auf die gleiche Weise wie ein Statement
abgerufen.
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class PreparedStatementUsage {
static DataSource dataSource;
public static void main(String[] args) {
try /*(1)*/(Connection conn = dataSource.getConnection(); //(2)
PreparedStatement stmt = /*(3)*/ conn.prepareStatement(
/*(4)*/ "SELECT player_name FROM player WHERE id = ?")) {
stmt.setInt(1, 10); //(5)
ResultSet resultSet = stmt.executeQuery(); //(6)
// hier kommt mehr
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- Deklariere unseren try with resources-Block
- Rufe eine Verbindung von unserer DataSource ab
- Erstelle eine neue vorbereitete Anweisung
- Definiere unsere Abfrage mit einem Platzhalter ->
id = ?
- Setze den ersten Parameter in unserer Abfrage auf den Wert 10
- Führe die Abfrage aus
Gehen wir es Schritt für Schritt durch.
- Deklariere unseren try with resources-Block
- Rufe eine Verbindung von unserer DataSource ab
- Erstelle eine neue vorbereitete Anweisung
- Definiere unsere Abfrage mit einem Platzhalter ->
id = ?
- Setze den ersten Parameter in unserer Abfrage auf den Wert 10
- Führe die Abfrage aus
Die Werte in einer vorbereiteten Anweisung beginnen mit dem Index 1. Du musst sie nicht in der richtigen Reihenfolge setzen, aber du musst sie alle setzen.