prev up next

JDBC

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:

  1. Treiber laden und Verbindung zur Datenbank aufbauen,
  2. SQL-Anweisungen absenden,
  3. Ergebnisse verarbeiten.

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.


Abbildung 9.11: Ausgabe einer Java-Applikation

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.


Abbildung 9.12: Zusammenspiel von SQLJ-Translator und Java-Compiler

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


prev up next