SQL-Ergebnis in Java - wie die Zeilenzahl herausfinden?

  • Servus!


    Ich fange gerade erstmals damit an, SQL in einem Java-Programm zu benutzen (bisher immer PHP+MySQL :rolleyes:...). Ich verwende (natürlich) JDBC und java.sql, habe aber jetzt ein dickes Problem: Wie bekomme ich heraus, wieviele Zeilen ein Abfrageergebnis umfaßt? Mit

    Code
    ResultSet rs = con.createStatement().executeQuery("SELECT * FROM blabla WHERE bla = 123");

    bekomme ich ja ein ResultSet zurück - aber wieviele Zeilen der beinhaltet dieses ResultSet? In PHP ging das immer schön über mysql_num_rows()...


    Ich bitte dringend um Eure Hilfe - ich weiß einfach nicht weiter :(


    Gruß,


    Henning.

    ________________________

  • Re: SQL-Ergebnis in Java - wie die Zeilenzahl herausfinden?


    Hallo XNeo,

    Zitat

    aber wieviele Zeilen der beinhaltet dieses ResultSet? In PHP ging das immer schön über mysql_num_rows()...

    Ich habe mich noch nicht allzuviel mit den in Java angebotenen Funktionen beschäftigt, aber wenn Performance keine oder nur eine untergeordnete Rolle spielt, würde ich vor der eigentlichen Abfrage einfach ein "select count(*) as anzahl from blabla where bla=123" absetzen. Damit kriegst du dann die Anzahl raus. Vorsicht: wenn multiple Verbindungen zur DB möglich sind, kann sich zwischen diesen beiden Abfragen der Datenstand ändern. Dann vorher Tables locken und erst nach beiden Abfragen wieder freigeben.


    Ach ja, ein "select *" sollte man immer vermeiden und alle gewünschten Fields explizit angeben (um eine konstante Reihenfolge zu erzwingen).


    Wie man dieses Problem richtig löst, weiss ich auch nicht :D


    Gruss, Alexander

  • Re: Re: SQL-Ergebnis in Java - wie die Zeilenzahl herausfinden?


    Erstmal Danke für alle Antworten. :)

    Zitat

    Original geschrieben von netzmeister
    Ach ja, ein "select *" sollte man immer vermeiden und alle gewünschten Fields explizit angeben (um eine konstante Reihenfolge zu erzwingen).

    Hm? :confused: Die Reihenfolge habe ich doch beim Erstellen der Tables festgelegt? Ist aber auch egal, war ja nur ein Beispiel.
    Ich habe mittlerweile viel API-Doku gelesen und löse das Problem derzeit so:

    PHP
    rs.last(); // Cursor auf die letzte Zeile
    int zeilenzahl = rs.getRow(); // Nummer der Zeile feststellen
    rs.beforeFirst(); // Cursor zurück auf Anfang

    ...aber von der Eleganz, die man ja eigentlich von Java erwartet :rolleyes:, ist da nicht so viel zu sehen :(
    Wer also noch eine bessere Lösung hat, möge sie doch bitte bitte hier abliefern ;)


    Gruß & Thanx,


    Henning.

    ________________________

  • Also, der Ansatz von netzmeister ist wohl der Klügste und performanteste. Java gibt dir die Möglichkeit, die anzahl Zeilen zu zählen aus nicht deshalb, da es nicht der Java-Phylosophie entspricht, sondern da es nicht der Art von heutigen Datenbanken entspricht. Ich behaupte jetzt einfach einmal, dass die PHP Funktion genau das macht, was netzmeister vorgeschlagen hat, nämlich ein count-Query an die Datenbank schickt. Klar hätten die Java-Programmierer dies automatisieren können, nur wäre damit die ganze Abfrage-Logik durcheinandergewürfelt worden.


    Im Grunde musst Du Dich aber vor allem eines Fragen: muss die Anzahl der Zeilen wirklich im voraus bekannt sein? Reicht es nicht, wenn Du beim auslesen der Daten mit Hilfe von rs.next() und rs.getXXX() einen Zähler mitlaufen lässt? Mit 99% iger wahrscheinlichkeit lässt sich Dein Programm umschreiben, dass es ohne ein Count-Query funktioniert. Dies mag zwar etwas umständlicher sein, dafür muss die Datenbank deine Daten nicht zweimal Filtern (nämlich einmal im Count-Query und das andere mal im eigentlichen Query).


    Zur von jemandem erwähnten getFetchSize(): mit dieser Methode kann man lediglich einstellen, wieviele Zeilen auf einmal von der Datenbank zum Java-Programm übertragen werden.


    Gruss
    jaBernet

  • Servus!


    Die PHP Funktion kommt sicher ohne weitere Datenbankanfrage aus, da MySQL in der C-API eine entsprechende Funktion zur Verfügung stellt (http://www.mysql.de/documentat…ients.html#mysql_num_rows). Vermutlich wird die PHP Funktion mysql_query unter Verwendung der MySQL-Funktion mysql_store_result() verwendet.


    Es geht nicht darum, die Anzahl der Zeilen vor, sondern nach der erfolgten Abfrage herauszubekommen, also wirklich nur um die Zeilenzahl im ResultSet. Offensichtlich scheint es aber keine Funktion dafür zu geben.


    Gruß,


    Henning.

    ________________________

  • Hallo Xeon


    Du schreibst, dass PHP on Datenbankabfragen auskommt, dass ist insofern falsch, da MySQL schlussendlich genau die gleichen Schritte ausführen muss, um die Anzahl der Zeilen zu erhalten, welche ein Query zurückgibt. Was aber sein kann, und wass ich aufgrund von Deinem Link vermuten würde, dass MySQL bei jedem Query dass es ausführt die Anzahl der Zurückggebenen Zeilen ermittelt, d.h. alle Zeilen schonmal von dem Tablespace liesst und zwischenspeichert. Dies ist aber sicherlich ein ziemlicher Overhead, wenn du ja nur die Anzahl der Zeilen brauchst! Deshalb macht es keinen Sinn ein Query vorzubereiten, welches gar nicht gebraucht wird. Und wenn ich dich richtig verstanden habe, brauchst Du ja nur die Anzahl der Zeilen, nicht deren Inhalt. Und dazu ist nun mal ein Count-Query die intelligentere und gebräuchlicher Lösung, da die Datenbank die Art und Weise, wie es auf die Daten zugreifft hinsichtlich dem Verwendugszweck (nämlich nur Zählen) optimieren kann. Wie gesagt, wenn Du willst kann ich Dir dies noch etwas detailierter erklären, jedoch nur anhande von DB2 und MSQL-Server.


    Wie gesagt, Java unterstützt diese Funktion nicht da sie MySQL-Spezifisch ist und nicht über SQL funktioniert. Wenn Du aber unbedingt etwas brauchst, wass die SQL-Funktionen auf Java-Methoden wrappt, so gibt es dafür meines Wissen EJB.


    Deine Lösung mit rs.last() ist übrigens so etwa die schlechteste, die Du machen kannst ;-) Wie schon gesagt, machs wie netmeister es vorschlug:


    Code
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuey("SELECT Count(*) FROM blablabla WHERE blabla");
    rs.next();
    int Count = rs.getInt(1);
    rs.close();
    stmt.close();


    Gruss
    jaBernet

  • Ich brauch' leider auch den Inhalt: Die SELECT Anfrage muß ich auf jeden Fall machen, mich interessiert aber (und zwar bevor ich anfange, das ganze ResultSet zu durchlaufen), ob's mehr als eine Zeile ist. Als Datenbank verwende ich FireBird (= OpenSource Version von Interbase), dessen JDBC-Treiber ist aber noch nicht kompatibel zu JDBC 2, so daß ich auch keine scrollbaren ResultSets erzeugen kann. Mit MySQL (das war ja nur mein Beispiel wg. PHP) wär's eh' kein Problem: Da gibt's ja die "LIMIT" Klausel... :rolleyes:


    Gruß,


    Henning.

    ________________________

  • Hallo xNeo,
    wie wäre es, wenn du das ResultSet in einer Schleife ausliest
    --> while (rs.next())
    und jeweils eine Zeile in einen Vector o.ä speicherst.
    Mit vector.size() kannst du dann die Größe des Vectors abfragen.


    Gruß, Kathrin

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!