JDBC - Datenbankschnittstelle

Inhalt

1. Einleitung
    1.1 Motivation des Einsatzes von Java im Clientbereich
    1.2 Einsatzgebiete von JDBC

2. Datenbanken
    2.1 Warum Datenbanken?
    2.2 Einige SQL-Befehle
    2.3 Weiterführende Themen

3. Java
    3.1 Funktionsweise
    3.2 Charakterisierung
    3.3 Hello World Applet

4. JDBC (Java Database Connectivity)
    4.1 Interfaces - die Schnittstelle zur Datenbank
    4.2 Die JDBC-Klassen und -Interfaces für den Verbindungsaufbau
        4.2.1 java.sql.DriverManager
        4.2.2 java.sql.Connection
        4.2.3 java.sql.Statement
        4.2.4 java.sql.PreparedStatement
        4.2.5 java.sql.CallableStatement
        4.2.6 java.sql.ResultSet
    4.3 Die JDBC-Exceptions
        4.3.1 java.sql.SQLException (extends java.lang.Exception)
        4.3.2 java.sql.SQLWarning (extends java.sql.SQLException)
        4.3.3 java.sql.DataTruncation (extends java.sql.SQLWarning)
    4.4 Zusammenfassung der JDBC-Klassen
    4.5 JDBC - Treiber

5. Java Source Files
    5.1 SimpleStatement
    5.2 SimplePreparedStatement
    5.3 Links zu den verwendeten Materialien
    5.4 Download des Quellcodes der Beispiele
 
 

1. Einleitung

1.1 Motivation des Einsatzes von Java im Clientbereich

1.2 Einsatzgebiete von JDBC

Einsatz im Internet ? => bis jetzt nur im Intranet interessant, für Warenkörbe etc. noch nicht interessant.
 

2. Datenbanken

2.1 Warum Datenbanken?

2.2 Einige SQL-Befehle

Die 4 wichtigsten SQL Befehle: Ein Beispiel:

Gegeben sei die Tabelle "Arbeitnehmer"
 
Schluessel Name Vorname Vorgesetzer Gehaltsschlüssel
1 Boss Big NULL sehr hoch
2 Boss Small 1 hoch
3 Mueller Fritz 1 mittelmaeßig
4 Walter Franz 2 niedrig
5 Schmidt Otto 2 niedrig
 
 und die Tabelle "Einkommen"
 
Gehaltsschluessel Gehalt Leistungsbonus
sehr_hoch 20.000 TRUE
hoch 12.000 TRUE
mittelmaeßig 8.000 FALSE
niedrig 6.000 FALSE
Dann liefert "SELECT vorname, name FROM arbeitnehmer WHERE gehaltsschluessel='niedrig';" die folgende Tabelle :
 
Vorname Name
Franz Walter
Otto Schmidt
Ein sog. Join ist ein SELECT, bei dem mehrere Tabellen anhand eines Attributs verknüpft werden:

"SELECT Arbeitnehmer.Vorname, Einkommen.Gehalt FROM Arbeitnehmer, Einkommen WHERE Leistungsbonus = TRUE AND Arbeitnehmer.Gehaltsschlüssel = Einkommen.Gehaltsschlüssel;"
 
Vorname Gehalt
Big 20.000
Small 12.000
 

2.3 Weiterführende Themen

3. Java

3.1 Funktionsweise

  1. javac HelloWorld.java
  2. java HelloWorld

3.2 Charakterisierung

3.3 Hello World Applet

Sorry, your Browser isn't Java enabled, but you don't miss much. 

public class HelloWorld extends java.applet.Applet {
    private final static String textToBeDisplayed = "Hello World Applet";

    public void paint(java.awt.Graphics g) {
        g.drawString(textToBeDisplayed, 0, 20);
    }
};
 

4. JDBC (Java Database Connectivity)

JDBC ist eine Ansammlung von unterstützenden Klassen (z.B. eine Datumsklasse), spezifischen Ausnahmen und (hauptsächlich) Interfaces für den Zugriff auf eine SQL Datenbank. Dadurch erreicht man sogar einen gewissen Grad an Unabhängigkeit von einer bestimmten Datenbank.

Um einen JDBC Treiber nutzen zu können muß man folgendes tun:

4.1 Interfaces - die Schnittstelle zur Datenbank

Ein Interface definiert eine Schnittstelle, d.h. eine Gruppe von Methodensignaturen:

public interface IHelloWorld {
    public void printHello();
};

Die Implementierung eines Interfaces definiert das Verhalten:

class HelloImpl implements IHelloWorld {
    public void printHello() {
        System.out.println("Hello World");
    }
};

Man braucht also nur Referenzen auf das Interface, die Implementation kann sich ändern und bleibt verborgen:

class HelloUser {
    public HelloUser(IHelloWorld h) {
        h.printHello();
    }
    public static void main(String[] args) {
        new HelloUser(new HelloImpl());
    }
};

4.2 Die JDBC-Klassen und -Interfaces für den Verbindungsaufbau

Beispiel Code

4.2.1 java.sql.DriverManager

Die wichtigsten Methoden:

4.2.2 java.sql.Connection

java.sql.Connection stellt eine DB Session dar, d.h. es ist mit einer SQL Terminal Session vergleichbar.
Hier werden auch die SQL Statement Objekte erzeugt.

Die wichtigsten Methoden:

4.2.3 java.sql.Statement

Beispiel Code
java.sql.Statement verwaltet den DB-Cursor für eine SQL Anfrage.
Die wichtigsten Methoden:

4.2.4 java.sql.PreparedStatement (extends java.sql.Statement)

Beispiel Code
java.sql.PreparedStatement ist ein vorkompiliertes Statement, das Parameter haben kann, d.h. bestimmte Platzhalter werden durch die spezifizierten Daten ersetzt. Es bietet vor allem einen Geschwindigkeitsvorteil falls das Statement mehrfach ausgeführt wird.

Die wichtigsten Methoden:

4.2.5 java.sql.CallableStatement (extends java.sql.PreparedStatement)

java.sql.CallableStatement stellt einen Aufruf einer stored procedure dar.
z.B. CallableStatement cst = con.prepareCall("myPackage.myProcedure(?, ?)");

Die wichtigsten Methoden:

4.2.6 java.sql.ResultSet

java.sql.ResultSet ist schließlich die Ergebnismenge einer DB Abfrage.
Die Ergebnismenge wird Zeile für Zeile gelesen.

Die wichtigsten Methoden:

4.3 Die JDBC-Exceptions

Jede Methode der JDBC-Klassen, bis auf den 5 Hilfsklassen (Date, DriverPropertyInfo, Time, Timestamp, Types) kann eine SQLException auswerfen. Deswegen ist die Fehlerbehandlung ein wichtiger Teil jeder Applikation.

4.3.1 java.sql.SQLException (extends java.lang.Exception)

Die wichtigsten Methoden:

4.3.2 java.sql.SQLWarning (extends java.sql.SQLException)

java.sql.SQLWarning werden nicht ausgeworfen, sondern einfach an die auslösende SQLException angehängt.

Die wichtigsten Methoden:

4.3.3 java.sql.DataTruncation (extends java.sql.SQLWarning)

Eine java.sql.DataTruncation wird nur beim Schreiben eines Parameters ausgeworfen, sonst wird sie weiter verkettet.

Die wichtigsten Methoden:

4.4 Zusammenfassung der JDBC-Klassen

 
Klassen-/ 
Interfacename
erzeugt wichtige 
Methoden
Bemerkung
Treiber
Driver   jdbcCompliant stellt die Verbindung zu einer bestimmten DB her
DriverManager Connection getConnection 
setLoginTimeout 
getDrivers
stellt die Verbindung mit Hilfe der geladenen Driver Klassen her
Verbindung
Connection Statement 
PreparedStatement 
CallableStatement
createStatement 
prepareStatement 
prepareCall 
rollback / commit 
getMetaData 
close
stellt eine DB Session dar
DB-Abfrage
Statement ResultSet executeQuery 
executeUpdate 
getWarnings 
close
verwaltet einen DB Cursor
PreparedStatement ResultSet setXXX 
setNull
wie Statement, aber vorkompiliert & IN Parameter
CallableStatement ResultSet registerOutParameter 
getXXX 
wasNull
Wie PreparedStatement mit OUT Parameter
ResultSet ResultSetMetaData getXXX (getInt etc.) 
next 
wasNull (check it...) 
getMetaData 
steuert einen DB Cursor (der im erzeugenden Statement gespeichert ist)
Metadaten
DatabaseMetaData   (nur interessant für Programme, die für beliebige Daten und Datenbanken funktionieren müssen) Informationen über: 
stored procedures (Funktionssignaturen), 
tables, schemas
ResultSetMetaData   getColumnCount 
getColumnName 
getColumnType
Informationen über die Spalten der Ergebnismenge
Fehler
SQLException   getMessage 
getSQLState 
getNextException
extends java.lang.Exception
SQLWarning   getNextWarning extends SQLException
DataTruncation   getIndex 
getParameter
extends SQLWarning
Hilfsklassen
Types   (nur Konstanten) Konstanten der SQL Typen für andere Methoden
java.sql.Date   siehe API extends java.util.Date 
(SQL Datum)
Time   siehe API extends java.util.Date 
(SQL Time)
Timestamp   siehe API extends java.util.Date 
(enthält Nanosekunden)
DriverPropertyInfo   siehe API welche name/value Paare braucht der DB Treiber noch ?
 

4.5 JDBC - Treiber

Man unterscheidet 4 Arten von Treibern, jeweils nach ihrer Implementierungsstrategie:
  1. JDBC-ODBC Bridge plus ODBC driver
  2. Native-API partly-Java driver
  3. JDBC-Net pure Java driver
  4. Pure Java Treiber
Verfügbare Treiber:

Durch die Verfügbarkeit von ODBC-JDBC Bridge Treibern ist eine Verbindung wahrscheinlich zu jeder Datenbank möglich. Bisher sind Treiber (siehe java.sun.com/products/jdbc) vieler namhafter Datenbankhersteller verfügbar.

5. Java Source Files

5.1 SimpleStatement

// make all classes in the package java.sql available without full reference
import java.sql.*;

class SimpleStatement {
    // some constants
    public static final String driver = "oracle.jdbc.driver.OracleDriver";
    // "jdbc:oracle:thin:@<host>:<port>:<sid>" is the URL syntax for Oracle
    public static final String url = "jdbc:oracle:thin:@134.155.129.2:1527:A01";

    // this function prints a ResultSet to screen
    public static void printResultSet(ResultSet result) throws SQLException {
        int i=0;
        // iterate through the ResultSet
        while(result.next()) {
            ++i;
            System.out.println(i+ ".te Zeile:");
            System.out.println("Vorname:\t" +result.getString("vorname"));
            System.out.println("Name:\t\t" +result.getString("name"));
        }
    }

    // the program. There are Objects...
    // (sorry, but those steps are more clear if shown sequentially)
    public static void main(String[] args) throws java.lang.Exception {
        if (args.length < 2) {
            System.out.println("Use: java PrgName [loginName] [Password]");
            return;
        }
        try {
            // load the DB Driver Implementation for this DB
            // "oracle.jdbc.driver.OracleDriver" is the class that implements
            // java.sql.Driver for this special DB
            Class.forName(driver);
            // create a Connection
            Connection connection = DriverManager.getConnection(url, args[0], args[1]);
            // create a Statement
            Statement statement = connection.createStatement();
            // execute the Statement
            ResultSet result =
                statement.executeQuery("SELECT vorname, name FROM arbeitnehmer");
            // print the Result
            printResultSet(result);
        } catch(ClassNotFoundException classException) {
            System.out.println("Class \"" +driver+ "\" not found");
            System.out.println("Make sure the ZIP-File with your ODBC Driver is in your Classpath.");
        } catch(SQLException sqlException) {
            System.out.println("SQLException occured, printing chained Exceptions:");
            // print all chained SQLExceptions before exit
            do {
                System.out.println(sqlException.getMessage());
            } while( (sqlException = sqlException.getNextException()) != null);
        }
    }
};

Es sind also 4 Befehle nötig um ein DB Select auszuführen:

  1. Class.forName(driver);
  2. Connection connection = DriverManager.getConnection(url, user, password);
  3. Statement statement = connection.createStatement();
  4. ResultSet result = statement.executeQuery("SELECT vorname, name FROM arbeitnehmer");
 
 

5.2 SimplePreparedStatement

Den Verbindungsaufbau kann man von SimpleStatement übernehmen.

import java.sql.*;

class SimplePreparedStatement {
    public static void main(String[] args) throws java.lang.Exception {
        if (args.length < 2) {
            System.out.println("Use: java PrgName [loginName] [Password]");
            return;
        }
        try {
            // Look into SimpleStatement for explanation
            Class.forName(SimpleStatement.driver);
            Connection connection =
                DriverManager.getConnection(SimpleStatement.url, args[0], args[1]);
            // create a PreparedStatement
            PreparedStatement prepStatement = connection.prepareStatement(
                "SELECT vorname, name FROM arbeitnehmer WHERE name = ?");
            // "replace" ? with 'Boss'
            prepStatement.setString(1, "Boss");
            // execute the Statement
            ResultSet result = prepStatement.executeQuery();
            // print the Result
            SimpleStatement.printResultSet(result);
        } catch(ClassNotFoundException classException) {
            System.out.println("Class \"" +SimpleStatement.driver+ "\" not found");
            System.out.println("Make sure the ZIP-File with your ODBC Driver is in your Classpath.");
        } catch(SQLException sqlException) {
            System.out.println("SQLException occured, printing chained Exceptions:");
            // print all chained SQLExceptions before exiting
            do {
                System.out.println(sqlException.getMessage());
            } while( (sqlException = sqlException.getNextException()) != null);
        }
    }
};
 

5.3 Links zu den verwendeten Materialien

 

5.4 Download des Quellcodes der Beispiele

Den Quellcode zu den Beispielen, sowie ein Java Programm, das ein Select Statement als graphische Tabelle visualisiert sind unter den angegebenen Links verfügbar:

TGZ File (z.B. mit WinZip zu entpacken)
WinRar File
 



Kommentare oder Fragen an: maydt@rumms.uni-mannheim.de

Letzte Änderung: 12.2.98