JDBC EDV2 - 03 - JDBC 1 EDV2 - 03 - JDBC JDBC : "Java Database Connectivity" JDBC stellt eine standarisierte Methode zum Zugriff auf Datenbanken aus Java-Programmen zur Verfügung. Einige Datenbanken unterstützen den JDBC-Standard direkt. Viele andere unterstützen ODBC "Open Database Connectivity". Diese können übereinen zu Java gehörigen JDBC-ODBC-Umsetzer angesprochen werden. Damit können fast alle existierenden Datenbanken direkt oder indirekt angesprochen werden. JDBC enthält Möglichkeiten: Verbindungen zu Datenbanken zu öffnen und zu schließen, SQL-Anweisungen an Datenbanken zu schicken und die Antworten entgegenzunehmen und deren Auswertung im Java-Programm zu ermöglichen. 2 EDV2 - 03 - JDBC JDBC baut vollständig auf SQL auf. SQL "Standard Query Language". Die Kommunikation zwischen dem Java-Programm und der Datenbank erfolgt über SQL-Anweisungen. Diese werden als Text an die Datenbank geschickt, die daraufhin als Antwort die Ergebnisse zurückschickt. Die SQL-Anweisungen werden nicht vom Java-Compiler auf Korrektheit geprüft. Fehler können also erst durch die Datenbank festgestellt werden. Eine weitere Möglichkeit aus Java Datenbanken abzufragen und zu bearbeiten ist SQLJ von IBM, Oracle, Sybase, Informix u.a. SQLJ baut ebenfalls auf SQL auf. Die Anweisungen werden jedoch schon in Java geprüft. Fehler können also schon von Java erkannt werden. 3 1. Erstellen einer Datenbank EDV2 - 03 - JDBC Zunächst muss die Datenbank aufgebaut werden. Dazu müssen geeignete Programme genutzt werde, z.B. Access, dBase, Oracle, Sybase, Informix, DB2, Excel u.s.w. Unser Beispiel ist eine Access-Datenbank mit folgenden Tabellen: Studenten • MatrikelNr, Long Integer, Primärschlüssel • Name, Text • Vorname, Text Veranstaltungen • VeranstaltungsNr, Long Integer, Primärschlüssel • Titel, Text • Kurzbezeichnung, Text • Semester, Text • Art, Text • Stunden, Integer 4 Belegungen • Id, Long Integer, Primärschlüssel • MatrikelNr, Referenz auf Tabelle Studenten • VeranstaltungsNr, Referenz auf Tabelle Veranstaltungen Belegungen id MatrikelNr EDV2 - 03 - JDBC VeranstaltungsNr Veranstaltungen VeranstaltungsNr Titel 5 Studenten Kurzbezeichnung MatrikelNr Semester Name Art Vorname Stunden 2. DB in ODBC registrieren EDV2 - 03 - JDBC In der Systemsteuerung ODBC bzw. ODBC32 bzw. ODBCdatenquellen öffnen. Es können ODBC-Quellen registriert werden. Dabei können die Datenbanken so registriert werden, dass nur der Nutzer selber auf sie zugreifen kann (Benutzer-DSN) oder so dass alle Nutzer auch über das Netz darauf zugreifen können (system-DSN). Dabei können u.A. auch Namen und Passworte für den Zugriff festgelegt werden. Wichtig: Datenquellenname ist der Name unter dem von Java auf die Datenbank zugegriffen wird. Vorteile: Es existiert ein einheitlicher Zugriff zu allen Datenbanken. Das Java-Programm muss keine Informationen über die konkrete Datenbankdatei haben. Ohne Änderung des des Java-Programms kann die Datenbank (Art, Ort) geändert werden. 6 3. Treiber in Java laden Um vom Java-Programm auf eine Datenbank zugreifen zu können, muss ein passender Treiber geladen werden. Welcher Treiber passend ist hängt von der Datenbank und dem Betriebssystem ab. In Windows gibt es ODBC-Treiber für alle Datenbanken. Also kann in der Regel der JDBC-ODBC-Treiber von SUN verwendet werden: sun.jdbc.odbc.JdbcOdbcDriver EDV2 - 03 - JDBC Der Treiber braucht nur ein mal geladen zu werden und steht dann immer zur Verfügung. Laden erfolgt in einem statischen Block einer Klasse. Laden des Treibers erfolgt z.B. mit Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Ausnahme ClassNotFoundException muss abgefangen werden. 7 public class StudentenDB { static { String driv = "sun.jdbc.odbc.JdbcOdbcDriver"; try { EDV2 - 03 - JDBC Class.forName(driv); } catch (ClassNotFoundException cnfe) { System.err.println(driv+" nicht gefunden!"); System.exit(1); } } } 8 4. Öffnen der Datenbank Zum Herstellen der Verbindung zwischen der Datenbank und dem Java-Programm stellt die Klasse DriverManager die Methode getConnection zur Verfügung. public static Connection getConnection(String url) EDV2 - 03 - JDBC Mit Hilfe von url wird dir zu öffnende Verbindung beschrieben. Die genaue Form hängt vom Treiber und von der Datenbank ab. url = protocol:subprotocol:database protocol = jdbc subprotocol = odbc database = StudentenDatenbank Andere Formen von getConnection erlauben die Angabe von Namen und Passwort. Die Herstellung der Verbindung muss vor jedem erneuen Zugriff geschehen. Z.B. in eine Konstruktor. Die Datenbank wird geschlossen, indem die close-Methode der Verbindung aufgerufen wird. 9 private Connection dbConn = null; private String connString = "jdbc:odbc:StudentenDatenbank"; public StudentenDB() { try { dbConn = DriverManager.getConnection(connString); } catch (SQLException sqle) { System.err.println("Fehler beim Öffnen der Verbindung "+connString); System.exit(2); EDV2 - 03 - JDBC } } public void close() { try { dbConn.close(); } catch (SQLException sqle) { System.err.println("Fehler beim Schließen der Verbindung "+connString); System.exit(3); }} 10 5. Datenbank abfragen EDV2 - 03 - JDBC 11 Abfragen erfolgen grundsätzlich mit Hilfe von SQL-Anweisungen. SQL-Anweisungen werden durch die execute-Methode eines Statement-Objektes ausgeführt. Durch die erfolgreiche Ausführung einer SQL-Anweisung wird ein ResultSet-Objekt erzeugt, das die Ergebnisse der Abfrage in Form einer Tabelle enthält. Durch die next-Methode des ResultSet-Objektes kann durch die Zeilen der Ergebnistabelle gewandert werden. Mit Hilfe der getXXX-Methoden des ResultSet-Objektes können die Elemente der Zeilen abgefragt werden. Mit Hilfe der Klasse ResultSetMetaData können Informationen über die Spalten der Tabelle (Name, Datentyp, Schreibbarkeit u.s.w.) abgefragt werden. EDV2 - 03 - JDBC 12 public void printContent(String table) { try { System.out.println(">>>>>>>>>>>>> "+table +" >>>>>>>>>>>>>"); Statement pC = dbConn.createStatement(); pC.execute("SELECT * FROM "+table); ResultSet res = pC.getResultSet(); ResultSetMetaData resMD = res.getMetaData(); int col = resMD.getColumnCount(); for (int i=1;i<=col;i++ ) System.out.print(resMD.getColumnLabel(i)+"\t"); System.out.println(); while (res.next()) { for (int i=1;i<=col;i++ ) System.out.print(res.getString(i)+"\t"); System.out.println(); } res.close(); } catch (SQLException sqle) { System.err.println("Fehler beim Lesen der Verbindung "+connString); System.exit(4); } }