Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

  • Autor

Danke für deine Antwort Whiz-zarD hab mir das Hibernate durchgelesen, aber versteht es leider nicht xD

Wir hatten leider bei uns noch 0 mit Frameworks oder Mapping zu tun =/

Bearbeitet von DieMstar

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.

  • Autor

@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

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

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

  • Autor

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

  • Autor

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

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

  • Autor

@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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.