Wie kann man in Java ein Prepared Statement erzeugen?

Das Package java.sql kennt das Interface PreparedStatement mit dem solche vorbereitete Anweisungen ausgeführt werden können.

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.
Der Einfachheit halber wird die Abfrage direkt in der main -Methode ausgeführt. 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) {
        try {
            String url = "jdbc:mysql://localhost/Personal";
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection(url, "username",
                    "password");
            PreparedStatement ps = conn
                    .prepareStatement("SELECT Wohnort, Strasse FROM Angestellte WHERE Vorname=? AND Nachname=?");
            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));
            ps.close();
            conn.close();
        } 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();
        }
    }
}