Zum Inhalt springen
  • 0

[JAVA] MYSQL query return, Hilfe :)


DieMstar

Frage

Hey Leute!

Folgendes Problem:

Ich hab eine Datenbank mit den Attributen: Kundennummer ,Vorname, nachname, plz, ort

ich hab eine Klasse Kunde mit den selben Attributen erstellt.

SELECT * from Kunde in Konsole ausgeben.

Pro Zeile des Ergebnisses soll ein Java-Objekt „Kunde“ erstellt werden und die Eigenschaften mit den Werten aus der Tabelle gefüllt werden.

Diese Kunden sollen in einer Liste gespeichert werden. 

ich komm nicht drauf wie ich pro Zeile der ausgabe in das Object speichern kann.

jemand eine Idee?

 

Bearbeitet von DieMstar
Link zu diesem Kommentar
Auf anderen Seiten teilen

12 Antworten auf diese Frage

Empfohlene Beiträge

  • 0

Das, was du willst, nennt sich O/R-Mapping (Object/Relationship-Mapping). Ganz stumpf heißt es, dass du den Inhalt von Spalte "Kundennummer" in das Klassenattribut "Kundennummer" schreiben musst.

Du musst also jede Spalte aus dem Ergebnis auslesen und dementsprechend mappen. Dazu gibt es aber komplette Frameworks, die dies übernehmen, da es je nach Situation nicht trivial ist. Für Java gibt es z.B. Hibernate.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Dein Programm muss irgendwie wissen welche Java-Klassen mit welcher Datenbanktabelle auf welcher Datenbank in verbindung steht.

Am besten suchmaschienst du nach Hibernate, da solltest du beispiele finden wie man eine einfache Klasse mit einer Datenbank verbindet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

@Whiz-zard ja ist eine Schulaufgabe. Ich denke nicht das wir die Aufgabe mithilfe von Frameworks lösen sollen, da wir dieses Thema noch nicht hatten.

Die genaue Aufgabe lautet:

1. Im Datenbanksystem eine Tabelle „Kunde“ erstellen mit den Spalten Kundennummer, Nachname, Vorname, Straße, Postleitzahl, Ort, wobei die Kundenummer der eindeutige Schlüssel sein soll.

2. Im Datenbanksystem zwei Kunden anlegen die alle Spalten gefüllt haben.

3. In Eclipse ein Java-Projekt anlegen mit einer Klasse Start, die eine Methode public static void main(String[] args) hat.

4. Die externe Bibliothek sqljdbc4-4.0.jar für den Datenbankzugriff in das Projekt einbinden.

5. Eine Java-Klasse „Kunde“ anlegen, die dieselben Eigenschaften wie die Tabelle hat. Get- und Set-Methoden zu diesen Eigenschaften anlegen.

6. In der Klasse Start in der Main-Methode soll per JDBC eine Datenbankverbindung zu der Datenbank erstellt werden und das Select-Statement: „SELECT * FROM Kunde“ aufgerufen werden.  

7. Pro Zeile des Ergebnisses soll ein Java-Objekt „Kunde“ erstellt werden und die Eigenschaften mit den Werten aus der Tabelle gefüllt werden. Diese Kunden sollen in einer Liste gespeichert werden.

8. Die Liste soll einmal durchlaufen werden und pro Kunde der Vorname, Nachname und die Kundennummer in einer Zeile in der Konsole ausgegeben werden. 

und mein Code sieht bisher so aus:

public class Main {
    
    public static void main(String args[]) throws ClassNotFoundException, SQLException {
        
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/","root","area51");
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * FROM praktikum_aufgabe.kunde");
        rs.next();
        
        if(rs.getObject(1) == null) {
            stmt.executeUpdate("INSERT INTO praktikum_aufgabe.kunde (nachname,vorname,postleitzahl,straße,ort) "
                    + "Values('dieter','bauer','86551','waldweg 29','aichach')");
            stmt.executeUpdate("INSERT INTO praktikum_aufgabe.kunde (nachname,vorname,postleitzahl,straße,ort) "
                    + "Values('manueal','jansen','86551','steiner weg 2','aichach')");
        }
        
        int i = 1;
        while(rs.next()) {
        System.out.println(rs.getObject(i));
        i++;
        }
    }
 

ich wollte mir erstmal das recordset in der console ausgeben, funktioniert aber noch nicht. Bin mir nicht sicher ob das nur mit MetaData geht, weil kundennummer und plz Integer sind und der Rest Strings. Und dann muss ich irgendwie die ausgegeben Zeilen oder das rs pro Zeile als Object Kunde anlegen.

Die Klasse Kunde hab ich mit private Attributen Konstruktoren und Gett und Settern erstellt.

Bearbeitet von DieMstar
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Die Indexvariable i benötigst du nicht, da über die next()-Methode der interne Zeiger schon auf die nächste Zeile gesetzt wird.
Die Methoden vom ResultSet (z.B. getObject()) erwarten als Parameter nämlich nicht die Zeilennummer, sondern den Spaltenindex. Also entweder als Integer- oder als String. Anstatt i reichst du dort z.B. "Vorname" rein und anstatt getObject verwendest du getString().

while(rs.next()) {
    System.out.println(rs.getString("Vorname"));
}

 

Bearbeitet von Whiz-zarD
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Hi,

mit rs.next() springst du zur nächsten Ergebniszeile. der returnwert ist false, wenn es keine Zeilen mehr gibt.

mit rs.getObject() greifst du auf eine bestimmte Spalte in deiner aktuellen Zeile zu. Hier kann der passende Index oder Spaltenname genommen werden. Und anstatt getObject nutze hier aber lieber getInt oder getString für den jeweiligen Datentyp.

@Whiz-zarD da war ich etwas zu langsam ?

Bearbeitet von Mttkrb
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

habs jetz so geschrieben, ums in einer Zeile in der Konsole ausgegeben zu bekommen:

 

System.out.println(
                    rs.getInt("kundennummer") + " " + rs.getString("nachname") + " " + rs.getString("vorname") + " "
                            + rs.getInt("postleitzahl") + " " + rs.getString("straße") + " " + rs.getString("ort"));

was ich noch nicht ganz verstehe ist, das es mir den zweiten Daensatz in der konsole ausgibt und den ersten überspringt.

hab zb.

1 dieter bauer 86551 weladweg 29 aichach

2 peter maier 86551 neuerweg 20 aichach

 

da überspringt es mir in der ausgabe die erste Zeile o.O

Bearbeitet von DieMstar
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

das mit den Datensätzen in der Console hat sich erledigt, bekomme jetzt alle Datensätze in der Konsole angezeigt. Hab das recordset nochmal neu initialisieren müssen 

nach dem executeUpdate.

wie bekomme ich nun möglichst unkompliziert die einzelnen Zeilen in seperate Objekte gespeichert?

Bearbeitet von DieMstar
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Schau mal genau hin. ;)

ResultSet rs = stmt.executeQuery("SELECT * FROM praktikum_aufgabe.kunde");
rs.next(); <-- erste Zeile wird gelesen
        
if(rs.getObject(1) == null) {
    stmt.executeUpdate("INSERT INTO praktikum_aufgabe.kunde (nachname,vorname,postleitzahl,straße,ort) "
        + "Values('dieter','bauer','86551','waldweg 29','aichach')");
    stmt.executeUpdate("INSERT INTO praktikum_aufgabe.kunde (nachname,vorname,postleitzahl,straße,ort) "
        + "Values('manueal','jansen','86551','steiner weg 2','aichach')");
}

while(rs.next()) <-- nächste Zeile wird gelesen
{
  ...
}
vor 2 Minuten schrieb DieMstar:

wie bekomme ich nun möglichst unkompliziert die einzelnen Zeilen in seperate Objekte gespeichert?

Das sollte doch ein Selbstgänger sein, oder nicht?

Du hast eine Schleife. Du kannst die Daten aus der Tabelle lesen. Was hält dich nun davon ab, Kundenobjekte mit den Daten aus der Tabelle zu erzeugen?

Bearbeitet von Whiz-zarD
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

@Whiz-zard danke dir ;) habs jetz so gelöst:

ArrayList liste = new ArrayList();
        
        while (rs.next()) {
            liste.add(new Kunde(rs.getInt("kundennummer"), rs.getString("nachname"), rs.getString("vorname"), rs.getInt("postleitzahl"), rs.getString("straße"), rs.getString("ort")));
            
            System.out.println(
                    rs.getInt("kundennummer") + " " + rs.getString("nachname") + " " + rs.getString("vorname") + " "
                            + rs.getInt("postleitzahl") + " " + rs.getString("straße") + " " + rs.getString("ort"));
        }
        
        System.out.println();
        System.out.println("Ausgabe der Liste: \n");
        
        Iterator it = liste.iterator();
        
        while(it.hasNext()) {
            System.out.println(it.next());
        }

muss nurnoch irgendwie kucken das ich .toString formatiere, weil ich in der console nur den Speicherpfad angezeigt bekomme:

 

1 dieter bauer 86551 waldweg 29 aichach
2 manueal jansen 86551 blumenstraße 44 aichach

Ausgabe der Liste: 

Kunde@1794d431
Kunde@42e26948

 

eine Idee?:P

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...