# Data Access Object / MVC



## Gast (5. Dez 2007)

Hallo zusammen,

ich versuche bei einer DB Anwendung das Dao Pattern einzusetzen. Leider gibt es in der Umsetzung einige Probleme.

Mir ist der Weg noch nicht ganz klar, wie ich die Daten von der GUI in die DB und von der DB zurück in
die GUI bekomme.

Der Weg sieht bisher so aus:  GUI -->  Controller --> Im Controller wird die DaoFactory aufgerufen -->
DaoFactory erzeugt konkretes DAO --> DAO ruft DATEN aus DB --> speichert Daten in POJO .

Wie kommen nun die POJOs zurück zur GUI?

Was passiert mit den POJOS, nachdem Sie von der DAO befüllt wurden. Werden die POJOS direkt an die 
GUI weitergeleitet ?

Mein Beispiel wäre eine Methode : public ArrayList getData(int id ){}


Gibt es eine Verbindung zwischen dem Controller und den Pojos , d.h. hat der Controller die Möglichkeit,
POJOS zu instantiieren ?


Ich hoffe, mein Problem klar dargestellt zu haben..


Viele Grüße


----------



## maki (6. Dez 2007)

> Wie kommen nun die POJOs zurück zur GUI?


Was genau ist denn deine GUI?



> Was passiert mit den POJOS, nachdem Sie von der DAO befüllt wurden. Werden die POJOS direkt an die
> GUI weitergeleitet ?


Ja.



> ..hat der Controller die Möglichkeit,
> POJOS zu instantiieren ?


Ja.


----------



## Gast (6. Dez 2007)

In der GUI gibt es Formulare , die die Daten aus der DB anzeigen. Man soll Daten bearbeite , löschen und erstellen können. 

Also läuft alles auf dem Hinweg über den Controller, auf dem Rückweg von der DB hat das Model direkten Kontakt zur View.

Mit Deiner Antwort hast Du mir schon einmal sehr geholfen.

Vielleicht kann ich ja mal einen Link zu meinem Klassendiagramm
einstellen, wenn es denn fertig ist. Vielleicht kann ich ja noch ein paar Tipps von Dir bekommen ?

Natürlich nur, wenn das im Pahmen liegt?! 

Viele Grüße


----------



## maki (6. Dez 2007)

Während DAO eigentlich immer gleich ist, ist MVC in jeder Umgebung etwas anders: Webanwendungen im einem Servlet Container können verschiedene MVC Frameworks benutzen(struts, JSF, etc.), Swing ist wieder anderes MVC.

Deswegen meine Frage nach deiner GUI


----------



## Gast (6. Dez 2007)

Achso, ich nutze Swing . 

Der Einsatz von Frameworks sind nicht in Planung.

Wie wäre den dann im Zusamenhang mit Swing der Einsatz von

MVC zu händeln ?


----------



## maki (6. Dez 2007)

Swing ist nicht meine Baustelle 
Kann dir da leider nicht helfen.


----------



## SnooP (6. Dez 2007)

Swing bietet ja an sich schon Modelle für alle möglichen Controlls an... - TableModel, ComboBoxModel etc... diese Modelle packen wir immer in den Controller (also Referenzen darauf) inkl. Listener usw... Wenn die GUI eine Aktion starten soll, ruft sie also den Controller auf, bzw. die actionPerformed Methode aus einem ActionListener z.B. ... das Modell selbst - (also das eigene) kann z.B. via DAO angesprochen werden bzw. über Factories die wiederum im Controller liegen. Meistens muss im Controller dann auch noch die gui selbst liegen, sprich der Controller hält Referenzen sowohl zu Modell als auch zur View, weil man z.B. nen Dialog nach dem Drücken des Speichern-Buttons auch wieder schließen möchte... man könnte das natürlich umgehen, indem man prinzipiell nur Events hin und herschickt und Controller+View nur via Listener lose gekoppelt sind - ich halte davon aber nich soo viel - zu viel Overhead und zu unübersichtlich beim Debuggen.

Um den Dialog bzw. das Modell jeweils von Änderungen zu unterrichten, kann dann ein PropertyChange-Mechanismus verwendet werden.

Trotzdem - prinzipielles Vorgehensmodell: Modellklassen... Controllerklasse für jede View-Klasse die Modell+View verbinden. Dazwischen können evtl. auch noch einige Service-Klassen gehängt werden, wo ich dann so die DAOs einordnen würde...


----------



## ARadauer (6. Dez 2007)

mein konzept:


ein controller der instanziert die models und die views. die view kriegt eine referenz auf das model und die view regestriert sich beim model als listener. (ob jetzt ein oder mehrere model bzw views, hängt vom fall ab)

benutzer klickt zb in der view auf load, ein comando geht an den controller, der das model anweißt daten zu laden.

das model benutz ein dao um die jeweiligen fachobjekte zu laden und hält sie in sich (oft überschreibt das model, zb ein table model)

ist das laden beendet, informiert das model die view darüber

die view kann dann selbst entscheiden ob sie sich aufgrund der aktuellen daten im model aktualisiert.


ich mach das so und bei mir funktioniert das gut. bei mir hat der controller immer wenig zu tun. die teile sind lose über interfaces gekoppelt. also die view kennt nicht wirklich das model sondern nur das interface dass das model implementiert.


----------



## seejay (7. Dez 2007)

sachau mal hier, da hab ich meine momentane Version gepostet
www.java-forum.org/de/viewtopic.php?p=361136#361136


----------



## Gast (19. Dez 2007)

Hallo ,

ich halte mich ein wenig an die letzte Beschreibung von ARadauer. 

Zitat:
view regestriert sich beim model als listener.

Das ist gut. Hab also einen Observer eingebaut. Nutze dafür 
import java.util.Observable;
import java.util.Observer;

In der View geht das auch ganz gut:


```
public class CLAnlegenScreen extends CLScreen implements Observer{

	MainController mc;
	Observable observable;
	
	
	public CLAnlegenScreen(MainController mc, Observable observable) {
		super();
		this.mc = mc;
		this.observable = observable;
		
		observable.addObserver(this);


	}

...........
```

Ich frage mich nur wie ich im Controller den Observer anspreche , wenn ich die View aufrufe?

1.)  new CLPatientAnlegenScreen(mc, ??? ).show();   <---  keine Ahnung wie ich hier den Observer übergebe

----------

Vielleicht wäre es auch schöner, seinen eigenen Observer zu programmieren. 

Im DaoInterface also diese Methoden implementieren:

addObserver(Object o) ;
deleteObsrverObject o);  

In den Daos dann :


```
ArrayList observers = new ArrayList();

MitarbeiterDao:

public void addObserver(Object o){
mit_observers.add(o);
}
```

Das Ding ist, ich müßte für jede DAO eine ArrayList machen und die beiden Methoden implementieren,
das kommt mir sehr aufwendig und falsch vor. Sehr hier aber auch keinen Ausweg.

Ich hoffe, ich konnte mein Problem einigermaßen rüber bringen! Wie würdet ihr das machen?

Viele Grüße


----------

