Anzeigen von Daten aus Datenbank in JTable
Ich Schreibe ein Programm mit jdbc wird eine Schnittstelle zur Datenbank(smth wie CRUD-Anwendung). Ich gehe davon aus, dass ich eine Klasse schreiben(z.B. DBCLass
), die nicht alle Operationen mit der Datenbank(select, update, insert, delete
und vielleicht einige andere Logik, die reduziert werden, um diese Vorgänge). Benutzer-Schnittstelle besteht aus einem Satz von Tabellen und ein paar Tasten. Die Verwendung einer Jtable muss ich implementieren Sie eine Klasse(e.g Model
), die eine Unterklasse von AbstractTableModel. Also diese Klasse wird meine Daten an den Benutzer. Ich brauche zur Umsetzung eines solchen Modells für alle Tabellen in meiner Datenbank-schema. Ich will nicht schreiben, der Logik, Klassen, die die Anzeige von Daten an den Benutzer, und ich denke, es ist nicht sehr gut zu schreiben, die Logik-code in solchen Klassen. Aber es ist auch falsch, laden Sie alle Daten aus der db-Tabelle Speicher - (z.B. ArrayList) und dann zeigen Sie es in der Model
.
Also, ich möchte ein beraten welcher Weg der beste ist, solche problem zu lösen.
edit:
Ein kleines Beispiel:
Statement stmt = ....;
ResaultSet rs = stmt.executeQuery("SELECT * FROM table1");
javadoc sagt, dass die executeQuery-Methode gibt ein ResultSet-Objekt enthält die Daten aus der Abfrage. Also, Wenn wir haben eine Menge von Daten(die Größe ist mehr als erlaubt die Größe unserer virtuellen Maschine), unser Programm wird scheitern.
Also meine Frage ist immer noch relevant
InformationsquelleAutor maks | 2011-03-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Download-Quelle für SQuirreL SQl und haben einen Blick auf die Tabelle Umsetzung.
Einige Dinge zu beachten:
Datenbank-Tabellen werden nicht Java JTables. Eine Tabelle in einer Datenbank ist in der Tat eine Reihe (Fluch der Narr, verwendet der falsche Begriff) mit den Elementen, und jedes Element hat Eigenschaften (in der Regel als "Spalten", das ist nicht eine JColumn, die erklärt, warum es so schwer ist die Karte zwei).
Einen Satz kann zu jeder beliebigen Größe heranwachsen. Es hat keine intrinsische Ordnung. Man kann viel von set-Operationen auf Sie, wie: Vereinigung, Differenz, sub-set.
Daher ist es nicht einen Tisch, besonders nicht eine UI-Tabelle.
Gibt es keine einfache UI-Paradigma die Karten "set" auf "Tabelle". Sie können
Load-N-Datensätze und-Seite über die Ergebnisse.
Können Sie laden mehr als die Benutzer scrollt
Können Sie zählen die Größe des sets und passen Sie die Bildlaufleiste entsprechend. Wie der Benutzer scrollt durch die Daten, es ist der Wert aus der DB angezeigt.
Vorteile + Nachteile:
Lösung 1 ist am einfachsten zu implementieren und die eine, die die Nutzer hassen die meisten. Warum müssen Sie warten, um zu sehen, Daten wieder, wenn die rückwärts gehen? Dies ist besonders frustrierend, wenn jeder fetch-dauert 15 Sekunden. Seite ... warten ... Seite ... oops! Da war es! Verdammt! Warten, warten, warten ... wieder ... warten ... aaargh.
Auch Datenbanken haben oft eine harte Zeit, um die Seite Daten. Für einige Abfragen, die Leistung kann verheerend sein.
Lösung 2 ist einfach zu implementieren, vor allem, wenn Sie halten kann die
ResultSet
für immer geöffnet. Aber 100% der Zeit, können Sie nicht. Es beginnt zu scheitern, wenn Sie es offen halten für ein paar Stunden oder einen Tag. Nach dieser Zeit, die DB wird denken, "oh, es ist tot, Jim" und schließen Sie die Verbindung und Ihre Nutzer erhalten eine schöne Fehlermeldung und Sie erhalten ein wütender user.So müssen Sie die Seite hier auch, aber nicht so oft. Auf der positiven Seite, Benutzer müssen nicht warten, wieder für die Daten, die Sie bereits haben. Einen riesigen Punkt: Wenn das set enthält Millionen von Zeilen, die Nutzer intuitiv verstehen, dass Sie brauchen, um anzugreifen, das problem aus einem anderen Blickwinkel, wie Sie nach unten scrollen. Schließlich werden Sie müde und Fragen, für eine bessere Lösung (anstatt wütend auf Sie, weil Ihre blöde Programm nicht anzeigen kann, 15 Millionen Zeilen in weniger als 0.0000000001 s).
Lösung 3 ist schlechter als #2, wieder. Wenn die Tabelle wächst, die UI unbrauchbar wird: Auch nur einen Blick auf die schriftrolle, wissen, gehen Sie zu einer beliebigen Stelle in der Tabelle. So macht es deine Maus nutzlos. Und Ihre Nutzer wütend.
Damit ich in der Regel versuchen, eine Lösung für die:
Liest 1000 Zeilen, max. Plus ich halt nach 100 Zeilen (also der Benutzer hat zumindest einige Daten), wenn das Lesen der Zeilen dauert mehr als 1 Sekunde. In der Regel, die Abfrage ist langsam, und das Auslesen des ResultSet dauert praktisch keine Zeit, aber ich mag die defensive hier.
Auf der Oberseite jeder Spalte einen filter und eine "order by", die direkt zugeordnet werden können SQL. So kann ich sicherstellen, dass, wenn Sie wollen, dass die Daten, sortiert nach einer Spalte sortiert alle Werte (und nicht nur diejenigen, die Sie sehen können auf dem Bildschirm).
Diese ermöglicht es den Benutzern zu hacken, große Mengen von Daten in sinnvolle sub-sets.
Ja, aber es wird langsam, wenn die Abfrage komplexer wird. Ich schlage vor, legen Sie einen cache zwischen der Tabelle und der Datenbank, die sich erinnern können, sagen wir 100 Zeilen.
InformationsquelleAutor Aaron Digulla
Tabelle Aus Datenbank hat ein paar Ideen.
InformationsquelleAutor camickr
Maks,
Hier ist ein weiteres Beispiel auf generische sql-Tabelle Implementierung:
http://www.oreillynet.com/pub/a/oreilly/java/news/javaex_1000.html
Kann es sein, einen guten Ort zu suchen für deine Antwort.
Auch diese lokale Frage/Antwort-kann Ihnen helfen, mit ResultSet-Größe: Java JDBC Faul Geladen ResultSet
Hoffe, das hilft,
Robert
InformationsquelleAutor R. Simac
Diesem blog-post wird erläutert, wie faul laden von Daten in eine Tabelle, Modell: JTable an eine Datenbank Mit Lazy Loading
InformationsquelleAutor Aaron Digulla
Wollen Sie das
DBTable
- Komponente aus dem QuickTable Projekt.Überprüfen Sie diese SO beantworten mit Beispiel-code-Nutzung.
InformationsquelleAutor Stephan
Hier eine Klasse zum extrahieren von Daten Zeilen und Spalten aus der Datenbank.
Blick auf Tabelle = new JTable(rows(), columns());
Sie laden hole Daten aus einer Datenbank-Tabelle in den Speicher. Wenn Sie 1 Millionen Datensätze in Ihrer Tabelle, wird Ihr Programm nicht funktionieren
InformationsquelleAutor Ali Ben Messaoud