Datenbankzugriff mit JDBC Datenbanken und Informationsysteme I Stefan Böttcher Adelhard Türling Universität Paderborn Inhaltsverzeichnis 1. 2. 3. 4. 5. 6. 7. Überblick über JDBC Wichtige Interfaces Datenbankinitialisierung : dbinit.java Datenselektion : dbselect.java Metadaten der Datenbank: dbinf.java Metadaten einer Tabelle: dbtab.java Praktische Hinweise zum Arbeiten mit JDBC, ODBC Adelhard Türling, Universität Paderborn Datenbanken und Informationssysteme I JDBC 2 / 24 Überblick über JDBC Java Data Base Connectivity Schnittstelle Package: • • • • java.sql (core) javax.sql (benutzt in J2EETM) http://java.sun.com/j2se/1.4.1/docs/api/ Tutorial: htp://java.sun.com/j2se/1.4.1/docs/api/ Adelhard Türling, Universität Paderborn Datenbanken und Informationssysteme I JDBC 3 / 24 Was ist und was bietet JDBC • • • Paket von Java-Klassen zum DB-Zugriff mit SQL vom Ziel-DBMS unabhängige API Standard seit Java 1.1 mittlerweite JDBCV3.0 Java-Programm Adelhard Türling, Universität Paderborn Datenbanken und Informationssysteme I JDBC: API Treibermanager Treiber Zieldatenbanksystem JDBC 4 / 24 Interfaces von JDBC • • • • • • SQLDriver: Treiber für ein Ziel-DBMS oder ODBC SQLDriverManager : registriert Treiber Connection : Für Verbindungen Statement : für Statement-Objekt, z.B. Query ResultSet : für Ergebnismenge DataBaseMetaData : für Schemainformationen Die Klassen zu diesen Interfaces werden von DB-Herstellern implementiert JDBC-ODBC-Brücke wird von SUN mitgeliefert Adelhard Türling, Universität Paderborn Datenbanken und Informationssysteme I JDBC 5 / 24 Datenbankzugriffe mit JDBC • • Treiber laden Class c = Class.forName(“com.sybase.jdbc.SybDriver“) ; Verbindung herstellen con = DriverManager.getConnection( "jdbc:sybase:Tds:beethoven.uni-paderborn.de:4100/datenbanken01" , "userid", "password" ); Statement-Objekte definieren Statement stmt = con.createStatement() ; • Datenbank zugreifen ... Statement und Verbindung zum DBMS schließen stmt.close( ) ; con.close( ) ; (Fehlerbehandlung mit try-catch) Adelhard Türling, Universität Paderborn Datenbanken und Informationssysteme I JDBC 6 / 24 Datenbankzugriffe mit JDBC-ODBC Bridge • Treiber laden • Verbindung herstellen Class c = Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:odbc2access"); • Statement-Objekte definieren Statement stmt = con.createStatement() ; • Datenbank zugreifen ... Statement und Verbindung zum DBMS schließen stmt.close( ) ; con.close( ) ; (Fehlerbehandlung mit try-catch) Adelhard Türling, Universität Paderborn Datenbanken und Informationssysteme I JDBC 7 / 24 Datenbank initialisieren mit JDBC Class c = Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:odbc2access"); Statement stmt = con.createStatement() ; • Datenbank initialisieren (Data Defenition Language DDM) stmt.executeUpdate( "drop table Liefert" ); stmt.executeUpdate( "create table Liefert( Lieferant char(10), Teil char(10), " + " Preis int, Lieferzeit int ) " ); • Einfügen (Data Manipulation Language DML) stmt.executeUpdate( "Insert into Liefert values('Vobis ','pc400',1700,3)" ); ... Adelhard Türling, Universität Paderborn Datenbanken und Informationssysteme I JDBC 8 / 24 Datenbank-Anfragen mit JDBC Class c = Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:odbc2access"); Statement stmt = con.createStatement() ; • Datenbankanfrage stellen ResultSet rsLiefert = stmt.executeQuery( “ select * from Liefert where Teil = ‘pc500‘ “); while ( rsLiefert.next( ) ) // hole nächstes Tupel aus Result-Set { ausgabe += rsLiefert.getString( "Lieferant" ) ; // ggf. weitere Spalten ausgeben } stmt.close( ) ; con.close( ) ; Adelhard Türling, Universität Paderborn Datenbanken und Informationssysteme I JDBC 9 / 24 Metadaten der Connection Class c = Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:odbc2access"); Statement stmt = con.createStatement() ; • Metadaten holen DatabaseMetaData md = con.getMetaData(); • Hilfsvariable final String[] tabellen = {"TABLE"}; • Hole Tabellennamen ResultSet tablesNames =md.getTables(null,null,null,tabellen); while (tablesNames.next()) { // Hole Tabellenname String tablename = new String(tablesNames.getString(3)); ausgabe += tablename + "\n" ; } Adelhard Türling, Universität Paderborn Datenbanken und Informationssysteme I JDBC 10 / 24 Metadaten einer Tabelle ResultSet rs = stmt.executeQuery("select * from " + "Auftrag"); • Hole Meta-Daten für dieses Result Set ResultSetMetaData rsmd= rs.getMetaData(); int spaltenAnzahl = rsmd.getColumnCount(); • Attribut Namen der Tabelle for( spalte=1 ; spalte <= spaltenAnzahl ; spalte++ ) { ausgabe += rsmd.getColumnLabel( spalte ) + "\t\t" ; } ausgabe += "\n-------------------------------------\n" ; • Tupel ausgeben while (rs.next()) {for( spalte=1 ; spalte <= spaltenAnzahl ; spalte++ ) { ausgabe += rs.getString(spalte) + "\t" ; } ausgabe += "\n" ; } Adelhard Türling, Universität Paderborn Datenbanken und Informationssysteme I JDBC 11 / 24 Praktische Hinweise zum Arbeiten mit JDBC, ODBC • • • • • Systemvoraussetzungen Datenbanksystem: Access, Oracle oder anderes rel. DBMS JDK (aktuell: J2DK1.4) Umgebungsvariable path: z.B. set Path=C:\j2sdk1.4.0\bin;%path% Umgebungsvariable classpath: z.B. set classpath=.;c:\j2sdk1.4.0\lib ODBC muß installiert sein. Adelhard Türling, Universität Paderborn Datenbanken und Informationssysteme I JDBC 12 / 24 ACCESS ODBC Quelle einrichten 1. Mit Access eine neue DB erstellen und speichern: Z.B.: dbtest.mdb 2. ODBC Quelle für Access einrichten: • • • • • Arbeitsplatz | Systemsteuerung | Verwaltung | ODBC Karte Benutzer-DSN Name z.B. "odbc2access" Treiber: "Microsoft Access-Treiber (*.mdb)". Bestätigen mit "OK" 3. Nun ist unter dem Namen: "odbc2access" die Access DB über die abstrakte Schnittstelle ODBX erreichbar Adelhard Türling, Universität Paderborn Datenbanken und Informationssysteme I JDBC 13 / 24 Excle als ODBC Quelle Adelhard Türling, Universität Paderborn Datenbanken und Informationssysteme I JDBC 14 / 24