JDBC JDBC in 5 Schritten JDBC (Java Database Connectivity) ist eine Sammlung von Klassen und Schnittstellen, mit deren Hilfe man Verbindungen zwischen Javaprogrammen und Datenbanken herstellen kann. 1 Einrichten Treiberverbindung Es kann z.B. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann. Folgende Schritte sind nun unter Windows durchzuführen : (1) Öffnen des Ordners SYSTEMSTEUERUNG (START/EINSTELLUNGEN/SYSTEMSTEUERUNG) (2) Doppelklicken auf das Symbol 32-Bit-ODBC. (3) Im Dialogfeld DATENQUELLEN auf den Schalter HINZUFÜGEN klicken. (4) Im Dialogfeld DATENQUELLEN HINZUFÜGEN wählen Sie den Microsoft Access-Treiber aus und klicken auf OK. Wird der Treiber im Listenfeld nicht aufgeführt, ist er nicht korrekt unter Windows installiert. (5) Geben Sie einen Namen für die neue Treiberverbindung ein. (6) Legen Sie fest, auf welche Datenbank die Treiberverbindung zugreifen soll. Klicken Sie dazu auf den Schalter AUSWÄHLEN und wählen Sie Ihre Datenbank aus. Achtung : Datenbank und zuvor gewählter Treiber müssen natürlich zueinander passen. (7) Zusätzlich können noch über den Schalter WEITERE OPTIONEN ein Benutzername (z.B. Mickey) und ein Password (z.B. Mouse) vergeben werden. (8) Schließen Sie die Dialogfelder. 1 JDBC 2 Zugriff auf eine Datenbank Ein Javaprogramm, das Zugriff auf eine Datenbank haben soll, beinhaltet im wesentlichen folgende Schritte : (1) Import-Anweisung im Programm import java.sql.* public class JDBCExample { public static void main (String[] args) { } } (2) Der JDBC-Treiber wird geladen. Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ; (3) Eine Verbindung wird hergestellt. Connection con = null ; String url = "jdbc:odbc:example" ; String login = "mickey" ; String password = "mouse" ; Connection con = DriverManager.getConnection(url, login, password) ; Eine Verbindung wird durch ein Objekt der Klasse Connection repräsentiert. Geöffnet wird die Verbindung durch einen Aufruf der Methode DriverManager.getConnection(). (4) Ein Statement wird erzeugt. Statement stmt = con.createStatement() ; Das Connection-Objekt liefert Datenbank-spezifische Statements. Alle Anweisungen an die Datenbank werden über Statements übertragen. SQLAusdrücke finden in Java also ihre Entsprechung im Statement-Objekt. 2 JDBC (5) Daten werden aus der Datenbank abgefragt. Die SQL-Abfragen werden in Strings abgelegt. Abfragen werden über Statement-Objekte an die Datenbank übermittelt. Das Ergebnis einer Abfrage wird in einem Objekt der Klasse ResultSet gespeichert. String query = "select * from tablename" ResultSet result = stmt.executeQuery(query) ; (6) Die Daten verarbeiten. while (result.next()) { System.out.println(result.getString(1) ); System.out.println(result.getInt(3) ); System.out.println(result.getDate(4) ); System.out.println(result.get...( "ColumnName")) ; } Das Ergebnis des Selectbefehls wird in Form einer Tabelle zurückgeliefert. Die Daten werden in einem Objekt der Klasse ResultSet gespeichert. Mit Hilfe der Methode next() der Klasse ResultSet kann man sich in der Ergebnistabelle von einem Datensatz zum nächsten vorarbeiten. Das ResultSet hat also immer eine aktuelle Zeile (Cursor), welche mit next gewechselt wird. Der Cursor ist initial vor der ersten Zeile positioniert. Mit den get-Methoden der Klasse ResultSet kann man aus jedem Datensatz die interessierenden Daten ausgeben. Cursor row Santa Claus 100000 24.12.2000 String m = result.getString(1) + " " + Result.getString(2) + " delivers " + Result.getInt(3) + " gifts on " + Result.getDate(4) ; "Santa Claus delivers 100000 gifts on 24.12.2000" 3 JDBC (7) Daten ändern SQL-Änderungen werden in Strings abgelegt. Die Änderungen werden auch über Statement-Objekte an die Datenbank übermittelt. String update = "update tableName" + "set gifts = gifts +1" ; stmt.executeUpdate(update) ; Die SQl-Befehle insert und delete werden ebenfalls mit Hilfe der Methode executeUpdate() der Klasse Statement an die Datenbank übertragen. (8) Die Verbindung wird geschlossen. Die Anzahl von Connections zu Datenbanken sind in der Regel begrenzt, da sie lizenzpflichtig und Hardware-hungrig sind. Daher sollten sie nach der (den) Datenbankoperation(en) wieder freigegeben werden. stmt.close() ; con.close() ; 3 Exceptions Die JDBC-Schnittstelle bietet u.a. folgende Exceptions an: - ClassNotFoundException Der registrierte Treiber wird nicht gefunden. - SQLException Jede Anfrage an eine Datenbank kann zu einem Fehler führen (Datenbank nicht erreichbar, Netzwerk unterbrochen, SQLString fehlerhaft, ...) try { // Verarbeitung mit Datenbank } catch (ClassNotFoundException ex) { ... } catch (SQLException ex) { ... } 4 JDBC 4 Dynamisches SQL SQL-Anweisungen müssen häufig erst zur Laufzeit des Programms generiert werden. Daher werden die SQL-Anweisungen im Programm mit Variablenwerten ergänzt. Da SQL-Anweisungen in Java immer als Strings behandelt werden, konkateniert man beim dynamischen SQL die Strings und Variablenwerte. int id = 8 ; String sql = "SELECT * FROM TABLE " + "WHERE ID = " + id ; stmt.executeQuery(sql) ; int id =8; String name = "Mustermann" ; int alter = 26 ; String sql = "INSERT INTO TABLE VALUES (" + id + ", " + "’ " + name + "’," + alter + ") " ; stmt.executeUpdate(sql) ; 5 JDBC 5 Beispiel /* Person2.java (mit Klassen und DAB) */ import java.util.Date; import java.sql.*; import java.lang.*; public class Person2 { public static void main (String args[]) { String URL="jdbc:odbc:aiw4"; String Benutzername ="bibufh"; String Passwort ="Mouse"; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (Exception e) { System.out.println("Treiber fehlt ..."); return ; } Statement Befehl = null; Connection Verbindung = null; try { Verbindung = DriverManager.getConnection( URL, Benutzername, Passwort); Befehl = Verbindung.createStatement(); } 6 JDBC catch (Exception e) { System.out.println (e.getMessage()); return ; } try { String Beruf; Beruf = "DBA"; ResultSet Ergebnis; Ergebnis = Befehl.executeQuery("select Persnr, Nachname from Person where Beruf = ' " + Beruf + "'"); String String Persnr; Nachname; while (Ergebnis.next()) { Persnr = Ergebnis.getString("Persnr"); Nachname = Ergebnis.getString("Nachname"); System.out.println(" " + Persnr + " " + Nachname ); System.out.println(""); } Befehl.close(); Verbindung.close(); } catch (Exception e) { System.out.println (e.getMessage()); return ; } } } 7