Overview | Package | Class | Use | Tree | Deprecated | Index | Help
PREV CLASS NEXT CLASS | FRAMES NO FRAMES
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD

## de.jsystems.framework.common.saver
Class DataBaseSaver

    java.lang.Object
      de.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.

Overview | Package | Class | Use | Tree | Deprecated | Index | Help
PREV CLASS NEXT CLASS | FRAMES NO FRAMES
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD