20.2 Eine Beispielabfrage
Um mit der JDBC-API warm zu werden, fangen wir mit einem Beispiel an.
20.2.1 Schritte zur Datenbankabfrage
Folgende Schritte sind für einen Zugriff auf eine relationale Datenbank mit JDBC erforderlich:
Einbinden der JDBC-Datenbanktreiber in den Modulpfad
unter Umständen Anmelden der Treiberklassen
Verbindung zur Datenbank aufbauen
eine SQL-Anweisung erzeugen
eine SQL-Anweisung ausführen
das Ergebnis der Anweisung holen, bei Ergebnismengen über diese iterieren
die Datenbankverbindung schließen
Wir beschränken uns im Folgenden darauf, eine Verbindung zum freien Datenbankmanagementsystem H2 herzustellen, wobei der Zugriff für jede relationale Datenbank – bis auf die JDBC-URL – gleich aussieht.
20.2.2 Mit Java auf die relationale Datenbank zugreifen
Unser Programm soll eine Datenbank namens TutegoDB nutzen, die wir aufbauen, wenn sie am Anfang leer ist. In JDBC werden wir den Namen in die JDBC-URL einbauen, doch die genaue Syntax ist bei jedem JDBC-Treiber etwas anders. H2 soll die Datenbank als Datei im Benutzerverzeichnis lokalisieren und daher sieht die JDBC-URL so aus: »jdbc:h2:file:~/TutegoDB«. Wir können ebenso absolute Pfade angeben, etwa »jdbc:h2:file:C:/TutegoDB«. H2 liest 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. Ist die Datenbank als solche noch nicht angelegt, legt H2 sie automatisch an.
String url = "jdbc:h2:file:~/TutegoDB";
try ( Connection con = DriverManager.getConnection( url, "sa", "" );
Statement stmt = con.createStatement() ) {
// Tabelle CUSTOMER fehlt? Dann anlegen
if ( ! con.getMetaData().getTables( null, null, "CUSTOMER", null ).next() ) {
String[] sqlStmts = {
"CREATE TABLE CUSTOMER(ID INTEGER NOT NULL PRIMARY KEY,FIRSTNAME VARCHAR(255),"
+ "LASTNAME VARCHAR(255),STREET VARCHAR(255),CITY VARCHAR(255))",
"INSERT INTO CUSTOMER VALUES(0,'Laura','Steel','429 Seventh Av.','Dallas')",
"INSERT INTO CUSTOMER VALUES(1,'Susanne','King','366 - 20th Ave.','Olten')",
"INSERT INTO CUSTOMER VALUES(2,'Anne','Miller','20 Upland Pl.','Lyon')" };
for ( String sql : sqlStmts )
stmt.executeUpdate( sql );
System.out.println( "Tabelle und Daten neu angelegt" );
}
// Tabelle abfragen
try ( ResultSet rs = stmt.executeQuery( "SELECT * FROM CUSTOMER" ) ) {
while ( rs.next() )
// Zugriff auf FIRSTNAME, LASTNAME, STREET
System.out.printf( "%s, %s %s%n", rs.getString( 1 ),
rs.getString( 2 ), rs.getString( 3 ) );
}
}
catch ( SQLException e ) {
e.printStackTrace();
}
Beim ersten Start prüft das Programm, ob schon Tabellen in der Datenbank vorhanden sind. Wenn nicht, legt es eine neue Tabelle an und fügt drei Datensätze ein.