21.4Eine Beispielabfrage
21.4.1Schritte zur Datenbankabfrage
Wir wollen kurz die Schritte skizzieren, die für einen Zugriff auf eine relationale Datenbank mit JDBC erforderlich sind:
Einbinden der JDBC-Datenbanktreiber in den Klassenpfad
unter Umständen Anmelden der Treiberklassen
Verbindung zur Datenbank aufbauen
eine SQL-Anweisung erzeugen
SQL-Anweisung ausführen
das Ergebnis der Anweisung holen, bei Ergebnismengen über diese iterieren
die Datenbankverbindung schließen
Wir beschränken uns im Folgenden auf die Verbindung zum freien Datenbanksystem HSQLDB.
21.4.2Ein Client für die HSQLDB-Datenbank
Ein Beispiel soll zu Beginn die Programmkonzepte für JDBC veranschaulichen, bevor wir im Folgenden das Java-Programm weiter sezieren. Das Programm in der Klasse FirstSqlAccess nutzt die Datenbank TutegoDB, die sich im Suchpfad befinden muss; wir können ebenso absolute Pfade bei HSQLDB angeben, etwa C:/TutegoDB. Bei der Parametrisierung »jdbc:hsqldb:file:…« von HSQLDB liest die Datenbank beim ersten Start die Daten aus der Datei ein, verwaltet sie im Speicher und schreibt sie am Ende des Programms wieder in eine Datei zurück.
Da wir die Datenbank schon früher mit Demodaten gefüllt haben, lässt sich jetzt eine SQL-SELECT-Abfrage absetzen:
Listing 21.1com/tutego/insel/jdbc/FirstSqlAccess.java
import java.sql.*;
public class FirstSqlAccess {
public static void main( String[] args ) {
try {
Class.forName( "org.hsqldb.jdbcDriver" );
}
catch ( ClassNotFoundException e ) {
System.err.println( "Keine Treiber-Klasse!" );
return;
}
String url = "jdbc:hsqldb:file:TutegoDB;shutdown=true";
try ( Connection con = DriverManager.getConnection( url, "sa", "" );
Statement stmt = con.createStatement() ) {
// stmt.executeUpdate( "INSERT INTO CUSTOMER VALUES(" +
// "50,'Christian','Ullenboom','Immengarten 6','Hannover')" );
ResultSet rs = stmt.executeQuery( "SELECT * FROM Customer" );
while ( rs.next() )
System.out.printf( "%s, %s %s%n", rs.getString(1),
rs.getString(2), rs.getString(3) );
rs.close();
}
catch ( SQLException e ) {
e.printStackTrace();
}
}
}
Dem Beispiel ist in diesem Status schon die aufwändige Fehlerbehandlung anzusehen. Das Schließen vom ResultSet und Statement ist vereinfacht, aber okay, weil das try mit Ressourcen auf jeden Fall die Connection schließt, und darauf kommt es an.
[»]Hinweis
Es ist möglich, auch ohne ODBC-Eintrag Zugriff auf eine Access-Datenbank aufzubauen – nützlich ist das zum Beispiel dann, wenn der Name der Datenbank erst später bekannt wird.
"{Microsoft Access Driver (*.mdb)};DBQ=c:/daten/test.mdb",
"name", "pass" );
Ein ähnlicher String kann auch für den Zugriff auf eine dBase-Datenbank genutzt werden, für die ein ODBC-Treiber angemeldet ist:
Das funktioniert jedoch nicht mehr unter Java 8, da der JDBC-ODBC-Treiber nicht mehr Teil der Standarddistribution ist.