Java-Projekt: Wie lasse ich den Inhalt der Datenbank in einer Tabelle anzeigen?

2 Antworten

Der ResultSet-Typecast ist überflüssig, immerhin ist rs bereits von diesem Typ. Wenn man zudem davon ausgeht, dass tbShow (was auch immer das für ein Objekt ist) ein komplettes ResultSet handhaben kann, ist auch die Schleife unnötig.

Du solltest bedenken, dass ein ResultSet-Objekt alle Datensätze enthält, die von der Datenbank zurückgegeben wurden. Um beispielsweise ein JTable-Objekt mit diesen Datensätzen zu befüllen, müsstest du über das Set iterieren und in diesem Zuge die einzelnen Spalten je Datenzeile herauslesen.

Für die Kopfzeile wären die Spaltennamen von Interesse:

ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();

String[] columnNames = new String[columnCount];

for (int column = 1; column <= columnCount; ++column) {
  columnNames[column - 1] = metaData.getColumnName(column);
}

Den Rest kann man in einen Vector einlesen:

Vector<Vector<Object>> data = new Vector<Vector<Object>>();

while (rs.next()) {
  Vector<Object> row = new Vector<Object>();

  for (int column = 1; column <= columnCount; ++column) {
    row.add(rs.getObject(column));
  }

  data.add(row);
}

All die Daten kommen im Anschluss in ein Model-Objekt, welches an die Swing-Komponente geknüpft wird.

DefaultTableModel model = new DefaultTableModel(data, columnNames);
JTable table = new JTable(model);

Wenn das JTable-Objekt bereits existiert, müsste die setModel-Methode verwendet werden.


hilfsdok 
Beitragsersteller
 06.10.2022, 11:43

Vielen Dank! Das hilft mir bestimmt weiter beim Lernen. MySQL kann schon nervig sein, leider kommt man da nicht wirklich drum herum.

regex9  06.10.2022, 12:25
@hilfsdok

Ich habe mir deinen Code noch etwas weiter angeschaut und noch ein paar andere Punkte gefunden, die ich an deiner Stelle ändern würde.

1) Deine Klasse hat ein Feld cw, welches du gar nicht verwendest. Die lokale Variable, die du in show erstellst, verdeckt sie, was vermutlich nicht gewollt ist.

2) Den Code, um eine Verbindung herzustellen, würde ich in eine eigene Methode auslagern, die zum Abschluss ein Connection-Objekt zurückgibt.

Ob du dich zudem jedesmal neu mit der Datenbank verbinden musst, würde ich ebenso einmal hinterfragen. Der Timeout, bis MySQL von sich aus eine Verbindung abbricht, liegt normalerweise bei ungefähr 8h Wartezeit, danach kann auch ein automatisches Neuverbinden getriggert werden. Wenn zudem nur dein Programm auf die Datenbank zugreift, wird kein Verbindungskanal der Datenbank unnötig blockiert.

3) Ich rate sehr dazu, die Benamung deiner Bezeichner zu überdenken. Du wechselst zwischen deutscher und englischer Sprache (speichern, show) oder verstößt gegen die Konvention, Klassennamen mit Großbuchstaben zu beginnen (kontaktVerwaltungClass - besser wäre Kontaktverwaltung oder ContactManager, dass es eine Klasse ist, ist schon ersichtlich). Letzten Endes würde es dir ganz sicher helfen, dein Projekt übersichtlicher zu halten.

4) Deine Programmarchitektur erscheint seltsam. Zum einen berücksichtigst du wohl nicht das Prinzip der Kapselung, denn der Zugriff auf tbShow ist in der Db-Klasse direkt möglich. Zum anderen stellt sich die Frage, wieso eine Klasse kontaktVerwaltungClass, die offensichtlich Model-Aufgaben erfüllt (siehe MVC) direkten Zugriff auf ein View-Objekt hat (ich gehe davon aus, dass tbShow eine Swing-Komponente ist, deine Benamung lässt es erahnen).

Erstrebenswert wäre das oben verlinkte MVC-Modell. Die Daten der Datenbank werden in einem Controller ausgelesen und an ein Model-Objekt weitergereicht. Das View-Objekt darf sich dann an dieses Objekt knüpfen, so wie es meine Antwort bereits zeigt.

hilfsdok 
Beitragsersteller
 06.10.2022, 13:08
@regex9

Hm, um ehrlich zu sein aber ich auf die Richtlinien und Ordentlichkeit nicht so wirklich wert gelegt, weil das nur ein Übungsprojekt ist. Wenn ich gerade aber mal so darüber nachdenke wäre es wohl besser jetzt auch bei jedem Projekt schon die Richtlinien einzuhalten, damit man sich an die Konventionen gewöhnt.

Was die Struktur betrifft, ich bin was das Programmieren betrifft noch am Anfang. Ich denke ich bin noch nicht soweit, um wirklich einen ordentlichen Code hinzubekommen. Ich wüsste auch gar nicht wie so eine ordentliche Struktur aussieht. Ich hoffe das lernt man noch mit der Zeit..

Hast du dir schon die Standardfragen gestellt?

  • Was soll das Programm machen?
  • Was macht es stattdessen?
  • Warum macht es das?
  • Gibt es Fehlermeldungen / Exceptions?

Oder müssen wir das für dich ausprobieren?


hilfsdok 
Beitragsersteller
 06.10.2022, 11:38

Das kann ich natürlich erwähnen, aber ich wüsste nicht in wie fern das relevant für mein Problem ist. Die erwünschte Aufgabe ist, dass die Kontaktdaten aus einer Datenbank in einer Tabelle auf Java-Swings ausgegeben werden. Es muss nur ein Prototyp sein, daher sind Bezeichnungen erstmal nicht notwendig. ich denke diese Informationen sollten doch für das jetzige Problem reichen oder nicht?

Mein Problem ist auch keine Fehlermeldung, sondern eher dass ich nicht weiß wie ich die Lösung angehen soll. Ich habe schon mehrere Wege probiert, aber alle haben nicht funktioniert. Ich habe den Code mal hochgeladen, um vielleicht ein paar Tipps zu bekommen. Vielleicht kann mir jemand einfach sagen an welcher Stelle ich das falsch angegangen bin und welche Stellen noch fehlen, an die ich nicht gedacht habe, weshalb das mit der Ausgabe nicht geklappt hat.

Dann noch der letzte Punkt, du musst es natürlich nicht. Du kannst es aber. Man muss nicht helfen, aber wenn jemand helfen will würde ich mich freuen. Wenn du nicht helfen willst verstehe ich dein Kommentar aber nicht ganz, entschuldige.

regex9  06.10.2022, 11:58
@hilfsdok
Das kann ich natürlich erwähnen, aber ich wüsste nicht in wie fern das relevant für mein Problem ist.

Diese Fragen sind immer relevant, wenn man auf ein Problem stößt. Wenn du weißt, was dein Programm tun soll und was es stattdessen macht, kannst du eine Eingrenzung möglicher Gründe vornehmen und die Fehlerquelle leichter ermitteln. Ohne Analyse tappst du hingegen im Dunkeln.

Man muss nicht helfen, (...)

Sieh es mal so: Auch wenn die Bereitschaft besteht, bei Problemen zu helfen (und das ist auch hier der Fall), darfst du nicht erwarten, dass jeder dafür dein Programm nachbaut, um an die Informationen zu kommen, die du schon kennst / kennen könntest, aber nicht von Anfang an teilst. Je nach Situation steckt einiger Aufwand dahinter (Einrichtung einer Entwicklungsumgebung, etc.).

Nimm die obige Antwort eher als Leitfaden, was du zum einen selbst ermitteln kannst und welche Informationen für die, die dir helfen können, relevant wären. Das erhöht in der Regel auch die Chance, ein Problem schnell zu lösen. 😉

hilfsdok 
Beitragsersteller
 06.10.2022, 12:09
@regex9

Hm, im Grunde kann ich das ja auch nachvollziehen und so gehe ich auch ein Problem an. Ich war hier aber schon an einer Stelle, an der ich die Planungsphase schon hinter mir hatte und nur ein Teilproblem eines grösseren Projektes hatte. Da ist lediglich die Funktion definiert "Datenbankdaten in Tabelle ausgeben" und deshalb dachte ich, dass die zusätzlichen Funktionen für das Problem irrelevant sind.

Ich kann auch nachvollziehen, dass man natürlich nicht die Probleme für den hilfesuchenden durch googlen lösen will. Das ist auch nicht mein Ziel. Ich will das Programmieren lernen und da würde das auch nicht helfen.

Ich war aber bei einem Punkt an dem ich 10 Lösungswege versucht hatte und viele Videos auf Youtube geschaut habe und auch alte Einträge auf dem Java-Forum durchsucht hatte und es auch selbst mal versucht hatte und auch mit meinem Lernbuch mal an das Problem rangegangen bin.

Es ist ja nicht so, dass ich beim ersten Problem einfach gutefrage.net eingebe und dann einfach frage, ob mir das jemand programmieren kann.

Ich erwarte auch nicht, dass jemand Google benutzt, um mir zu helfen.

Ich freue mich halt, wenn jemand kurz seine Einschätzung zu meinem jetzigen Code gibt und du es gemacht hast sagst diese und diese Stelle ist überflüssig oder da solltest du lieber diese und diese Methode benutzen. Dann kann ich zu diesen Methoden recherchieren und an das Problem rangehen. Meiner Meinung nach hat das aber nichts mit vorcoden zutun. Wenn Programmier A z.B. jeden Tag 8 Stunden mit MySQL arbeitet und ohne Probleme kurz aus dem Kopf beschreiben kann welche Methode hilfreich ist, dann reicht das doch.

Schachpapa  06.10.2022, 12:24
@hilfsdok

Ich habe mir deinen Code nicht genau angeschaut. Aber deine Frage ist so allgemein, dass man nicht weiß, wo man anfangen soll. Ist das Problem das Auslesen aus der DB oder das Darstellen in Swing?

Ich habe gelernt, wenn etwas nicht funktioniert, bastelt man sich eine KAV (kleinste absturzfähige Version) und bringt die zum Laufen. In deinem Fall hätte ich die Datenbankanbindung also solo mit Konsolenausgabe getestet.

Wenn das Problem die Darstellung in Swing ist, gibt man die Daten so vor, wie sie aus der DB kommen (sollen) und stellt die dar.

Erst ganz viel ungetesteten Code schreiben und hinterher gucken, warum der nicht funktioniert, ist immer mühselig. Für einen externen Reviewer noch mehr als für denjenigen, der das selbst verzapft hat.