Pattern für Datenbank Anwendung

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo,

ich erstelle gerade eine Anwendung mit einer DB und frage mich, welche Pattern sich hierbei besonders gut einsetzen
lassen. Es sollen Daten gespeichert, verändert , gesichtet und gelöscht werden können.


Ich habe mir überlegt, dass man hierbei möglicherweise das Strategie Pattern einsetzen könnte.
Ich habe eine Strategie Klasse mit 4 Unterklassen:

Klasse A : SELECT
Klasse B : UPDATE
Klasse C : DELETE
Klasse D : INSERT

--------------------

Ist das eine Möglichkeit ? Über Meinungen und Hinweise wäre ich dankbar.
Gibt es bei DB Anwendungen andere Pattern, die besonders gut geeignet wären ?


Vielen Dank


VG
 

Niki

Top Contributor
Normalerweise wenn du eine Persistenzschicht verwendest hast du für jede Tabelle min. 2 Klassen:
ein DAO = Data Access Object, dieses Object dient zum Zugriff (also insert/update/delete/select)
ein POJO = Plain Old Java Object, das ist ein reiner Datenhalter, ohne Logik. Ein Objekt stellt einen Datensatz dar

die DAOs bekommen über Methoden die POJOs und wissen wie sie dieses Speichern sollen

Dafür gibt es aber einige Frameworks: hibernate, toplink, torque,...
 
G

Gast

Gast
Hallo, danke für Deine schnelle Antwort. Frameworks kommen leider nicht in Frage. Es ist ein Schulprojekt bei dem mögl. viele Pattern zum Einsatz kommen sollen.

Ich habe bisher für jeden Tabelle eine Klasse, die jeweis für die
DB Felder setter und getter Methoden bereit hält.
Das wäre wohl dann die POJO

Jetzt bin ich auf der Suche nach der besten Lösung zur Kommunikation mit der DB , welche am Besten mit Hilfe eines
pattern zum Tragen kommt.

Daher auch meine Überlegung bez. des Strategie Pattern.

Hast du vielleicht einen Tipp oder einen Link ??

VG
 
M

maki

Gast
Das Strategy Pattern ist da wohl daneben bzw. zu fein granular.
Das allgemein "richtige" Pattern ist das DAO Pattern, musst dich halt reinlesen.

Eine DAO Schicht selbst zu schreiben ist nicht aufwendig, den link hab ich dir bereits gegeben.
Im DAO Pattern stecken viele kleinere Pattern drin ;)
 
G

Gast

Gast
Ja, hab schon gesehen. Tausend Dank . Hab Dein Post erst nach meinem gesehen. Echt Spitze . meine Lektüre für heute Abend :))
 
G

Gast

Gast
OK. Nur noch einmal zu Verständnis. Ich habe 4 Komponenten:

Business Objekt
Transfer Objekt
Data Source
Data Access Object

Data Source ist meine Datenbank.

Transfer Objekte sind die Klasse wo die Daten abgelegt werden, mit den getter und setter Methoden

DAO sin die Klassen, die die direkten Anweisungen für die DB enthalten und auch als fabrik
implementiert werden können.


Business Objekt: Ist das mein Controller ? Wenn ich MVC einsetze , müßten die Business Objekte
doch meinem Controller entsprechen ?


Viele Grüße
 
M

maki

Gast
Transfer Objekte sind out, du benutzt stattdessen deine POJOs, mittlerweile auch Domain Objekte genannt.

Auch wirst du keine EJBs einsetzen (Business Objekt), sondern wirst wahrscheinlich in einer Art "Controller" aus deinem MVC Framework (?) die DAOFactory aufrufen, welche dir die DAOs erzeugt.
DataSource ist übrigens ein Interface aus java.sql.
 
G

Gast

Gast
Hey, vielen Dank maki.

Zitat:
DataSource ist übrigens ein Interface aus java.sql.


Ich habe schon einen eigenen Datenbankcontroller , der die Verbindungen zur Datenbank regelt.
Ich wollte es dann so machen , dass alle DAO 'S von deiser Klasse erben. Dort
sind Methoden wie getConnction() und loadJDBCTreiber() enthalten.

Das kommt der Interface Geschichte doch schon sehr Nahe. Geht wohl auch oder ?


Also habe ich dann für jede Tabelle eine DAO und eine einzige Fabrik-Klasse, die mir meine
DaoObjekte erzeugt.

In den Dao's selbst liegen dann jeweils 4 Methoden, die SELECT / INSERT / UPDATE / DELETE
abdecken.


VG
 

Niki

Top Contributor
Jo schaut recht gut aus. Was ich gerne mache ist einen Connection Pool verwenden. Wenn es sich um eine Client Anwendung mit nur einer Verbindung handelt ist das aber hinfällig. Der Pool wird einmal beim Starten der Applikation initialisiert (mittels setup, beinhaltet treiber, url, user, pwd, anzahl verbindungen, automatisches erstellen von Verbindungen falls keine vorhanden sind).
Der Code würde dann so aussehn:
Code:
		DBConnection dbcon = null;
		try {
			dbcon = DBConnectionPool.getInstance().getConnection();
			USERDAO<USER> dao = DAOFactory
					.getUSERDAO(dbcon);
			for (USER u : userList) {
				dao.insert(u);
			}
			dbcon.commit();
		} catch (Exception ex) {
			Settings.LOGGER.error("Beim Speichern ist ein Fehler aufgetreten", ex);			
		} finally {
			DBConnectionPool.getInstance().releaseConnection(dbcon);
		}
 

ARadauer

Top Contributor
In den Dao's selbst liegen dann jeweils 4 Methoden, die SELECT / INSERT / UPDATE / DELETE
ja so ungefähr, man kann schon einwenig flexible sein.

zb für User

public User readUser(int userId);
public ArrayList<User> readAllUser();
public void deleteUser(int userId);
....

was du halt brauchst.

Business Objekt: Ist das mein Controller ? Wenn ich MVC einsetze , müßten die Business Objekte
doch meinem Controller entsprechen ?
Ich instanziere mir meine DAOs immer im Model, (Benutzer klickt auf laden->Commando an Controller -> Controller weißt Model an die Daten zu laden ->Model lädt mittels DAO die Daten -> Model informiert über ObserverPattern die Views über das Ergebnis
Aber ich denk darüber kann man streiten, gibt sicher viele die das im Controller machen.

Transfer Objekte sind out, du benutzt stattdessen deine POJOs, mittlerweile auch Domain Objekte genannt.
eh alles das selbe oder?
 
G

Guest

Gast
ja so ungefähr, man kann schon einwenig flexible sein.

zb für User

public User readUser(int userId);
public ArrayList<User> readAllUser();
public void deleteUser(int userId);
....

Alles klar, ich mache mir eben unterschiedliche DAOs . Doch wenn ich unerschiedliche DAOs habe, muss ich
ja für jede Klasse eine Factory zur Verfügung stellen, die dann immer exakt das selbe Objekt erzeugt?

Für meine Klasse Beitäge habe ich ja ganz andere Methoden.

Die Factory hätten dann nur 1Methode erstelleUserDAO() oder erstelleBeitragDAO()
und die DAO Objekte erben von der Factory ?!

VG
 

ARadauer

Top Contributor
ich persönlich mach das ohne Factory

UserDao userDao = new UserDao();
User franzl = userDao.getUser(5);

bin mir jetzt nicht sicher, welchen vorteil mir eine factory bringen würde, aber ich bin auch nicht der pattern guru.
 
M

maki

Gast
bin mir jetzt nicht sicher, welchen vorteil mir eine factory bringen würde
Du müsstest nicht mehr wissen, das es sich um eine UserDao Klasse handelt ;)

Du würdest entweder eine Methode der DAO Factory aufrufen (getUserDao), oder die User Klasse als Paramter an eine Factorymethode übergeben.
Die Connection und andere Details sollten alle von der Factory verwaltet werden, du brauchst in deinem Code nicht zu Wissen, ob JDBC oder irgendetwas anderes verwendet wird.
Schliesslich werden solle Details von der Factory abstrahiert.
 
G

Gast

Gast
Super, vielen Dank...

maki, wenn ich Dich jetzt richtig verstehe brauche ich doch nur eine Factory Klasse für alle DAOs.

Also entweder eine Klasse "Fabrik" , die für jede DAO eine eigene Methode hat.

oder für jede DAO eine eigene Fabrik ?

Hab mir das gerade hier mal angeschaut:

http://www.theserverside.de/factory-method-pattern-in-java/

In den Beispiel werden halt nur Autos erzeugt. ich habe ja Objekte
mit verschiedenen Inhalten.

Würde das Pattern sehr gerne verwenden...

VG
 
M

maki

Gast
Eine Factory für alle DAOs einer Datenbank.

Am einfachsten wäre es, eine Methode pro DAO anzubieten, zB getUserDao(), getDocumentDao(), etc. pp.

Fortgeschrittene Implementierungen lassen wir mal aussen vor ;)
 
M

maki

Gast
Alle DAOs sollte ein gemeinsames Interface haben(Implementieren), welche die Operationen ( find(..), save(..), update(..), delete(..), etc. pp. )bereitstellt.
Dao eignet sich gut als Interface name ;)

Der Rückgabewert der getUserDao() und aller anderen Factory Methoden sollte dieses Interface sein, welche konkrete Implementierung (Klasse) es nun ist, ist allein Sache der Factory(methode).
 
G

Gast

Gast
Hallo, wenn ich nun meine Methoden in den DAO's sehr feingranular setze und jede DAO andere Methoden hat, dann habe ich sehr viele leere Methoden, da ich zwangsläufig alle implementieren muss.

Code:
public interface Dao {
	
	public void saveUser(String name);
	public void updateUser(int userID, String name);
	public void deleteUser(int userID);
	public String findUser(int userID);

}
Code:
public class userDao implements Dao{
	public void saveUser(String name) {}
	public void updateUser(int userID, String name) {}
	public void deleteUser(int userID) {}
	public String findUser(int userID) { return "Hallo"; }
}
Code:
import my.utils.DBController;

public class DaoFactory extends DBController {
	
	public Dao getUserDao() {
		Dao userDao = new userDao();
		return userDao;
	}

}

Das Interface macht gerade bei MVC schon Sinn. Würde dann in der GUI die Factory aufrufen . Ist das korrekt ?
 
M

maki

Gast
Hallo, wenn ich nun meine Methoden in den DAO's sehr feingranular setze und jede DAO andere Methoden hat, dann habe ich sehr viele leere Methoden, da ich zwangsläufig alle implementieren muss.
Versuch doch mal die Methoden im Interface sehr generell zu halten, zB save, delete, etc. anstatt saveUser, deleteUser...
Natürlich kannst auch jedes Entität sein eigenes Dao Interface verpassen.
Was du auf keinen Fall machen solltest ist alle feingranularen Methoden (saveUser, saveDocument, etc.) in ein einzigees Interface zu quetschen.

Eine abstrakte Klasse zu schreiben die das Interface implementiert kann helfen weniger redundanten Code zu schreiben: Implementiere alle Methoden des Interfaces, selbst wenn die Implementierung nix anderes macht als eine (UnsupportedOperation)Exception zu werfen, ist das schon viel wert ;)

Das Interface macht gerade bei MVC schon Sinn. Würde dann in der GUI die Factory aufrufen . Ist das korrekt ?
Aus dem Controller bzw. aus einer EJB werden DAOs aufgerufen und ja, es ergibt sehr viel Sinn MVC und DAO zu verwenden, auch wenn die beiden nicht immer direkt etwas miteinander zu tun haben, oft ist noch eine Schicht dazwischen (EJB).
 
G

Gast

Gast
Prima, das ist ja alles schon recht einleuchtend. Ist es richtig, dass ich einen Observer nicht zwangsläufig
benötie ? Ich meine, dass ich bei mir keinen benötige, glaube aber, dass der doch immer bei MVC
eingestezt wird.

Habe ja jetzt meine Factory so in der Art:

Code:
public class DaoFactory {
	
	public Dao getUserDao() {
		DaoInterface  userDao = new userDao();
		return userDao;
	}

Diese wird dann im Contoller instantiiert. Habe also für jede DAO eine Methode wie oben.

Könnte ich denn nicht auch den Code so schreiben mit einer Methode , ähnlich wie in dem Link
von Henrik:

Code:
public static DAOFactory instance (Class factory)
{

try {
      return (DAOFactory) factory.newInstance();
      }catch (  Exception ex ) {
       throw new RuntimeException("Konnte keine Factory erzeugen : "+ factory  );
     }

}


Ich instantiiere ja eigentlich über das Interface . Da kann ich ja oben keine direkte Klasse eintragen.



VG
 

*Hendrik

Bekanntes Mitglied
Kommt darauf an, ob Du nur eine konkrete Factory verwenden möchtest.
Das Hibernate Beispiel zeigt eine Implementierung mit Hibernate, d.h. Du hast eine konkrete HibernateFactory, die HibernateDAOs instanziert. Durch die Verwendung der abstrakten DAOFactory im Controller, kannst Du den kompletten Datenbankzugriff durch Implementierung einer anderen konkreten Factory einfach ändern. Willst Du irgendwann mal eine andere Factory verwenden, dann wäre die Nutzung einer abstrakten Factory sinnvoll.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Design Pattern für zwei abhängige Klassen Softwareentwicklung 8
K Design Pattern für einen simple Rechenmaschine Softwareentwicklung 18
B Haskell pattern matching in if else Anweisung umschreiben Softwareentwicklung 3
E Frage zu Dekorator-Pattern Softwareentwicklung 2
M Visito/Besucher Design-Pattern/Strukturmuster Softwareentwicklung 4
H2SO3- design pattern: code in model classes Softwareentwicklung 5
G Design Pattern gesucht! Softwareentwicklung 4
D Design Pattern Softwareentwicklung 6
slawaweis Factory-Builder Pattern? Softwareentwicklung 6
B konfigurierbare Objekte - Singelton und Factory Pattern Softwareentwicklung 3
C Flyweight-Pattern verhält sich unerwartet Softwareentwicklung 5
U Decorator Pattern in der Java API Softwareentwicklung 6
M Proxy Pattern - Verständnisfrage Softwareentwicklung 2
0 Unklarheiten beim State Pattern Softwareentwicklung 2
N Composite pattern Softwareentwicklung 2
N Pattern Softwareentwicklung 2
L Builder Pattern Softwareentwicklung 6
1 Factory-Pattern: Bitte um Tipps zur Anwendung Softwareentwicklung 3
L Pattern Softwareentwicklung 3
J DAO Pattern bei komplexen Datenbankzugriffen Softwareentwicklung 2
M IllegalStateException - Problem mit GUI und Observer pattern Softwareentwicklung 4
A Iterato-Pattern und Innere Klassen Softwareentwicklung 9
F Unterschied Command und Strategy pattern Softwareentwicklung 4
F Wann Observer Pattern nehmen und Vorteile davon? Softwareentwicklung 5
H Frage ueber Prototype Pattern? Softwareentwicklung 2
G Warum/Wann mehrere Modells beim MVC-Pattern verwenden ? Softwareentwicklung 7
timomeinen DAO Pattern - Relationen mit DTO abbilden Softwareentwicklung 9
D Singleton pattern Softwareentwicklung 19
M decoration pattern Softwareentwicklung 2
M Plugins entwickeln für ein CMS welches unter der GPL V3 steht Softwareentwicklung 13
I Datenbankschema für Versionierung der Tabellen Softwareentwicklung 9
R Datenstruktur für einen rätselhaften Namen Softwareentwicklung 10
Rahim Post Conditions für InsertAt und remove Softwareentwicklung 1
P Thema für meine Projektarbeit die etwas mit Webautomatisierung zu tuen haben soll? Softwareentwicklung 1
H Entwurfsmuster für den Client der Rest API Softwareentwicklung 0
D Welche Technologien für App und web? Softwareentwicklung 3
Thallius oAuth2 und ClientCredentials für API sinnvoll? Softwareentwicklung 3
S Welche Programmiersprache für eine 3D-Software? Softwareentwicklung 6
N Technologie Grundlagen für eine "App" Softwareentwicklung 12
OnDemand Welches Tool für Planung Softwareentwicklung 2
B Sprache für 3D Physics Engine? Softwareentwicklung 3
K Maßnahmen für Softwarequalität Softwareentwicklung 2
N Graphenalgorithmen: Best Practice für Knoten-/Kanten-Attribute Softwareentwicklung 5
Z Analysemuster - Welches nehme ich für diese Problem? Softwareentwicklung 0
L Softwareentwicklung für Embedded Systems Softwareentwicklung 1
T Gibt es eine Software die Texte für Skype automartisch (automassage) sendet ? Softwareentwicklung 4
R Online-Plattform für Essensbestellungen mit der momentanen Bestellverfolgung Softwareentwicklung 1
S Suche: (Versionierungs)Tool für Klassenaustausch mit Kollegen, die auch an dem Projekt arbeiten Softwareentwicklung 5
R UML-Diagramm für mehrere JFrames Softwareentwicklung 0
S Algorithmus für perfekte Kombination Softwareentwicklung 2
U Individualsoftware - eine Gefahr für Kunden oder die günstigere Alternative? Softwareentwicklung 7
J Grafiken für eigene Apps ? Softwareentwicklung 2
V [Klassendesgin] Verhalten von Subklassen für Aufgabenteilung benutzen. Softwareentwicklung 2
KranzKrone Architektur für einfaches Gui Programm Softwareentwicklung 6
R freie Engine für IOS, Android, Blackberry Softwareentwicklung 11
T SMART für USB Sticks? Softwareentwicklung 9
BinaryLogic Software für Projektplanung und -Entwicklung Softwareentwicklung 19
A MVC & getter für GUI Komponenten Softwareentwicklung 5
S Abstractes/Schnittstellen für Objekte Softwareentwicklung 8
fastjack Welches Tool für Agile Softwareentwicklung? Softwareentwicklung 6
C Wiki für ein Uni - High Level Design Softwareentwicklung 5
Mike90 Lizenz für eigene software Softwareentwicklung 9
V Welche Programmisprache für den Desktop? Softwareentwicklung 17
V Zeitplanung für JUnit-Tests? Softwareentwicklung 9
Jay_030 Checkstyle: Lösungsvorschläge für Design for Extension Softwareentwicklung 7
B Allgemeine Fragen für eigenes Projekt Softwareentwicklung 4
P Sensibilität für Codequalität fördern Softwareentwicklung 17
B Empfehlung für Datenbankschulung? Softwareentwicklung 2
D Beispiele für Patterns Softwareentwicklung 3
K Aufwandsabschätzung für User Stories Softwareentwicklung 8
Torres SDK für automatische Bildkorrektur Softwareentwicklung 3
martin82 Tool für IT-Requests Softwareentwicklung 5
Z Welche Software für Web Anwendungen/Spiel Softwareentwicklung 3
Quaxli Suche Tutorial für Jasper Report - speziell iReport Softwareentwicklung 8
Outsourcer Webservertechnologie für Objekterkennung Softwareentwicklung 7
Landei SSH für VMware GSX mit Windows? Softwareentwicklung 2
ARadauer jetzt wirds zeit für Delphi Softwareentwicklung 6
X JavaScript Plugin für Eclipse Softwareentwicklung 3
sparrow Welche Lizenz für ein offenes Programm Softwareentwicklung 2
ARadauer Code Konvention für Datenbanken Softwareentwicklung 5
G Suche Programm für Masken Design für Pflichtenheft Softwareentwicklung 5
S Wie weiter gehen und tutorial für MVC Softwareentwicklung 20
m@nu Anti-Spam-System für Blog bauen Softwareentwicklung 3
B Was ist besser für Grafiken? Java oder C#? Softwareentwicklung 9
N Brauche Hilfe für Onlineshop Aufgabe für OOP Grundlagen Softwareentwicklung 4
N Für und Wieder von Java und .NET (primär C#) | Performance Softwareentwicklung 6
G 1 Benutzeroberfläche für 3 einzelne Programme! Softwareentwicklung 9
D Programme für UML Softwareentwicklung 3
A Was ist die richtige Lizenz für mich? Softwareentwicklung 2
R Tool für Anforderungsermittlung, Bugtracking und Test Softwareentwicklung 4
V Antwort bewerten (Nur etwas für Experten!) Softwareentwicklung 15
D cheat für ein spiel fixen Softwareentwicklung 19
F IDE für VB Softwareentwicklung 4
S Beispiel für MVC gesucht Softwareentwicklung 53
F Kleines Programm für Windows Softwareentwicklung 2
K Buch oder Online-Tutorium für Programmentwicklung (Anfänge) Softwareentwicklung 5
G Bitte Hilfe für mySQL in einem Query Softwareentwicklung 7
J Beispiel für Besuchermuster Softwareentwicklung 6
M Übersetzer für Programmhilfe gesucht Softwareentwicklung 2
M Disclaimer für eigene Programme? Softwareentwicklung 3

Ähnliche Java Themen

Neue Themen


Oben