JDBC (Java Database Connectivity) ist ein Java-API (Application Programming Interface) zur Ausführung von SQL-Anweisungen innerhalb von Java-Applikationen und Java-Applets. Es besteht aus einer Menge von Klassen und Schnittstellen, die in der Programmiersprache Java geschrieben sind. Java-Dokumentation zu java.sql Ein JDBC-Programm läuft in drei Phasen ab:
Der folgende Quelltext zeigt ein einfaches Beispiel für diese Schritte unter Verwendung der nativen Microsoft-Treiber:
String url = "jdbc:microsoft:sqlserver://maestro:1433"; String user = "erika"; String password = "mustermann"; Class.forName ("com.microsoft.jdbc.sqlserver.SQLServerDriver"); Connection con = DriverManager.getConnection(url,user,password); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select * from Professoren"); while (rs.next()){ int x = rs.getInt("persnr"); String s = rs.getString("name"); System.out.println("Professor " + s + " hat die Personalnummer " + x); }
Abbildung 9.11 zeigt die von Listing 9.3a erzeugte Ausgabe einer Java-Applikation auf der Konsole.
Listing 9.3a: Quelltext der Java-Applikation ShowJdbc.java
Ist auf dem Clienten eine ODBC-Datenquelle eingerichtet, so kann auch unter Verwendung des von Sun mitgelieferten Brückentreibers der Kontakt zur Datenbank hergestellt werden:
String url = "jdbc:odbc:dbs"; // URL der Datenquelle Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Treiber
Soll ein Update oder Delete durchgeführt werden, so wird statt der Methode executeQuery die Methode executeUpdate bemüht. Sie liefert die Zahl der geänderten Tupel zurück:
Statement stmt = con.createStatement(); // Statement String query = "update professoren " + // Update-String "set rang='C3' where rang='C2'"; // vorbereiten int x = stmt.executeUpdate(query); // Update durchfuehren System.out.println("Es wurden " + x + " befoerdert.");
Bei mehrfacher Benutzung desselben SQL-Befehls macht es Sinn, diesen vorzuübersetzen als sogenanntes PreparedStatement. Hierbei kann durch das Fragezeichen ('?') ein Platzhalter definiert werden, der zur Laufzeit mittels setInt(i, ...) bzw. mittels setString(i, ...) an die i-te Position das noch fehlende Argument übergeben bekommt:
String query = "select * from Studenten" + // User-Query " where semester < ? "; // mit Platzhalter PreparedStatement pstmt; // PreparedStatemnt pstmt = con.prepareStatement(query); // initialisieren int vorgabe = IO.readInt("Bitte Semesterobergrenze: "); // Benutzereingabe pstmt.setInt(1,vorgabe); // einpflanzen ResultSet rs = pstmt.executeQuery(); // ResultSet while(rs.next()) { // Ergebnismenge durchlaufen System.out.print(rs.getString("Name")); // dabei Name System.out.print(" studiert im "); // und Semester System.out.print(rs.getInt("Semester")); // ausgeben System.out.println(". Semester."); }
Die bisherigen JDBC-Beipiele konnten zur Übersetzungszeit nicht nicht gegen die Datenbank validiert werden, da erst zur Laufzeit der SQL-Query-String an den SQL-Interpreter übergeben wurde. SQLJ löst dieses Problem durch den Einsatz eines Translators, welcher zunächst das mit #SQL-Kommandos erweiterte Javaprogramm in reguläres Java überführt, welches anschließend mit dem Java-Compiler übersetzt wird. Der Translator kann dabei bereits mit Hilfe der Treiberklassen Kontakt zur Datenbank aufnehmen und die SQL-Befehle auf Korrektheit überprüfen. Abbildung 9.12 zeigt den schematischen Ablauf und Listing 9.3b zeigt die Java-Klasse IO.java, die in den Beispielen 9.3c und 9.3d zur Eingabe benutzt wird.
Listing 9.3b: Quelltext der Java-Klasse IO.java
Listing 9.3c zeigt demonstriert den Umgang mit Hostvariablen in einem SQLJ-Programm. Ein lokal deklarierte Varibale int vorgabe kann innerhalb der SQL-Statements mit :vorgabe angesprochen werden.
Listing 9.cd: Quelltext der Java-Applikation ShowSqljHost.sqlj
vom Translator aus ShowSqljHost.sqlj erzeugtes Javaprogramm ShowSqljHost.java
Listing 9.3d zeigt den Umgang mit einem Iterator in einem SQLJ-Programm. Der im #SQL-Kommando eingeführte Iterator-Typ MyIter definiert den Iterator iter, mit dem sequentiell die Trefferliste durchlaufen werden kann. Dabei stehen die im Iterator-Typ angemeldeten Spalten Name und Semester als Accessor-Methoden zur Verfügung.
Listing 9.3d: Quelltext der Java-Applikation ShowSqljIter.sqlj
Listing 9.4 zeigt den Quelltext einer HTML-Seite mit dem Aufruf eines Java-Applets. Listing 9.5 zeigt den Quelltext der im Applet verwendeten Javaklassen. Aus Sicherheitsgründen darf ein Applet nur eine Socket-Verbindung aufbauen zu einem Rechner, von dem es gezogen wurde. Daher müssen Web-Server und Datenbankserver auf demselben Rechner liegen oder dieser Sachverhalt muss durch ein Port-Forwarding simuliert werden. Z.B. leitet im Informatik-Netz der Uni Osnabrück der Rechner arnold eine Anfrage an Port 80 an den Web-Server sol weiter und eine Anfrage an Port 1433 an den Datenbankserver maestro, so dass Applet und Datenbank auf demselben Rechner zu liegen scheinen.
Listing 9.4: Quelltext einer HTML-Seite zum Aufruf eines Applets
Aufruf einer HTML-Seite mit Java-Applet
Listing 9.5: Quelltext der Java-Klassen vom Java-Applet