Webbasierte Informationssysteme SS 2004 Java-Datenbankzugriff mit JDBC Prof. Dr. Böttcher Java-Datenbankzugriff mit JDBC Vorlesungsmaterial zu JDBC von Prof. Dr. Stefan Böttcher Inhaltsverzeichnis: 1. Praktische Hinweise zum Arbeiten mit JDBC, ODBC und dem Datenbanksystem 2. Übungsaufgaben 2.1. Datenbestände aufbauen in JDBC (mit Access) 2.2. Datenbestände abfragen in JDBC (mit Access) 3. Beispielprogramme 3.1. Datenbankinitialisierung : Programmlisting dbinit.java 3.2. Datenselektion : Programmlisting dbselect.java 1. Praktische Hinweise zum Arbeiten mit JDBC, ODBC und dem Datenbanksystem 1.1. Systemvoraussetzungen prüfen (nur 1x – nur zuhause – nicht im PC Pool in E3.130) Folgende Voraussetzungen benötigen Sie, um die Programme auf Ihrem Rechner zu starten (für Ihren Rechner zuhause müssen Sie ggf. die Pfade entsprechend abändern) – alle Voraussetzungen sollten auf Ihrem Rechner im PC-Pool in E3.130 an der Uni bereits gegeben sein: 1. Sie brauchen ein Datenbanksystem, z.B. Access 2000 unter Windows 95/98/NT/2000/Me/XP 2. Das Java Development Kit von Sun, z.B. für Windows XP muss installiert sein, z.B. unter c:\j2sdk1.4.0_01. Von http://java.sun.com/j2se/1.4.2/download.html können Sie sich Java kostenlos herunterladen (Java-Version 1.3. genügt aber auch). 3. ODBC muss installiert sein. 1.2. So wurde die Access-Datenbank erzeugt (nur 1x – ist jetzt nicht mehr nötig) Für die Übungen genügt eine leere Access-Datenbank. Unter Access97 starten Sie Access und wählen Sie "Erstellen einer neuen Datenbank unter Verwendung von leerer Datenbank" Wählen Sie "erstellen", speichern Sie Ihre Datenbank (z.B. unter C:\db2.mdb), und verlassen Sie Access.1 Die mitgelieferte Datenbank db2000.mdb wurde unter Access 2000 durch Konvertierung aus db2.mdb erstellt. 1 Unter Access XP existiert dieses Fenster nicht mehr. Stattdessen gibt es am rechten Rand eine Leiste, in der man „Neu…/Leere Datenbank“ wählen muss. Seite 1 von 12 Webbasierte Informationssysteme SS 2004 Java-Datenbankzugriff mit JDBC Prof. Dr. Böttcher 1.3. Datenbank unter ODBC anmelden (nur 1x , ist aber an der Uni und zuhause nötig) Wählen Sie unter Windows 95/98/NT Arbeitsplatz | Systemsteuerung | ODBC und die Karte Benutzer-DSN bzw unter Windows2000 Arbeitsplatz | Systemsteuerung | Verwaltung | ODBC und die Karte Benutzer-DSN bzw. unter Windows XP Arbeitsplatz | Systemsteuerung | Verwaltung | Datenquellen(ODBC) und die Karte Benutzer-DSN. Falls der Name "odbc2access" noch nicht eingetragen ist, tun Sie folgendes: clicken Sie auf "Hinzufügen" , und wählen Sie dann aus der Liste als Treiber den Namen "Microsoft Access-Treiber (*.mdb)". Clicken Sie auf "Fertigstellen". Wählen Sie als Datenquellenname "odbc2access". Im Panel Datenbank clicken Sie dann auf "Auswählen" und wählen Sie die erstellte Access-Datenbank aus, und zwar die mitgelieferte Datenbank db2000.mdb für Access 2000 (bzw. db2.mdb für Acsess 97). Wählen Sie mehrfach OK, um den ODBC-Datenquellen-Administrator zu verlassen. 1.4. Java-Pfade setzen am PC im Pool in E3.130 (welche Pfade hängt vom Pool-Rechner ab !) Um Java 1.4. am PC-Pool der Uni zu benutzen, setzen Sie die Umgebungsvariablen path und classpath in jeder DOS-Box mit einem Aufruf der Batch-Datei j13pool oder j14pool auf set classpath=.;c:\j2sdk1.4.0_01\lib\dt.jar;c:\c:\j2sdk1.4.0_01\lib\tools.jar;%classpath% set path=c:\j2sdk1.4.0_01\bin;%path% oder auf set classpath=.;c:\jdk1.3.1_03\lib\dt.jar;c:\jdk1.3.1_03\lib\tools.jar;%classpath% set path=c:\jdk1.3.1_03\bin;%path% Dieser Schritt ist nicht notwendig, wenn bei dem aktuellen Benutzerkonto die Umgebungsvariablen schon dauerhaft über Arbeitsplatz | Erweitert | Umgebungsvariablen richtig gesetzt wurden, z. B. in der vorangegangenen Übung zum Thema „Servlets“. Anschließend können Sie Java-Programme, z.B. dbinit.java mit javac dbinit.java übersetzen und das übersetzte Programm danach mit java dbinit starten. Arbeitsverzeichnis > j14pool <oder> Arbeitsverzeichnis > javac dbinit.java Arbeitsverzeichnis > java dbinit j13pool 1.5. Überblick über die Beipielprogramme Das Programm dbinit.java erzeugt Ihnen unsere Beispieldatenbank. Es zeigt Ihnen, wie man Tabellen anlegt und löscht und wie man Datensätze im Java-Programm zusammenbaut und in die Datenbank einträgt. Ein anderes Programm dbselect.java zeigt Ihnen, wie man mit JDBC Anfragen an die Datenbank stellt und die Ergebnisse im Java-Programm weiter verarbeitet. Seite 2 von 12 Webbasierte Informationssysteme SS 2004 Java-Datenbankzugriff mit JDBC Prof. Dr. Böttcher 2. Übungsaufgaben 2.1. Übungsaufgabe 1: Datenbestände aufbauen und abfragen A1. Übersetzen und starten Sie erst dbinit.java und dann dbselect.java , um zu sehen, wie die Datenbank initialisiert wird. A2. Ergänzen Sie zwei stmt.executeUpdate – Befehle in dbinit.java , nämlich für folgende Informationen: "Dell liefert auch noch einen pc400 für 1800 in 2 Tagen" und "Reich gibt auch noch einen pc500 in Auftrag" . Übersetzen und starten Sie dbinit.java erneut, und starten Sie dann dbselect.class , um sich die Änderungen anzusehen. A3. Programmieren Sie in der Datei dbselect.java die Query: „Zeige alle Informationen zu Liefert-Daten, die in maximal 4 Tagen lieferbar sind“ (Am einfachsten ist es, wenn Sie im Quellprogramm dbselect.java die SQL-Anfrage ändern.) A4. Programmieren Sie in der Datei dbselect.java die Query: „Zeige die Namen der Lieferanten von Lieferungen, die in Maximal 4 Tagen lieferbar sind und billiger als 2000 Euro sind“ (Am einfachsten ist es, wenn Sie im Quellprogramm dbselect.java die SQL-Anfrage ändern.) Ändern Sie ggf. die Daten der Datenbank, um Ihr Programm zu prüfen A5. Programmieren Sie in der Datei dbselect.java die Query: „Zeige die Namen aller Auftraggeber, die einen pc500 bestellt haben“ (Am einfachsten ist es, wenn Sie im Quellprogramm dbselect.java die SQL-Anfrage ändern.) Ändern Sie ggf. die Daten der Datenbank, um Ihr Programm zu prüfen Seite 3 von 12 Webbasierte Informationssysteme SS 2004 Java-Datenbankzugriff mit JDBC Prof. Dr. Böttcher 3. Die Beispielprogramme (Auszug) 3.1. Datenbankinitialisierung : Programmlisting dbinit.java import java.sql.*; public class dbinit { public static void main( String[] args ) { String ergebnis = "" ; try { Class c = Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Treiber für ODBC Connection con = DriverManager.getConnection("jdbc:odbc:odbc2access"); // : :DB-Name unter ODBC ergebnis = makeDB( con ) ; System.out.println( ergebnis ) ; con.close() ; // darf nicht von einer Exception aus makeDB übersprungen werden! } catch (Exception e) { System.out.println( e ) ; } } public static String makeDB( Connection con ) { String ausgabe="" ; // String zum Sammeln der Ausgabe try { Statement stmt = con.createStatement() ; try { stmt.executeUpdate( "drop table Liefert" ); } catch (Exception e) { } stmt.executeUpdate( "create table Liefert( Lieferant char(10), Teil char(10), " + " Preis int, Lieferzeit int ) " ); stmt.executeUpdate( "Insert into Liefert stmt.executeUpdate( "Insert into Liefert stmt.executeUpdate( "Insert into Liefert stmt.executeUpdate( "Insert into Liefert stmt.executeUpdate( "Insert into Liefert stmt.executeUpdate( "Insert into Liefert Seite 4 von 12 values('Vobis ','pc400',1700,3)" ); values('Dell ','pc500',2000,6)" ); values('IBM ','pc500',2500,6)" ); values('Vobis ','pc500',2000,3)" ); values('IBM ','pc600',3500,4)" ); values('Vobis ','pc600',2500,3)" ); Webbasierte Informationssysteme SS 2004 Java-Datenbankzugriff mit JDBC Prof. Dr. Böttcher try { stmt.executeUpdate( "drop table Auftrag" ); } catch (Exception e) { } stmt.executeUpdate( "create table Auftrag( Kunde char(10), PC char(10) ) " ); stmt.executeUpdate( "Insert into Auftrag values('Arm ','pc400') " ); stmt.executeUpdate( "Insert into Auftrag values('Meier','pc500') " ); stmt.executeUpdate( "Insert into Auftrag values('Reich','pc600') " ); stmt.close(); // Statement schließen ausgabe += "\nDatenbank initialisiert.\n" ; } catch (Exception e) { ausgabe += "\n" + "Fehler: " + e ; } return ausgabe ; } // makeDB zuende } // class zuende Seite 5 von 12 Webbasierte Informationssysteme SS 2004 Java-Datenbankzugriff mit JDBC Prof. Dr. Böttcher 3.2. Datenselektion : Programmlisting dbselect.java import java.sql.*; public class dbselect { public static void main( String[] args ) { String ergebnis = "" ; try { Class c = Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Treiber für ODBC Connection con = DriverManager.getConnection("jdbc:odbc:odbc2access"); // : :DB-Name unter ODBC ergebnis = selectTab( con , "2200" ) ; System.out.println( ergebnis ) ; con.close() ; } catch (Exception e) { System.out.println( e ) ; } } public static String selectTab( Connection con, String limit ) { String ausgabe="" ; // String zum Sammeln der Ausgabe try { Statement stmt = con.createStatement() ; ResultSet rsLiefert = stmt.executeQuery( "SELECT * FROM Liefert WHERE Preis < " + limit ) ; // // Strings in SQL müßten zusätzlich in einfache Hochkommas: "SELECT * FROM Liefert WHERE Teil = '" + limit + "'" ) ; ausgabe += "\n\nLiefert:\n( Lieferant Teil" + " Preis Lieferzeit )" ; while (rsLiefert.next()) // hole nächstes Tupel aus Result-Set { ausgabe += "\n" + rsLiefert.getString("Lieferant") + " " + rsLiefert.getString("Teil") + " " + rsLiefert.getInt("Preis") + " " + rsLiefert.getInt("Lieferzeit") ; } rsLiefert.close() ; stmt.close() ; // Result-Set schließen // Statement schließen } catch (Exception e) { ausgabe += "\nFehler bei Anfrage an die Datenbank:\n" + e ; } return ausgabe ; } // selectTab zuende } // class zuende Seite 6 von 12