Show TOC Anfang des Inhaltsbereichs

Hintergrunddokumentation Selektion von Daten aus einer Datenbank  Dokument im Navigationsbaum lokalisieren

In diesem Kapitel wird erklärt, wie Daten aus einer Datenbank gelesen werden können. Open JDBC gibt die Daten einer Datenbankanfrage in Form eines ResultSet-Objekts zurück, das z.B. aus einem Statement-Objekt erzeugt werden kann.

 

import java.sql.ResultSet;

 

ResultSet rs = stmt.executeQuery

   ("select NAME, PRICE, CURRENCY from VEHICLE");

 

Das Objekt rs enthält nun alle Sätze, die zur Treffermenge der Anfrage gehören. Mit Hilfe der next()-Methode kann nun durch die Treffermenge navigiert werden. Jeder Aufruf der next()-Methode positioniert einen sog. Cursor zum nächsten Datensatz. Initial steht der Cursor vor dem ersten Satz, so dass der erste Aufruf der next()-Methode den ersten Satz liefert. Der Rückgabewert FALSE der next()-Methode zeigt an, dass der Cursor bereits auf der letzten Position steht. Es ist notwendig, ein nicht mehr benötigtes ResultSet-Objekt mithilfe seiner close()-Methode zu schließen.

Mittels der getXXX-Methoden von ResultSet können nun die einzelnen Spaltenwerte ausgelesen werden (XXX in getXXX steht hier für einen der Typen int, float, double, String, u.v.m. siehe Typenkompatibiltätsmatrix). Welche getXXX-Methoden für welche Datentypen geeignet sind, ist wieder der Typkompatibiltätsmatrix zu entnehmen.

Es folgt ein klassisches Code-Beispiel zum Auslesen von Daten (hier und in den folgenden Beispielen sei conn ein bereits vorhandenes java.sql.Connection Objekt).

 

String query = "select NAME, PRICE, CURRENCY from VEHICLE";

Statement stmt = conn.createStatement();

try {

    ResultSet rs = stmt.excuteQuery(query);

    try {

        System.out.println("Fahrzeugliste (Name, Preis,"

            + "Währung)");

        while ( rs.next() ) {

    System.out.println(rs.getString("NAME") + " " +

                       rs.getInt("PRICE") + " " +

                       rs.getString("CURRENCY"));

        }

    } finally {

        rs.close();

} finally {

    stmt.close();

}

 

Es gibt zwei Formen der getXXX Methode:

getXXX(String name): Das ist die im oben stehenden Beispiel verwendete Form. Das Argument der Methode bezeichnet den Namen einer Spalte des Ergebnisses (in der Regel ist das auch der Name einer Spalte einer Datenbanktabelle). Gross-Kleinschreibung wird dabei ignoriert. Open JDBC erlaubt diese Form immer.

getXXX(int index): Das Argument index gibt die Position der Spalte innerhalb der SELECT-Liste an. Open JDBC erlaubt diese Form der Positionsangabe nur, wenn die Reihenfolge der Ergebnis-Spalten durch das Statement festgelegt ist (das ist der Fall bei jeder Query die nicht ein "SELECT *" ist) oder vom Programm durch Verwendung der Methode findColumn(String name) bestimmt wurde.

Das folgende Beispiel führt unter Open SQL zu einem Laufzeitfehler:

ResultSet result = statement.executeQuery("SELECT * FROM VEHICLE");

try {

    while (result.next()) {

        String name = result.getString(1); // Error, dont do this!

                                           // Fehlerhaft!

    }

} finally {

    result.close();

}

 

Folgender Zugriff ist erlaubt, weil der Index der Spalte mit findColumn bestimmt wurde:

ResultSet result = statement.executeQuery("SELECT * FROM VEHICLE");

try {

    int indexOfName = result.findColumn("name");

    while (result.next()) {

        String name = result.getString(indexOfName); // ok.

     }

} finally {

    result.close();

}

 

Folgender Zugriff ist erlaubt weil die Position der Spalte "name" fix ist:

ResultSet result = statement.executeQuery("SELECT name FROM VEHICLE");

try {

    while (result.next()) {

        String name = result.getString(1); // ok.

     }

} finally {

    result.close();

}

 

Der JDBC-Standard 2.0 und höher sieht neben der next()-Methode weitere ResultSet-Methoden vor, die eine Rückwärts- oder absolute Positionierung innerhalb einer Treffermenge untersützen. Aus Portabilitätsgründen können diese Methoden nicht unterstützt werden, ebensowenig  die Methoden zum Ändern von ResultSet-Objekten.

Auch bei der Datenselektion kann man PreparedStatement-Objekte einsetzen, was sich insbesondere für Anfragen lohnt, die sich nur in den Restriktionswerten unterscheiden.

 

String query = "select NAME, PRICE, CURRENCY from VEHICLE "

                + "where NAME = ?";

PreparedStatement ps = con.prepareStatement(query);

try {

    ps.setString(1, "BMW 323");

    ResultSet rs = ps.excuteQuery(query);

    try {

System.out.println("Fahrzeugliste (Name, Preis, Währung)");

        while ( rs.next() ) {

    System.out.println(rs.getString("NAME") + " " +

                       rs.getInt("PRICE") + " " +

                       rs.getString("CURRENCY"));

        }

    } finally {

        rs.close();

} finally {

    ps.close();

}

 

 

Ende des Inhaltsbereichs