de.jsystems.framework.common.saver
Class DataBaseSaver

java.lang.Object
  extended byde.jsystems.framework.common.saver.DataBaseSaver
All Implemented Interfaces:
Saver

public class DataBaseSaver
extends Object
implements Saver

Speichert die Items aus einem Model in einer Datenbank. Dazu muessen die Items allerdings von ihren Attributen her auch zur Datenbanktabelle passen. Im Konstruktor wird der Tabellenname sowie ein Connection-Objekt zur Datenbank uebergeben. Die Connection muss schon initialisiert sein und eine Verbindung zur Datenbank haben. Die entsprechenden INSERT, DELETE und SELECT-Satements werden dann auf Grund der Metadaten aus der Datenbank generiert. Falls das nicht gewuenscht ist, koennen auch schon entsprechend vorbereitete Statements als String uebergeben werden. Hier muessen dann aber entsprechende Platzhalter fuer die INSERT-Anweisung im String enthalten sein. Bei der DELETE-Anweisung ist kein Parameter notwendig, da bei der Standardimplementierung immer erst die ganze Tabelle geloescht wird. Bei einer SELECT-Anweisung ist darauf zu achten, das alle Attribute der Tabelle, die auch in das Item sollen, namentlich aufgefuehrt werden. Das kann auch ueber ALIS-Namen im Statement gesschehen. Wichtig ist dabei allerdings, das der Spaltenname oder der ALIAS-Name fuer die ID nicht 'itemID' heissen darf, sondern 'ID'. Gross-/Kleinschreibung fuer die Attribute wird nicht unterschieden, deshalb darf auch die Datenbank hier keine Unterscheidung treffen. Diese Verbindung zwischen Datenbanktabelle und Item ist fuer das automatische Fuellen des Items notwendig, damit die Spalten den Attributen zugeordnet werden koennen. Beim auslesen der Tabelle und erzeugen der notwendigen Items werden die Eigenschaften fuer die Attribute automatisch mit registriert. Hierzu werden die Metadaten der Tabelle ausgewertet, um festzustellen, ob ein Feld NOT NULL ist oder nicht. NOT NULL-Felder aus der Datenbank bekommen dann die Eigenschaft Item.MUSSFELD. Alle anderen Felder bekommen beim lesen aus der Datenbank die Eigenschaft Item.STANDARD. Falls andere Eigenschaften fuer die Attribute der Items gewuenscht werden muss entweder die Methode load() ueberschrieben werden oder eben eine eigene Implementierung des Interfaces Saver.

Bei dieser Implementierung ist zu beachten, das immer die ganze Datenbanktabelle eingelesen und n einem Model gespeichert wird. Wenn die Tabelle sehr groß ist kann das zu Performanceproblemen fuehren oder aber die Java-VM stürzt ab mit einem OutOfMemoryError. Bei sehr großen Datenmengen ist also die load()-Methode entsprechend zu ueberschreiben.

Beim Speichern eines Models in der Datenbank wird als erstes immer die zugehoerige Tabelle geleert! Das liegt daran, das mi Model vielleicht Items geloescht wurden. Damit sich das auch in der Datenbank wiederspiegelt wird sie hier einfach erst geloescht und dann alle Items aus demModel wieder in der Tabelle eingefuegt. Das erfordert weniger Statements auf die Datenbank als wenn fuer jeden vorhandenen Eintrag in der Datenbank erst geprueft wueder, ob es das zugehoerige Item auch noch im Model gibt. Falls ein anderes verhalten gewuenscht wird, wird hier auf die J2EE-Spezifikation verwiesen. Hier erlauben die EntityBeans ein anderes verhalten, da Aenderungen an einem Bean sofort in der Datenbank landen; somit natuerlich auch das loeschen eines solchen.

Version:
1.0
Copyright by Jens Homm 2001 - 2003
Author:
Jens Homm JSYSTEMS

Field Summary
protected  Connection connection
          Die Verbindung zur Datenbank.
protected  String deleteStatement
          Das DELETE-Statement zum loeschen der Tabelle.
protected  File file
           
protected  String filename
           
protected  String insertStatement
          Das INSERT-Statement zum einfuegen eines neuen Items in die Datenbank.
protected  IBusinessModelSave model
          Das Model in dem die zu ladenden oder zu speichernden Items abgelegt werden.
protected  String pathname
           
protected  String selectStatement
          Das SELECT-Statement zum lesen der Item-Daten.
protected  String tableName
          Der Name der Tabelle in der Datenbank, aus der die Items gelesen bzw. gespeichert werden.
 
Constructor Summary
DataBaseSaver(String tableName, Connection connection)
          Erzeugt einen neuen DataBaseSaver.
DataBaseSaver(String tableName, Connection connection, String selectStatement, String insertStatement, String deleteStatement)
          Erzeugt einen neuen DataBaseSaver.
 
Method Summary
 void load()
          Laedt alle Daten aus der gesetzten Tabelle und speichert sie im gesetzten Model.
 void save()
          Speichert alle Items aus dem gesetzten Model in der Datenbank.
 void setDeleteStatement(String deleteStatement)
          Das Statement zum loeschen der Tabelle.
 void setFile(File file)
          Bei Aufruf dieser Methode passiert nichts, da der DataBaseSaver nicht mit Files arbeitet.
 void setFileName(String fileName)
          Bei Aufruf dieser Methode passiert nichts, da der DataBaseSaver nicht mit Files arbeitet.
 void setInsertStatement(String insertStatement)
          Setzt das INSERT-Statement, mit dem ein Item in der Tabelle gespeichert werden kann.
 void setModel(IBusinessModelSave model)
          Setzt das Model mit dem der Saver arbeiten soll.
 void setPathName(String pathname)
          Bei Aufruf dieser Methode passiert nichts, da der DataBaseSaver nicht mit Files arbeitet.
 void setSelectStatement(String selectStatement)
          Setzt das SELECT-Statement, mit dem die komplette Tabelle gelesen werden kann.
 void setTableName(String tableName)
          Setzt den Namen der Tabelle, in der gespeichert bzw. aus der gelesen werden soll.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

file

protected File file

filename

protected String filename

pathname

protected String pathname

model

protected IBusinessModelSave model
Das Model in dem die zu ladenden oder zu speichernden Items abgelegt werden.


connection

protected Connection connection
Die Verbindung zur Datenbank.


tableName

protected String tableName
Der Name der Tabelle in der Datenbank, aus der die Items gelesen bzw. gespeichert werden.


selectStatement

protected String selectStatement
Das SELECT-Statement zum lesen der Item-Daten.


insertStatement

protected String insertStatement
Das INSERT-Statement zum einfuegen eines neuen Items in die Datenbank.


deleteStatement

protected String deleteStatement
Das DELETE-Statement zum loeschen der Tabelle.

Constructor Detail

DataBaseSaver

public DataBaseSaver(String tableName,
                     Connection connection)
Erzeugt einen neuen DataBaseSaver. Die uebergebene Connection muss schon mit einer Datenbank verbunden sein, da sonst das Saver-Objekt nicht mit der Datenbank arbeiten kann. Der Name der uebergebenen Tabelle muss direkt erreichbar sein, in der Datenbank muessen also entsprechende Synonyme und Grants vergeben worden sein, damit die Anweisungen SELECT, INSERT und DELETE auf der Tabelle ausgefuehrt werden koennen. Die entsprechenden Statements werden dynamisch generiert. Beide Parameter duerfen nicht NULL sein und der tabellenname darf nicht leer sein.

Parameters:
tableName - Der Tabellenname in dem die Items des Models gespeichert bzw. aus der sie geladen werden sollen.
connection - Die Verbindung zur Datenbank.

DataBaseSaver

public DataBaseSaver(String tableName,
                     Connection connection,
                     String selectStatement,
                     String insertStatement,
                     String deleteStatement)
Erzeugt einen neuen DataBaseSaver. Die uebergebene Connection muss schon mit einer Datenbank verbunden sein, da sonst das Saver-Objekt nicht mit der Datenbank arbeiten kann. Der Name der uebergebenen Tabelle muss direkt erreichbar sein, in der Datenbank muessen also entsprechende Synonyme und Grants vergeben worden sein, damit die Anweisungen SELECT, INSERT und DELETE auf der Tabelle ausgefuehrt werden koennen. Mit den uebergebenen Statements werden die entsprechenden Operationen auf der Datenbank ausgefuehrt. Das SELECT-Statement muss eine Spalte mit dem Namen 'ID' selektieren, da mit dieser das zu erzeugende Item initialisiert wird.Dabei sollte es sich sinnvollerweise um den Primary-Key des Datensatzes handeln, damit die ID eindeutig ist. Sonst wuerden beim fuellen des Models ploetzlich Datensaetze fehlen. Das INSERT-Satement muss zumindest alle NOT NULL-Felder der Tabelle enthalten, da es sonst beim speichern des Items zu einer SQLException kommt. Diese Bedingungen werden nicht vorab durch ein parsen des uebergebenen Statements geprueft. Es wird eine Exception ausgeloest, wenn diese Bedingungen nicht erfuellt sind. Keiner der Parameter darf NULL sein und die Strings duerfen auch nicht leer sein. Wenn odch, so wird eine IllegalArgumentException ausgeloest.

Parameters:
tableName - Der Tabellenname in dem die Items des Models gespeichert bzw. aus der sie geladen werden sollen.
connection - Die Verbindung zur Datenbank.
selectStatement - Ein SQL-Statement um die gewuenschten Spalten zum fuellen des Items zu selektieren.
insertStatement - Ein SQL-Statement um die Attribute eines Items in der Datenbank zu speichern.
deleteStatement - Ein SQL-Statement um den Inhalt der Tabelle zu loeschen.
Method Detail

setTableName

public void setTableName(String tableName)
Setzt den Namen der Tabelle, in der gespeichert bzw. aus der gelesen werden soll. Der Name darf weder NULL noch leer sein. Wenn ueber diese Methode der Tabellenname geaendert wird, so werden eventuell ueber den Konstruktor gesetzte Statements geloescht. Diese muessen dann bei Bedarf ueber die entsprechenden Methoden wieder gesetzt werden.

Parameters:
tableName - Der Name der Tabelle in der die Items gespeichert bzw. aus der sie geladen werden.

setSelectStatement

public void setSelectStatement(String selectStatement)
Setzt das SELECT-Statement, mit dem die komplette Tabelle gelesen werden kann. Dabei muss eine Spalte mit dem Namen 'ID' selektiert werden. Mit dieser werden dann die Items erzeugt, die im Model gespeichert werden. Daher ist es sinvoll, wenn es sich bei dieser Spalte um den PrimaryKey der Tabelle handelt. Denn sonst kann es passieren, das ploetzlich Daten im Model verschwinden, weil zwei Items mit der gleichen ID angelegt wurden, was dazu fuehrt, dass das erste aus dem Model verschwindet. Das Statement muss zum verwalteten Item passen, andernfalls kommt es beim laden zu einer Exception.

Parameters:
selectStatement - Das SELECT-Statement zum laden der kompletten Tabelle.

setInsertStatement

public void setInsertStatement(String insertStatement)
Setzt das INSERT-Statement, mit dem ein Item in der Tabelle gespeichert werden kann. Dabei sollte das Statement zumindest alle NOT NULL-Felder der Tabelle enthalten. Die Namen der Spalten im Statement muessen zu den Namen der Attribute im Item passen. Ausnahme ist hier das Feld 'itemID'. Das muss im Statement 'ID' heissen. Das Statement darf weder NULL noch leer sein. Andernfalls wird eine IllegalArgumentException ausgeloest.

Parameters:
insertStatement - Das Statement zum speichern eines Items in der Datenbank.

setDeleteStatement

public void setDeleteStatement(String deleteStatement)
Das Statement zum loeschen der Tabelle. Hier wird der einfachheithalber immer die komplette Tabelle geloescht. Ausgefuehrt wird dieses Statement immer bei Aufruf der Methode save(), da vor dem Speichern einfach die komplette Tabelle geleert wird und dann das komplette Model wieder eingefuegt. Das Statement darf weder NULL noch leer sein. Andernfalls wird eine IllegalArgumentException ausgeloest.

Parameters:
deleteStatement - Das Statement zum loeschen der Tabelle.

save

public void save()
          throws SQLException
Speichert alle Items aus dem gesetzten Model in der Datenbank. Falls noch kein Model gesetzt wurde passiert hier nichts weiter. Wenn Fehler beim ausfuehrender gesetzten oder generierten Statements auftreten wird eine SQLException ausgeloest.

Specified by:
save in interface Saver
Throws:
SQLException - wenn beim speichern ein Fehler auftritt.

load

public void load()
          throws SQLException
Laedt alle Daten aus der gesetzten Tabelle und speichert sie im gesetzten Model. Dabei werden durch das Model die entsprechenden Items erzeugt. Wenn noch kein Model gesetzt wurde passiert hier nichts. Wenn Fehler beim ausfuehren der gesetzten oder generierten Statements auftreten wird eine SQLException ausgeloest.

Specified by:
load in interface Saver
Throws:
SQLException - wenn beim speichern ein Fehler auftritt.

setFile

public void setFile(File file)
Bei Aufruf dieser Methode passiert nichts, da der DataBaseSaver nicht mit Files arbeitet.

Specified by:
setFile in interface Saver
Parameters:
file - Ein File-Objekt, das hier nicht beruecksichtigt wird.

setFileName

public void setFileName(String fileName)
Bei Aufruf dieser Methode passiert nichts, da der DataBaseSaver nicht mit Files arbeitet.

Specified by:
setFileName in interface Saver
Parameters:
fileName - Ein Filename der hier nicht weiter beruecksichtigt wird.

setPathName

public void setPathName(String pathname)
Bei Aufruf dieser Methode passiert nichts, da der DataBaseSaver nicht mit Files arbeitet.

Specified by:
setPathName in interface Saver
Parameters:
pathname - Eine Pfadangabe die hier nicht weiter beruecksichtigt wird.

setModel

public void setModel(IBusinessModelSave model)
Setzt das Model mit dem der Saver arbeiten soll. Solange dieses Model nicht gesetzt ist haben die Methoden load() und save() keine Funktion.

Specified by:
setModel in interface Saver
Parameters:
model - Das Model mit dem der Saver arbeiten soll.