# Sinnvoller Entwurf einer Java DB-Anwendung



## Mat2701 (21. Aug 2010)

Hallo Java-Profis,

ich beschäftige mich schon einige Zeit mit Java und DBs (also testweise bislang mit Access, spielt aber bei meiner Frage keine Rolle) und frage mich die ganze Zeit, wie baut man ein Java-Prog, das auf einer DB arbeiten soll, ordentlich auf? Mir geht es nicht, hier Code zu sehen, davon gibt es genug im Netz. Es geht mehr darum, wie man die Klassen am sinnvollsten aufbaut. Die Beispiele zeigen immer nur folgendes:
- Treiber einbinden
- Verbindung aufbauen
- Abfragen schicken
- Ergebnisse holen

Ist klar, alles zur Veranschaulichung zusammengepackt in einer Klasse, aber das ist doch für richtige Programme murks.

Jetzt hatte ich mir überlegt, erst eine Klasse für die Einbindung des Treibers zu machen (später könnte ich dann weitere Treiber in der Klasse berücksichtigen) und eine Connection aufbauen; die Connection wird als Ergebnis zurück gegeben. Also kann ihc mit der Connection als Instanz weiter umgehen.

Dann eine Klasse, in der nur die Statements behandelt werden. wie auch immer.

Und eine Klasse, in denen ich die ganzen verschiedenen Queries als vorgefertigte Strings habe, auf die ich schnell zurückgreifen kann. Eine gewisse Standardisierung der Query-Strings verhindert m.E. später ggf. Fehler in den Query-Strings selbst, wenn man sie jedes Mal neu tippen muss. 

Aber macht das Sinn so? Macht es Sinn, die o.g. Queries über eine definierte Ziffer, ähnlich wie bei einem Array-Index auszuwählen? In zwei Monaten weiß ich doch nicht mehr, welche Query-String unter z.B. Index 1 oder 2 zu finden ist, ohne nachzuschauen. Oder ist es besser, die vordefinierten Querys als Rückgabewerte über Methodennamen auszuwählen, die  Methodennamen müssten dann so sprechend sein für das ,was sie tun, dass das auf Dauer kaum möglich ist.

Sinnvolle Literatur dazu habe ich nicht gefunden, in der beispielhaft so eine Anwendung ordentlich aufgebaut wird.

Kann mir jemand Best-Practice-Tipps geben oder einen Hinweis auf hilfreiche Literatur?

Vielen Dank.


----------



## XHelp (21. Aug 2010)

Je nach dem was du letztendlich vor hast: du könntest dir eine Klasse DatabaseConnector machen, die für die Arbeit mit der Datenbank zuständig ist. Die auch alle für dich relevanten Methoden zur Verfügung stellt, so dass du nicht mehr mit den Querys dich rumschlagen musst. z.B. 
	
	
	
	





```
List<User> getUserList()
```
, 
	
	
	
	





```
updateUser(int uid, User user)
```
 o.ä.


----------



## Sekundentakt (22. Aug 2010)

Hi,

ich weiß nicht, ob Dir das weiterhilft, aber:
Ich stand vor kurzem vor dem Problem, dass ich eine Applikation erstellen möchte, die unabhängig von der Datenschicht agieren soll - d.h. es soll austauschbar sein, ob man als Datenschicht eine xml-Datei oder eine ganze Datenbank einsetzt. 

Dazu habe ich mir eine DataAccess-Klasse überlegt, die Daten aus einer config-Datei ausliest.
In der config-Datei ist festgelegt, ob es sich dabei um ein Datenbank-basiertes DAO handeln soll, oder um ein dateibasiertes.

Mal angenommen, es handelt sich um eine Datenbank als Datenschicht, dann hinterlege ich drei Parameter in der config-Datei.
Key -> Statement, Fields.
Also jedes Statement hat eine bestimmte Bezeichnung. Die Fields geben an, welche Felder ich davon auslesen will. 

Auf diese Weise stehen alle eingesetzten SQL-Statements in der config-Datei - und ohne das man irgendwelche hartcodierten Werte manipulieren müsste, kann ich jetzt z.B. die Daten aus einer anderen Tabelle holen. Wenn man das weiterentwickelt, kann man pro Key sogar festlegen, ob es sich um ein SQL-Statement handelt, oder ob der Wert aus der config-Datei stammt. 

Die einzelnen Komponenten der Applikation kennen nur den Key für Ihr DAO. In der Dokumentation der Klassen gebe ich dann diesbezüglich einen Kommentar ab (z.B. erwartet ein RequestHandler seine Parameter im DAO unter dem Key "RequestHandler").

Sollte ich nicht mehr auf SQL-Statements zurückgreifen wollen, sondern vollständig auf harte-Werte im XML-Format, sieht das so aus:
Key - > Statement, fields
In diesem Falle sieht Statement ggf. so aus "user=test|pass=secret|role=admin" und fields enthält "user, pass, role".

Die Methode dao.getData(key) gibt dann eine Map zurück.


```
String user = map.get("user");
String pass = map.get("pass");
String role = map.get("role");

User user = new User(user, pass, role);
```

Ich empfinde das eigentlich als recht elegant. 

Vielleicht hilft Dir das.

Beste Grüße


----------

