120 likes | 289 Views
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.
E N D
JDBC 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. 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. EDV2 - 03 - JDBC
1. Erstellen einer Datenbank • 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 EDV2 - 03 - JDBC
Studenten Belegungen Veranstaltungen MatrikelNr id VeranstaltungsNr Name MatrikelNr Titel Vorname VeranstaltungsNr Kurzbezeichnung Semester Art Stunden • Belegungen • Id, Long Integer, Primärschlüssel • MatrikelNr, Referenz auf Tabelle Studenten • VeranstaltungsNr, Referenz auf Tabelle Veranstaltungen EDV2 - 03 - JDBC
2. DB in ODBC registrieren • In der Systemsteuerung ODBC bzw. ODBC32 bzw. ODBC-datenquellen ö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. EDV2 - 03 - JDBC
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 • 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. EDV2 - 03 - JDBC
public class StudentenDB { static { String driv = "sun.jdbc.odbc.JdbcOdbcDriver"; try { Class.forName(driv); } catch (ClassNotFoundException cnfe) { System.err.println(driv+" nicht gefunden!"); System.exit(1); } } } EDV2 - 03 - JDBC
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) • 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. EDV2 - 03 - JDBC
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); } } public void close() { try { dbConn.close(); } catch (SQLException sqle) { System.err.println("Fehler beim Schließen der Verbindung "+connString); System.exit(3); } } EDV2 - 03 - JDBC
5. Datenbank abfragen • 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
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); } } EDV2 - 03 - JDBC