# Generelle Frage zum Umgang mit Datensätzen



## Darokh (22. Dez 2011)

Hi,
ich habe ein paar generelle Frage zum Umgang mit Daten aus Datenbanken.

Ich hole Datensätze aus einer Datenbank, die ja dann in ResultSets gespeichert werden.

1. Ist es "üblich", mit den ResultSets weiterzuarbeiten, oder werden diese Daten dann nochmals in Vektoren oder ähnliches überführt, weil im Nachhinein dort besser mit gearbeitet werden kann? Wenn ja, welche, und warum?

2. Wenn ich nun mit Schleifen arbeite, um bestimmte Felder dynamisch zu füllen und dort gleichzeitig mehrere Tabellen über Fremdschlüssel miteinander verbunden habe:

Bietet es sich nun an, PRO Schleife eine eigene Abfrage zu generieren (das kostet doch bestimmt viel Rechenleistung) oder eher eine ganze Tabelle über SELECT * reinzuholen, um dann die entsprechenden Schleifen ablaufen zu lassen?

Ich erstelle gerade mit einem JTree eine Übersicht über bestimmte Daten, und da bin ich mir nicht sicher, ob ich für jeden Knoten eine Abfrage generieren sollte oder alles ein mal Herschaufel und dann intern damit weiterarbeiten sollte.


3. Oder gibt es dazu eine Alternative, die ich nun als Anfänger noch nicht kenne. Dann wäre ich über ein oder zwei Schlagwörter ganz glücklich.


Vielen Dank  und lieben Gruß,
Darokh


----------



## VfL_Freak (22. Dez 2011)

Moin,



Darokh hat gesagt.:


> Ich hole Datensätze aus einer Datenbank, die ja dann in ResultSets gespeichert werden.
> 1. Ist es "üblich", mit den ResultSets weiterzuarbeiten, oder werden diese Daten dann nochmals in Vektoren oder ähnliches überführt, weil im Nachhinein dort besser mit gearbeitet werden kann?
> Wenn ja, welche, und warum?


IMHO hängt das davon ab, was mit den Daten passieren soll !



Darokh hat gesagt.:


> 2. Bietet es sich nun an, PRO Schleife eine eigene Abfrage zu generieren (das kostet doch bestimmt viel Rechenleistung) oder eher eine ganze Tabelle über SELECT * reinzuholen, um dann die entsprechenden Schleifen ablaufen zu lassen?


Ob Du die ganze Tabelle auf einmal einlesen kannst, hängt wohl von deren Größe ab.
Bei bspw. 100.000 Datensätzen würde ich eher davon abraten, da Du anschließend alles im Speicher halten musst, was dann ggf. eng wird, wie ein Kollege hier gerade leidvoll erfahren muss 

Bei "kleineren Mengen" würde ich das aber machen und dann satzweise abarbeiten!

Gruß
Klaus


----------



## SlaterB (22. Dez 2011)

1.
das sieht man schon daran dass manche oder alle höheren Frameworks wie Hibernate kein ResultSet oder vergleichbares zurückgeben 
sondern List<Object[]>, Iterator, oder Bean-Klassen statt Object[] falls vorhanden,

ein Grund, wie im letzten Thread genannt: Trennung von Code, niemand will wissen wo die Daten herkommen, ob aus Textdatei, DB, Benutzereingabe, Zufallsgenerator,
Daten sind genau Daten, also, int, String, evtl. relevante Datenklassen, zur Verpackung Arrays, Listen, Maps usw.

wenn du auf eine andere API als ResultSet umstellst, etwa Hibernate, 
dann sollte das besser nicht GUI-Klassen oder sonst wie Beteiligte stören,


----------



## Andgalf (22. Dez 2011)

Darokh hat gesagt.:


> 3. Oder gibt es dazu eine Alternative, die ich nun als Anfänger noch nicht kenne. Dann wäre ich über ein oder zwei Schlagwörter ganz glücklich.


-Objekt Relationales Mapping
-JPA


----------



## turtle (23. Dez 2011)

Ich schlag vor, dass Du Dir mal meinen Blog-Eintrag durchliest als Beispiel von ORM (Objekt Relationales Mapping) am Beispiel von myBATIS. 

Der Vorteil hierbei ist, dass Du genau weisst welche SQL-Befehle gegen die DB geschickt werden. 

Damit würde sich Deine Idee verbieten, in einer Schleife jedesmal Befehle gegen die DB zu feuern. SQL ist Mengen-orientiert, also sollte man auch versuchen viele Records auf dem DB-Server gleichzeitig behandeln zu lassen. 

Dies auf dem Client zu tun verbietet sich ja schon häufig wegen der Anzahl der Records, das wurde ja bereits erwähnt, und das vielen Daten über die Leitung "wandern" müssen, um dann bearbeitet zu werden (Performance). Und wenn dann die Bearbeitung darin besteht gleich einen weiteren SQL-Befehl abzuschicken, sollte dies, wenn möglich, stattdessen auf dem Server gemacht werden.

Muss man aber trotzdem über sehr grosse Tabellen iterieren, bietet myBATIS das Konzept des ResultHandlers, mit dem nur EIN Record im Client gehalten wird.


----------



## Darokh (23. Dez 2011)

Vielen Dank! 
Ich werde mich da mal reinlesen!


----------

