Java und MySQL MariaDB - WHERE-Klausel

Juelin

Bekanntes Mitglied
Hallo,
ich schreibe gerade eine Anwenung in javaFX mit einer MySQL MariaDB Datenbank.
Der Query zum aus lesen der Datenbank funktioniert einwandfrei.
Aber wenn ich mit WHERE-Klausel auslesen will tritt die Exception " catch(SQLException err)" in kraft. (siehe bild1).

Das ist die Routine die ich aufrufe:
Java:
    public void dbTabellenEintraegeArray(int fanz, String feld1, String feld2, String feld3, String feld4, String feld5)
        {
        int a = 0;
        int f = 0;
        String x;
        dbRet = 6;
        String[] dbgelesen = new String[999999];
        VitalShowController.anzeintraege = 0;
        if (dbOpen == 1)
            {
            boolean l = true;
            boolean g;
            dbRet = 0;
            String nachname;
            String vorname;
            String geburtsdatum;
            String datum;
            String uhrzeit;
            String systole;
            String diastole;
            String puls;
            String temperatur;
            String groesse;
            String gewicht;
            String bemerkung;
            String spo2;
            String mnachname = "";
            String mvorname = "";
            String mgeburtsdatum = "";
            try
                {
                Statement befehl = verbindung.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
                ResultSet rs = befehl.executeQuery(dbBefehl);
                while (l)
                    {
                    rs.next();
                    g = rs.isAfterLast();
                    if (g)
                        {
                        l = false;   
                        }
                    else
                        {
                        if (VitalShowController.dbLesArt == 1)
                            {
                            nachname =rs.getString("Nachname");
                            vorname =rs.getString("Vorname");
                            geburtsdatum =rs.getString("Geburtsdatum");
                            if (!(nachname.equals(mnachname)) || !(vorname.equals(mvorname)) || !(geburtsdatum.equals(mgeburtsdatum)))
                                {
                                x = vorname+" "+nachname+" "+geburtsdatum;
                                dbgelesen[VitalShowController.anzeintraege] = x;
                                VitalShowController.anzeintraege++;
                                mnachname = nachname;
                                mvorname = vorname;
                                mgeburtsdatum = geburtsdatum;
                                }
                            }
                        if (VitalShowController.dbLesArt == 2)
                            {
                            nachname =rs.getString("Nachname");
                            vorname =rs.getString("Vorname");
                            geburtsdatum =rs.getString("Geburtsdatum");
                            datum =rs.getString("Datum");
                            uhrzeit =rs.getString("Uhrzeit");
                            systole =rs.getString("Systole");
                            diastole =rs.getString("Diastole");
                            puls =rs.getString("puls");
                            temperatur =rs.getString("temperatur");
                            groesse =rs.getString("groesse");
                            gewicht =rs.getString("gewicht");
                            bemerkung =rs.getString("bemerkung");
                            spo2 =rs.getString("SpO2");
                            if (fanz > 0)
                                {
                                f = 0;   
                                if (nachname.equals(feld2))
                                    {
                                    if (fanz == 1)
                                        {
                                        f = 1;   
                                        }
                                    }
                                if (fanz > 1)
                                    {
                                    if (vorname.equals(feld1))
                                        {
                                        if (fanz == 2)
                                            {
                                            f = 1;   
                                            }
                                        }
                                    }
                                if (fanz > 2)
                                    {
                                    if (geburtsdatum.equals(feld3))
                                        {
                                        if (fanz == 3)
                                            {
                                            f = 1;   
                                            }
                                        }
                                    }
                                if (fanz > 3)
                                    {
                                    if (datum.equals(feld4))
                                        {
                                        if (fanz == 4)
                                            {
                                            f = 1;   
                                            }
                                        }
                                    }
                                if (fanz > 4)
                                    {
                                    if (uhrzeit.equals(feld5))
                                        {
                                        f = 1;   
                                        }
                                    }
                                if (f == 1)
                                    {
                                    x = vorname+"/"+nachname+"/"+geburtsdatum+"/"+datum+"/"+uhrzeit+"/"+systole+"/"+diastole+"/"+puls+"/"+temperatur+"/"+groesse+"/"+gewicht+"/"+bemerkung+"/"+spo2+"/";
                                    dbgelesen[VitalShowController.anzeintraege] = x;
                                    VitalShowController.anzeintraege++;
                                    }
                                }
                            else
                                {
                            x = vorname+"/"+nachname+"/"+geburtsdatum+"/"+datum+"/"+uhrzeit+"/"+systole+"/"+diastole+"/"+puls+"/"+temperatur+"/"+groesse+"/"+gewicht+"/"+bemerkung+"/"+spo2+"/";
                            dbgelesen[VitalShowController.anzeintraege] = x;
                            VitalShowController.anzeintraege++;
                                }
                            }
                        a++;   
                        }
                    }
                rs.close();
                }
            catch(SQLException err)
                {
                dbRet = 5;   
                }
            }
        else
            {
            dbRet = 6;   
            }
        if (VitalShowController.anzeintraege > 0)
            {
            VitalShowController.eintraege = new String[VitalShowController.anzeintraege];
            for (a=0; a<VitalShowController.anzeintraege; a++)
                {
                x = dbgelesen[a];
                VitalShowController.eintraege[a] = x;
                }
            }
        }

Habe im Internet geschaut und mein SQL-Befehl
Code:
Vital.datenbank.dbBefehl = "SELECT * FROM "+Vital.datenbank.dbTabelle+" WHERE Vorname = '"+dvorname+"' ORDER BY Nachname, Vorname, Geburtsdatum, Datum DESC, Uhrzeit DESC";
müsste ok sein.

Keine Ahnung was da falsch ist.
Kann da jemand helfen?

Danke und Gruß
Jürgen
 

Anhänge

  • bild1.jpg
    bild1.jpg
    891,1 KB · Aufrufe: 0

LimDul

Top Contributor
Ein paar Anmerkungen.
So einen SQL Befehl zusammenzubauen, macht man nicht - man nutzt Prepared Statements. Weil sobald im Namen Sonderzeichen vorkommen geht das komplett auf Bretter bis hin zur kompletten SQL-Injection.

Java:
            catch(SQLException err)
                {
                dbRet = 5;   
                }
Auch ganz ganz schlecht. Du verschluckst die Exception. Mindestens ein err.printStacktrace gehört rein.
Auf den ersten Blick sieht der SQL Befehl ok aus - das heißt vermutlich passen Spalten oder Tabellennamen nicht. Lass dir den Stacktrace mit der Nachricht ausgeben, da sollten mehr Infos drinstehen
 

M.L.

Top Contributor
MariaDB hat auch einen HeidiSQL-Manager, der beim korrekten Formulieren und Testen von Abfragen helfen könnte.
 

KonradN

Super-Moderator
Mitarbeiter
Bitte gewöhne Dir direkt an, Exceptions nicht einfach zu ignorieren! Lass Dir zumindest die Details der Exception ausgeben, also die Message als auch den Stacktrace!

Und die Schleife kann einfach ein while (rs.next()) sein - dann musst Du da keine Variable nutzen und nichts prüfen a.la. rs.isAfterLast().

Und wenn man dann Details weiss, dann kann man auch eher sagen, was schief gelaufen ist. Nur ohne exakte Fehlermeldung ist es schwer, etwas zu sagen. Evtl. stimmt der Tabellenname nicht oder es gibt eines der Felder nicht?
 

Manul

Mitglied
Aber wenn ich mit WHERE-Klausel auslesen will tritt die Exception " catch(SQLException err)" in kraft. (siehe bild1).
...
Keine Ahnung was da falsch ist.
Um genau das zu vermeiden sollte man Exceptions im Code nie einfach verschlucken, sondern zumindest loggen, wenn man sie nicht nach oben delegiert.

Ich würde dafür bei der Gelegenheit auch sinnvollerweise gleich einen richtigen Logger verwenden.
System.err.println halte ich maximal für lokale Debuggingzwecke während der Entwicklung akzeptabel (sollte aber möglichst nicht committed werden), und hat spätestens im Produktivcode nichts mehr verloren.
 

Juelin

Bekanntes Mitglied
Danke an alle.
Ihr habt recht, man sollte sich die Fehlermeldung von SQLError an sehen.
Die Fehlermeldung war wrong row.
Ich habe debuged und fest gestellt, das die Abfrage von "isAfterLast()" nicht richtig funktioniert.
Ich will einen Satz lesen, den es NICHT gibt.
Aber isAfterLast() gibt immer FALSE zurück, obwohl gar kein Satz gelesen wurde.
Seltsam, seötsam.
Hat da einer eine Idee?
Danke und Gruß
Jürgen
PS: habe auch isLats() probiert, genau so wie isAfterLast().
 

Oneixee5

Top Contributor
Danke an alle.
Ihr habt recht, man sollte sich die Fehlermeldung von SQLError an sehen.
Die Fehlermeldung war wrong row.
Ich habe debuged und fest gestellt, das die Abfrage von "isAfterLast()" nicht richtig funktioniert.
Ich will einen Satz lesen, den es NICHT gibt.
Aber isAfterLast() gibt immer FALSE zurück, obwohl gar kein Satz gelesen wurde.
Seltsam, seötsam.
Hat da einer eine Idee?
Danke und Gruß
Jürgen
PS: habe auch isLats() probiert, genau so wie isAfterLast().
Wie ich schon in einem anderen deiner Beiträge geschrieben habe: https://www.java-forum.org/thema/if-abfrage-funktioniert-nicht-richtig.204183/#post-1368916

Ich bin etwas erstaunt über die "Milde" mit welcher auf diese Beiträge geantwortet wird. Alles was du in deinem Code oben machst, sollte in 7-10 Zeilen Code erledigt sein - nicht in 158. Viele Probleme, dieser Art vorzugehen, wurden auch noch gar nicht angesprochen.
 

KonradN

Super-Moderator
Mitarbeiter
Und die Schleife kann einfach ein while (rs.next()) sein - dann musst Du da keine Variable nutzen und nichts prüfen a.la. rs.isAfterLast().

Und nur um es noch einmal mit Dokumentation zu belegen:
ResultSet (Java SE 17 & JDK 17) (oracle.com)
A ResultSet object maintains a cursor pointing to its current row of data. Initially the cursor is positioned before the first row. The next method moves the cursor to the next row, and because it returns false when there are no more rows in the ResultSet object, it can be used in a while loop to iterate through the result set.

Bezüglich isAfterLast:
Note:Support for the isAfterLast method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY
Daher ist das keine gute Idee, das hier zu verwenden.

Die Fehlermeldung war wrong row.
Bitte immer die ganze Meldung der Exception melden und im idealen Fall auch bitte den Stacktrace. Gerade letzteres ist z.B. wichtig um zu sehen, wo die Exception geworfen wird. Dann würde man direkt sehen, ob es in isAfterLast oder in executeQuery oder sonst irgendwo ausgelöst wurde.

Daher bitte immer ein ex.printStackTrace() oder so mit im Catch-Block haben (oder wie schon in #5 genannt: korrektes Logging / Tracing).
 

Manul

Mitglied
Mit wenig Erfahrung z.B. mit Java ist es aber verständlich erstmal lesbaren Code zu schreiben
Genau das ist der Code in seiner jetzigen Form eben leider (noch) nicht.

(statt hochoptimierten, dessen Sinn man adhoc nicht erkennt)
Von (hoch)optimiert war bis jetzt nirgendwo die Rede hier (und wäre auch gar nicht das Ziel, das kann der Compiler eh meist besser).

Soweit ich das sehe, gingen bis jetzt alle Kommentare eher in die Richtung, sich mit den Idiomen und Konventionen/Best-Practices der Sprache und ihrer APIs vertraut zu machen und diese anzuwenden. Was zusammen mit einer halbwegs gängigen Formatierung den Code auch deutlich besser verständlich machen würde.
Statt lediglich ein Pascal-Programm in Java-Syntax zu schreiben, bzw. wie bei der while-Schleife das Rad komplett neu zu erfinden. Wodurch eben leicht schlecht lesbarer und fehleranfälliger Code entsteht.
 
Zuletzt bearbeitet:

Juelin

Bekanntes Mitglied
Also, ich habe das Problem gelöst.
Nur muß ich sagen, in Java ist alles ganz schön kompliziert. In Delphi ist das einfacher.
Es gibt in Java keine Eigenschaft Anzahl Rows.
Ich musste die Anzahl Rows mit den Befehlen:
Last()
getRow()
First()
ermitteln.
Und wenn keine Daten in der Datenbank gefunden worden sind geht der Befehl
isAfterLast nicht. Ist immer FALSE.
Wenn keine Rows vorhanden darf man nicht in Leseroutine.
Also Ihr Spezialisten, es ist eben nicht alles Gold was glänzt.
Gruß
Jürgen
 

KonradN

Super-Moderator
Mitarbeiter
Also Ihr Spezialisten, es ist eben nicht alles Gold was glänzt.
Das Problem ist, dass Du vermutlich irgend welche Lösungsansätze, die unter Delphi üblich sind, versuchst 1:1 zu übernehmen. Damit rennst Du in viele x y Probleme. Du willst eigentlich x machen, hast dafür aber den falschen Ansatz, so dass Du in lauter komische y Probleme rennst.

Das ist schon mehrfach aufgefallen und da wurde Dir schon öfters der eine oder andere Hinweis zu gegeben.

Wozu brauchst Du die Anzahl der rows? Ist das, weil Du ein Array fester Größe für das Ergebnis haben willst?
==> Nimm einfach eine List. Dazu gibt es die Collections im Framework.

Dir muss halt klar sein, dass es in Java Abweichungen gibt bezüglich der zu Grunde liegenden Bibliotheken gibt. Und Dir sollte bewusst sein, dass es für viele Deiner Probleme bereits einfach umzusetzende Lösungen gibt.
 

Manul

Mitglied
Nur muß ich sagen, in Java ist alles ganz schön kompliziert. In Delphi ist das einfacher.
Klar ist es manchmal etwas frustig, wenn man nach langjähriger Erfahrung mit Sprache X plötzlich auf Y umlernt. Erfahrungsgemäß sind aber auch in Java die Dinge nur so kompliziert, wie man sie sich macht. Java als Sprache an sich ist sogar recht einfach gestrickt, aber die APIs und das ganze Ökosystem aus Tools, Libraries und Frameworks brauchen schon etwas Zeit um reinzukommen und ein gutes Gespür dafür zu entwickeln, wann man was nutzt um daraus guten Code entstehen zu lassen. Gerade die Wahl der richtigen Libraries ist bei Java fast schon obligatorisch, um sich das Leben nicht unnötig schwer zu machen. Zum Glück gibt es da aber für (fast) alles was, sodass du nicht jedesmal das Rad neu erfinden oder quer durch alle Abstraktionsschichten schießen musst.
 

KonradN

Super-Moderator
Mitarbeiter
Mit JDBC : getInt(1)-Methode auf dem ResultSet anwenden
Wie kommst Du auf diese Idee? Das liefert den Wert der ersten Spalte der aktuellen Row als int und macht daher nur dann Sinn, wenn man eine Abfrage auf Count(*) oder so gemacht hat (als eigenständige Abfrage vorab).

Das Verhalten von ResultSet bezüglich getInt ist klar: Das liefert den int aus der ersten Spalten der aktuellen Zeile.
Wenn Du noch kein next() aufgerufen hast, dann bist Du noch auf keiner row und Du bekommst eine SQLException.
(Das ist also kein Hack bezüglich "vor dem ersten next() aufrufen oder so)

Einfach ein schneller Test mit einer InMemory Datenbank. HSQLDB bietet sich da an und man kann einfach ein Beispiel aus dem Netz kopieren:
Javabeginners - HyperSQLDB

Da kann man z.B. vor der while Schleife einmal versuchen, das getInt(1) hinzu zu fügen:
Code:
java.sql.SQLException: invalid cursor state: identifier cursor not positioned on row in UPDATE, DELETE, SET, or GET statement: ; ResultSet is positioned before first row
 

LimDul

Top Contributor
Achtung - längerer Beitrag :)
Wie @KonradN geschrieben hat, sind einige deiner Probleme darauf zurückzuführen, dass du nicht Java programmierst - sondern Delphi/Pascal mit Java Syntax. Das ist wie, wenn man vom Tischtennis zum Tennis wechselt und versucht die gleichen Schlagbewegungen durchzuführen, macht auch nur Probleme und Schmerzen :)

Ich mach jetzt drei Dinge:
a) Mal ein komplettes Code-Review auf die formalen Aspekte
b) Review bzgl. der Struktur
c) Wie kann man Dinge besser Java-Like machen.

Das wird in a) und b) recht viel sein - da bitte nicht falsch verstehen, dass man Anfang halt viele Dinge nicht richtig macht, ist normal.

Java:
    public void dbTabellenEintraegeArray(int fanz, String feld1, String feld2, String feld3, String feld4, String feld5)
        {
Hier fallen direkt mehrere Dinge auf.
Formatierung: In Java schreibt man gemäß den Java Coding Conventions die öffenende Klammer in die gleiche Zeile. Ist natürlich am Ende jedem selber überlassen - aber 99,9% der Java Welt machen es anders und wenn man mal mit anderen Java Entwicklern zusammenarbeiten will, sollte man es sich direkt angewöhnen.
Benennung: Die Benennung der Paramater ist schlecht. feld1 bis feld5? Was soll das sein? fanz? Irgendeine Anzahl? Aber was? Klare Bezeichnungen sind wichtig. (Aus dem Code geht es nachher hervor, aber es muss schon aus dem Methodenrumpf hervorgehen)
Anzahl/Art der Parameter: feld1 bis feld5 und ein Anzahl, wie viele Felder gefüllt sind? Das hat nix mehr mit Java zu tun :) Für sowas gibt es Listen. Beispiel:
Java:
public void dbTabellenEintraegeArray(List<String> zuLesendeFelder) {
Rückgabe? Die Methode liest es aus der Datenbank hat aber keine Rückgabe. Das riecht direkt nach Seiteneffekten, dass sie irgendwas irgendwo anders ändert - ganz großes Antipattern, macht man nicht. Wenn eine Methode, was liest, dann hat sie es entweder zurückzugeben oder man übergibt ein Objekt mit, dass die gelesenen Daten übergeben bekommt.

Java:
        int a = 0;
        int f = 0;
        String x;
Bennenung: a, f und x sind keine Variablen Namen, die man verwendet.
Deklaration: In Java werden Variablen nicht am Anfang deklariert, sondern da wo sie verwendet werden.

Java:
        dbRet = 6;
Return-Codes: Return Codes sollte man man zu 90% vermeiden - Für eine Steuerung von Fehlern gibt es Exceptions.
Scope Return Code ist ein Feld? Ganz ganz schlechter Stil, die Variable ist nur für den Kontext der Methode relevant, also gehört sie auch nur in dieser Methode - wenn überhaupt - definiert.
Magic-Numbers: 6? Was bedeutet das? Insbesondere - wenn man schon Return Codes verwendet - dann müssen die mit statischen Konstanten definiert sein. Was 6 bedeutet, kann man nicht erkennen.

Java:
        String[] dbgelesen = new String[999999];
Ein Array mit der Anzahl Einträgen? Weg damit - für sowas gibt es Listen.

Java:
        VitalShowController.anzeintraege = 0;
Statische Felder als Übergabe von Daten zu nutzen - gewaltiges Antipattern und hat absolut nichts mehr mit Java zu tun.

Java:
            boolean l = true;
            boolean g;
            dbRet = 0;
            String nachname;
            String vorname;
            String geburtsdatum;
            String datum;
            String uhrzeit;
            String systole;
            String diastole;
            String puls;
            String temperatur;
            String groesse;
            String gewicht;
            String bemerkung;
            String spo2;
            String mnachname = "";
            String mvorname = "";
            String mgeburtsdatum = "";
Gleiches wie schon oben:
  • Variablen erst definieren wenn man sie braucht
  • Variablen sinnvoll benennen
  • Was unterscheited geburtsdatum vom mgeburtsdatum
Zusätzlich
Datentypen:Warum ist Geburtsdatum, Uhrzeit ein String und kein Datum/Uhrzeit Datentyp? Warum ist puls, gewicht, etc kein Integer?
Viel zu viel: Bei einer Methode, die deartig viele lokale Variablen braucht, stimmt was nicht. Die Methode macht demnach vermutlich viel zu viele Dinge und gehört in einzelnen Methoden und Klassen aufgeteilt

Java:
                while (l)
                    {
                    rs.next();
                    g = rs.isAfterLast();
                    if (g)
                        {
                        l = false;   
                        }
                    else					
                        {
Aus der API-Doc
The next method moves the cursor to the next row, and because it returns false when there are no more rows in the ResultSet object, it can be used in a while loop to iterate through the result set.
Das ganze kann man schreiben als
Java:
while(rs.next()) {
So werden aus 10 Zeilen eine Zeile.

Java:
                                x = vorname+" "+nachname+" "+geburtsdatum;
// ...
                                    x = vorname+"/"+nachname+"/"+geburtsdatum+"/"+datum+"/"+uhrzeit+"/"+systole+"/"+diastole+"/"+puls+"/"+temperatur+"/"+groesse+"/"+gewicht+"/"+bemerkung+"/"+spo2+"/";
Das ganze hat nichts in der Methode zu suchen, sie soll Daten einlesen und keine fachlichen Operationen machen und Ausgabe Strings bauen. Das gehört wo anders hin.

Java:
                            if (fanz > 0)
                                {
                                f = 0;   
                                if (nachname.equals(feld2))
                                    {
                                    if (fanz == 1)
                                        {
                                        f = 1;   
                                        }
                                    }
                                if (fanz > 1)
                                    {
                                    if (vorname.equals(feld1))
                                        {
                                        if (fanz == 2)
                                            {
                                            f = 1;   
                                            }
                                        }
                                    }
                                if (fanz > 2)
                                    {
                                    if (geburtsdatum.equals(feld3))
                                        {
                                        if (fanz == 3)
                                            {
                                            f = 1;   
                                            }
                                        }
                                    }
                                if (fanz > 3)
                                    {
                                    if (datum.equals(feld4))
                                        {
                                        if (fanz == 4)
                                            {
                                            f = 1;   
                                            }
                                        }
                                    }
                                if (fanz > 4)
                                    {
                                    if (uhrzeit.equals(feld5))
                                        {
                                        f = 1;   
                                        }
                                    }
                                if (f == 1)
                                    {
                                    x = vorname+"/"+nachname+"/"+geburtsdatum+"/"+datum+"/"+uhrzeit+"/"+systole+"/"+diastole+"/"+puls+"/"+temperatur+"/"+groesse+"/"+gewicht+"/"+bemerkung+"/"+spo2+"/";
                                    dbgelesen[VitalShowController.anzeintraege] = x;
                                    VitalShowController.anzeintraege++;
                                    }
                                }
                            else
                                {
                            x = vorname+"/"+nachname+"/"+geburtsdatum+"/"+datum+"/"+uhrzeit+"/"+systole+"/"+diastole+"/"+puls+"/"+temperatur+"/"+groesse+"/"+gewicht+"/"+bemerkung+"/"+spo2+"/";
                            dbgelesen[VitalShowController.anzeintraege] = x;
                            VitalShowController.anzeintraege++;
                                }
                            }
Kurzfassung: Hä? So eine if-Kaskade kann nie richtig sein. Das geht entweder einfacher oder muss in Methoden unterteilt werden. Mir ist da auch nicht klar, was da passieren soll. Es scheint ein Filter zu sein - da gehört dann aber auf SQL Ebene gemacht und nicht über ein deartiges Konstrukt (Bei dem ich nicht glaube, dass es überhaupt funktioniert)

Java:
            catch(SQLException err)
                {
                dbRet = 5;   
                }
Exceptions sollte man nach Möglichkeit zur Programmflusssteuerung nutzen und nicht Return Codes. Zudem sollte man nie Exceptions wie hier verschlucken, sondern mindestens ausgeben oder protokollieren.


Das erstaml direkt zum Code. Dann zum generellen Stil. Da muss man leider sagen, dass ist zwar synaktisch Java Code, aber das wars auch schon. Ansonsten hat das nichts mit Objektorienterter Programmierung in Java zu tun und ist in der Form unwartbar. Grundsätzlich muss folgendes gelten:
  • Eine Methode macht genau eine Sache. Entweder Daten lesen oder Strings zusammenzubauen oder ähnliches - aber nicht beides
  • Daten werden nicht in zig Variablen gehalten (Vorname, nachname etc.) sondern in Objekten
  • Eine Methode darf keine Objekte/Daten verändern, die ihr nicht übergeben werden. Sie darf nur auf Objekten arbeiten, die ihr übergeben werden. Ihre Ergebnisse gibt sie am besten als Rückgabe zurück.

Wie kann man es besser machen?
Viele mehr aufteilen.
Für die Daten eine eigene Klasse:
Java:
package de.limdul.javaforum;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalTime;

public class MedizinDaten {

    private String vorname;
    private String nachname;
    private LocalDate geburtsdatum;
    private LocalDate datum;
    private LocalTime uhrzeit;
    private Integer systole;
    private Integer diastole;
    private Integer puls;
    private Integer groesseCm;
    private String gewichtKg;
    private String bemerkung;
    private String spo2;
    private BigDecimal temperatur;

    public String getVorname() {
        return vorname;
    }

    public void setVorname(String vorname) {
        this.vorname = vorname;
    }

    public String getNachname() {
        return nachname;
    }

    public void setNachname(String nachname) {
        this.nachname = nachname;
    }

    public LocalDate getGeburtsdatum() {
        return geburtsdatum;
    }

    public void setGeburtsdatum(LocalDate geburtsdatum) {
        this.geburtsdatum = geburtsdatum;
    }

    public LocalDate getDatum() {
        return datum;
    }

    public void setDatum(LocalDate datum) {
        this.datum = datum;
    }

    public LocalTime getUhrzeit() {
        return uhrzeit;
    }

    public void setUhrzeit(LocalTime uhrzeit) {
        this.uhrzeit = uhrzeit;
    }

    public Integer getSystole() {
        return systole;
    }

    public void setSystole(Integer systole) {
        this.systole = systole;
    }

    public Integer getDiastole() {
        return diastole;
    }

    public void setDiastole(Integer diastole) {
        this.diastole = diastole;
    }

    public Integer getPuls() {
        return puls;
    }

    public void setPuls(Integer puls) {
        this.puls = puls;
    }

    public Integer getGroesseCm() {
        return groesseCm;
    }

    public void setGroesseCm(Integer groesseCm) {
        this.groesseCm = groesseCm;
    }

    public String getGewichtKg() {
        return gewichtKg;
    }

    public void setGewichtKg(String gewichtKg) {
        this.gewichtKg = gewichtKg;
    }

    public String getBemerkung() {
        return bemerkung;
    }

    public void setBemerkung(String bemerkung) {
        this.bemerkung = bemerkung;
    }

    public String getSpo2() {
        return spo2;
    }

    public void setSpo2(String spo2) {
        this.spo2 = spo2;
    }

    public BigDecimal getTemperatur() {
        return temperatur;
    }

    public void setTemperatur(BigDecimal temperatur) {
        this.temperatur = temperatur;
    }

    public String getKurzform() {
        return vorname + " " + nachname + " " + geburtsdatum;
    }

    public String getLangform() {
        return vorname + "/" + nachname + "/" + geburtsdatum + "/" + datum + "/" + uhrzeit + "/" + systole + "/" + diastole + "/" + puls + "/" + temperatur + "/" + groesseCm + "/" + gewichtKg + "/" + bemerkung + "/" + spo2 + "/";

    }
}
Diese Klasse hat zwei Methoden - getKurzform & getLangform. Die sind dafür zuständig, eine Kurz- oder Langform darzustellen. (Evtl. gehört das nicht mal hier hin, sondern in eine UI-Klasse)

Die Methode, die die Daten ausliest - tut auch nur noch das, die Daten auslesen & zurückzugeben. Da ich die if-Kaskade nicht verstanden habe im Code, hab ich mal vorgesehen, dass man von außen noch zusätzliche Filter übergeben kann, die entscheiden, ob ein Datensatz ins Ergebnis kommt.

Die Filter:
Java:
package de.limdul.javaforum;

/** Filtert Medizindaten, dass sie nicht in der Ergebnissliste stehen sollen
 */
@FunctionalInterface
public interface MedizinDatenFilter {

    public boolean isRelevant(MedizinDaten medizinDaten);
}

Das Lesen aus der Datenbank:
Java:
package de.limdul.javaforum;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public class DbConnector {

    private static final String SELECT_MEDIZIN_DATEN = "SELECT * FROM TABELLE WHERE Vorname = ? ORDER BY Nachname, Vorname, Geburtsdatum, Datum DESC, Uhrzeit DESC";

    public List<MedizinDaten> leseDaten(String vornameFilter, List<MedizinDatenFilter> zusaetzlicheFilter) {
        try {
            Connection connection = getDbConnection();
            PreparedStatement preparedStatement = connection.prepareStatement(SELECT_MEDIZIN_DATEN);
            preparedStatement.setString(1, vornameFilter);
            ResultSet resultSet = preparedStatement.executeQuery();
            List<MedizinDaten> results = new ArrayList<>();
            while (resultSet.next()) {
                MedizinDaten medizinDaten = createMedizinDaten(resultSet);
                if (zusaetzlicheFilter.stream().allMatch(filter->filter.isRelevant(medizinDaten))) {
                    results.add(medizinDaten);
                }
            }
            return results;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    private MedizinDaten createMedizinDaten(ResultSet resultSet) throws SQLException {
        MedizinDaten medizinDaten = new MedizinDaten();
        medizinDaten.setNachname(resultSet.getString("nachname"));
        medizinDaten.setVorname(resultSet.getString("vorname"));
        medizinDaten.setDatum(resultSet.getDate("datum").toLocalDate());
        medizinDaten.setPuls(resultSet.getInt("puls"));
        // usw.

        return medizinDaten;
    }

    private Connection getDbConnection() {
        return null;
    }
}


Das ganze ist mit Sicherheit auch noch nicht komplett - aber schon mal deutlich strukturierter.
 

Oneixee5

Top Contributor
Was man auch nicht tun sollte, ist es java.sql.Connection über Methoden hinweg zu übergeben bzw. während der ganzen Programmlaufzeit zu halten. Der Compiler sollte das Vorgehen auch mit entsprechenden Warnungen quittieren. Da das Erzeugen von Connection's sehr teuer ist und lange dauern kann, empfiehlt es sich deshalb DataSource's zu verwenden.
Falsch:
Java:
private Connection getDbConnection() {
    return ...;
}
Besser:
Java:
        private static final String DB_URL = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1";
        private static final String DB_USER = "sa";
        private static final String DB_PASSWORD = "";
 
        private JdbcDataSource dataSource;
 
        public DataSource getDataSource() {
            if (dataSource == null) {
                dataSource = new JdbcDataSource();
                dataSource.setURL(DB_URL);
                dataSource.setUser(DB_USER);
                dataSource.setPassword(DB_PASSWORD);
            }
            return dataSource;
        }
In dem Beispiel geht es nicht um MySQL sondern H2, das müsste entsprechend angepasst werde.

Verwendung:
Java:
Collection<MedizinDaten> queryMedizinDaten(final String vornameFilter, ...) throws SQLException {
        final Set<MedizinDaten> records = new LinkedHashSet<>();
        final String sql = "SELECT ...";
        try (
            Connection connection = getDataSource().getConnection();
            PreparedStatement statement = connection.prepareStatement(sql);
        ) {
            statement.setString(1, vornameFilter);
            ...
        
            try (ResultSet resultSet = statement.executeQuery()) {
                while (resultSet.next()) {
                    
                    records.add(new MedizinDaten(...));

                 }      
            }
        }
        return records;
    }

In dem Beispiel von @LimDul ist leider ein grundsätzlicher Fehler enthalten - was vermutlich der Vereinfachung als Beispiel geschuldet ist. Alles was mit JDBC/Datenbankverbindungen zu tun hat, sind native Ressourcen, welche nach der Nutzung freigegeben werden müssen. Das wurde dort komplett weggelassen. Es sollten try-with-ressources Statements verwendet werden: https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
TheSkyRider MySQL Datenbankzuordnung in Verbindung mit Java Datenbankprogrammierung 7
C Java MySQL check if value exists in database Datenbankprogrammierung 2
S Datenbank MySQL und Java Datenbankprogrammierung 8
P Adressadministration mit Java und mySQL Datenbankprogrammierung 14
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
X MySQL Java hat keinen Zugriff auf MySQL Datenbankprogrammierung 9
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
F MySQL Wie kann ich in Java Datensätze aus einer MySQL Datenbank gezielt in einzelne Arrays schreiben? Datenbankprogrammierung 9
J mySQL- Java Application - Zugriff über Internet Datenbankprogrammierung 3
H SHOW Tables in Java/MySQL Datenbankprogrammierung 8
Z MySQL Shopsystem mit mysql und Java Datenbankprogrammierung 8
H Datenbank-Anbindung Java/MySQL Datenbankprogrammierung 2
K Adressverwaltung mit MySql und Java? Datenbankprogrammierung 11
M Java Mysql verbinden Datenbankprogrammierung 3
L MySQL App/Java Zugriff auf Mysql-DB funktioniert nicht Datenbankprogrammierung 1
P MySQL Java Programm als Dienst MySQL Dump zurück spielen Datenbankprogrammierung 4
P Mittels Java einen neuen MySQL User erstellen Datenbankprogrammierung 4
E MySQL Java an Mysql Webdatenbank anbinden Datenbankprogrammierung 11
L Mit Java Desktop Anwendung auf Mysql Server auf Webspace verbinden Datenbankprogrammierung 11
S Java Connection to MySQL Datenbank FunPic Datenbankprogrammierung 4
F Wie kann man das mysql Command in java laufen lassen? Datenbankprogrammierung 14
G Suchfunktion mit Java in Mysql Datenbank Datenbankprogrammierung 7
M Auf MySQL Datenbank mit Java zugreifen Datenbankprogrammierung 4
M MySQL Datenbank mit Java routen Datenbankprogrammierung 2
A mysql Treiber nich gefunden Java Editor Datenbankprogrammierung 6
M Ausgabe in Tabelle der MySQL-Datenbank mit Java Datenbankprogrammierung 4
H MySQL-DB automatisches Backup per Java Datenbankprogrammierung 2
S java.lang.ClassNotFoundException: com.mysql.jdbc.Driver Datenbankprogrammierung 10
Y Java und MySql... "No suitable Driver..." Datenbankprogrammierung 16
S Java objekt in MYSQL auslesen Datenbankprogrammierung 32
H Fat Jar Export: Could not find class-path entry for 'C:Java/jdk/mysql-connector-java- Datenbankprogrammierung 3
N Java mit MySQl verbinden Datenbankprogrammierung 11
F eigenartiges Java/mysql problem Datenbankprogrammierung 9
S Java, JDBC und MySQL - Verbindungserror Datenbankprogrammierung 8
B Spaltennamen von MySQL Datenbank nach Java auslesen Datenbankprogrammierung 10
P Java und MySQL Datenbankprogrammierung 7
J MYSQL-Zugriff mittels einer Java-Bean Datenbankprogrammierung 42
T Java app. MySQL, Google Web API, domains Datenbankprogrammierung 2
A Java-Applet -> MySQL Datenbank Datenbankprogrammierung 7
E Datenbankverbindung Java MySQL Exception Datenbankprogrammierung 10
L Bilder in MySQL-Datenbank via Java verwalten Datenbankprogrammierung 5
zilti java.lang.ClassNotFoundException: com.mysql.jdbc.Driver Datenbankprogrammierung 3
H Empfehlenswert: Java + MySQL? Datenbankprogrammierung 18
G wohin mit dem treiber ? mysql-connector-java-5.0.5-bin.jar Datenbankprogrammierung 12
D java.lang.ClassNotFoundException: com.mysql.jdbc.Driver Datenbankprogrammierung 5
J Java und Mysql Datenbankprogrammierung 5
F JAVA & MySQL : INSERT INTO DB ! Datenbankprogrammierung 2
U Java und Mysql Problem über 24:00:00 Stunden Datenbankprogrammierung 4
M MySQL-Datenbank über Java ansprechen Datenbankprogrammierung 5
M Datenbankanbindung: Java - MySQL Datenbankprogrammierung 2
A MySQL+Webserver --(Java-Applet)----> Client Datenbankprogrammierung 11
B Source not found // Java MySQL (eclipse) Datenbankprogrammierung 4
B Importieren in MySQL mit Java-Programm Datenbankprogrammierung 2
B Exportieren aus MySQL mit Java-Programm Datenbankprogrammierung 11
M Mit Java Data Objects Daten in einer MySQL-Datenbank manipul Datenbankprogrammierung 9
G MySQl und Java Datenbankprogrammierung 6
B Java und MySQL mal wieder Datenbankprogrammierung 3
S MySQL-Abfrage unter java funktioniert nicht! Datenbankprogrammierung 4
R MySQL denies access to data source - java.sql.SQLException Datenbankprogrammierung 14
M MySQL Tabellen in java auslesen? Datenbankprogrammierung 5
G Java & Mysql Ein- und Ausgabefehler? (Anfängerfrage) Datenbankprogrammierung 2
S MySQL und Java: Falsche Daten werden ausgelesen Datenbankprogrammierung 9
S Passwort MySQL oder JAVA? Datenbankprogrammierung 4
A java & mysql abfrage mit variablen auswerten, wie? Datenbankprogrammierung 8
P java connectet mysql-db nicht. Datenbankprogrammierung 5
8 Java-MySQL wie geht das mit dem Treiber? Datenbankprogrammierung 3
G 2 fragen zu java <-> mysql Datenbankprogrammierung 4
M Mit Java Applet via HDBC auf MySQL DB zugreifen? Datenbankprogrammierung 2
T MySQL - Java - Japanisch (Kanji) Datenbankprogrammierung 3
E kann mysql nichts mit java.sql.Time anfangen?? Datenbankprogrammierung 3
F Problem mit MySQL-Datenbank und Java-Applet Datenbankprogrammierung 2
N MySQL DB in Java einbinden ? Datenbankprogrammierung 2
G JDBC - MYSQL - Schnittstelle in Java programmieren Datenbankprogrammierung 8
G grundwissen Java-Mysql Datenbankprogrammierung 5
S JAVA & MySQL Datenbankprogrammierung 2
P Java & MySQL Datenbankprogrammierung 26
D Mysql zugriff aus java nicht moeglich Datenbankprogrammierung 2
P Reicht finally nicht um DB connections zu schließen in (altem) Java? Datenbankprogrammierung 4
A Java DB Server lässt sich nicht starten Datenbankprogrammierung 3
U SQL Server mit Java verbinden Datenbankprogrammierung 5
D SQLite Datenbank in Android Studio (Java) durchsuchen Datenbankprogrammierung 3
TH260199 Java-Programm. Probleme bei der Umsetzung von einer Kontaktverwaltung. Datenbankprogrammierung 7
S Das printen der Ausgabe des Oracle-SQL-Statements in der Java-Eclipse-Konsole funktioniert nicht Datenbankprogrammierung 6
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Noobfrage: Konvertierung von SQL-Datentyp 'timestamp with time zone' in Java-Datentyp Datenbankprogrammierung 3
Zrebna Lediglich interne DB-Verbindungen (Connections) auslesen - mittels Java Datenbankprogrammierung 4
berserkerdq2 Was genau muss ich bei date eingeben, wenn ich in Java eine Spalte definiere, die date ist? Datenbankprogrammierung 1
berserkerdq2 Was kann passieren, wenn ich in java einstelle, dass der Fremdschüssel ein Attribut ist, welches selber kein Primärschlüssel ist? Datenbankprogrammierung 4
berserkerdq2 Foreign key einstellen java Datenbankprogrammierung 4
nikgo Java SQL Ausgabe in Liste o.ä. abspeichern um mit dem Ergbnis "zu arbeiten"? Datenbankprogrammierung 5
S Datenbankprogrammierung in Java unter NetBeans 12 funktioniert nicht! Datenbankprogrammierung 1
Beginner22 Zugriff auf Datenbank aus Java über mariadb Datenbankprogrammierung 3
S ODBC Treiber in Java Editor einbinden Datenbankprogrammierung 3
H Oracle Resize eines Images in Java und Rückgabe des Image als BLOB an die Oracle Datebank Datenbankprogrammierung 14
H Java Class zum komprimieren von Jpeg-Images zum Einbinden in Oracle DB - Bild als blob (in und out) Datenbankprogrammierung 23
V SQLite java.sql.SQLException: no such column: Datenbankprogrammierung 18
B Wie kopieren ich eine Spalte von einer Tabelle in eine andere Tabelle SQLite durch java code? Datenbankprogrammierung 26
D Daten aus der Firebase-Echtzeitdatenbank abfragen und in Variablen speichern (JAVA) Datenbankprogrammierung 0
Slaylen Java List Suchen mit eigenem Generischen Datentyp Datenbankprogrammierung 10

Ähnliche Java Themen


Oben