Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


18.6.3

Anzahl der Zeilen in der Ergebnismenge


Viele Anwendungen, wie z. B. Suchmaschinen, führen Recherchen in Datenbanken durch, die unter Umständen sehr viele Ergebniszeilen zurückliefern. Meist werden bei solchen Anwendungen nicht sofort alle Treffer angezeigt, sondern es wird lediglich ein Ausschnitt aus der Ergebnismenge sowie die Gesamttrefferzahl dargestellt.

JDBC stellt keine vordefinierte Methode für die Ermittlung der Anzahl der Zeilen in einer Ergebnismenge bereit. Die Anzahl an Ergebniszeilen wird nicht im Cursor gespeichert, da die Zeilen nach Bedarf aus der Datenbank abgerufen werden. Dadurch steht sie erst endgültig fest, wenn der Cursor alle Zeilen aus der Datenbank zurückgeliefert hat.

Die Ermittlung der Gesamttrefferzahl einer Abfrage kann man auf drei Arten durchführen, abhängig von der verfügbaren JDBC-Version. Die einfachste, mit allen JDBC-Varianten kompatible Möglichkeit besteht darin, zunächst eine Abfrage auszuführen, in der nur die Anzahl der Treffer ermittelt wird. Anschließend werden in einer zweiten Anfrage die Daten selektiert:
  ...
  Statement stmt = con.creatStatement();
  // 1. Abfrage: Anzahl Zeilen ermitteln
  ResultSet rs = stmt.executeQuery(
                   "SELECT count(*) FROM titel");
  rs.next();
  long zeilen = rs.getLong(1);
  rs.close();
  // 2. Abfrage: Daten-Ausschnitt ausgeben
  rs = stmt.executeQuery("SELECT * FROM titel t ORDER BY t.titel");
  // Zugriff auf die Daten
  ...
Bei der zweiten Alternative werden die Positionierungs-Funktionen von JDBC-2.0 verwendet. Hierbei muss man den Cursor zunächst mit der Methode last() auf den letzten Datensatz positionieren und anschließend über die Methode getRow() die Nummer der Zeile in der Ergebnismenge ermitteln. Über die Methode first() kann das ResultSet anschließend wieder auf den ersten Satz positioniert werden:
  // Initialisierung des Statement-Objekts
  Statement stmt;
  stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
                             ResultSet.CONCUR_READ_ONLY);
  ResultSet rs = stmt.executeQuery("SELECT * FROM titel t ORDER BY t.titel");
  // Positionierung auf den letzten Satz und Abfrage der Zeilen
  rs.last();
  long zeilen = rs.getRow());
  // Erneute Positionierung auf den ersten Satz
  rs.first();
  // Zugriff auf die Daten
  ...
Als Typ der Ergebnismenge wurde TYPE_SCROLL_INSENSITIVE gewählt, da eine Positionierung für die Ermittlung der Zeilenanzahl möglich sein muss.

Als dritte Alternative kann man die Datensätze im Anwendungscode in einer while-Schleife selbst durchzählen. Das ist die effizienteste Methode, wenn man neben dem Zählen alle Daten in der Ergebnismenge auch sofort verarbeiten will:
  ResultSet rs;
  ...
  int count = 0;
  while(rs.next()) {
    count++; // Zeilen-Zähler erhöhen
    // Hier Daten verarbeiten
  }
  ...

Da eine positionierbare Ergebnismenge mehr Ressourcen als ein Standard-Cursor verbraucht, ist bei großen Datenmengen die erste Methode meist schneller, obwohl zwei SQL-Abfragen benötigt werden.


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.