Implementierung eines DAOs

APersist ermöglicht das Persistieren und Auslesen von Objekten in relationalen Datenbanken. Für den Zugriff auf die Datenbank werden i.d.R. so geannte Data-Access-Objekte (DAO) verwendet. In diesem Beitrag wird erklärt, wie ein solches DAO für APersist implementiert und angemeldet werden muss.

1. Konfigurieren einer Entität

Um ein DAO für APersist zu implementieren, wird zuerst eine Klasse für je zu persistierende Entität benötigt.

siehe: Konfiguration einer Entity-Klasse

2. Implementieren des DAO

Als Beispiel solle ein DAO für eine Entität Car implementiert werden. Der Aufbau der Klasse Car ist dem Artikel XYZ zu entnehmen.

Die DAO in APersist sind immer auf eine bestimmte Entität zugeschnitten. Dann bedeutet, dass für jede Entität ein entsprechendes DAO implementiert werden muss.

Zu Implementierung des DAO steht eine abstrakte generische Klasse bereit: com.ng.apersist.dao.DAO

Für die Implementierung eines DAO für die Entität Car wird eine Klasse CarDAO angelegt, welche von der o.g. abstrakten Klasse Dao erbt:

public class CarDAO extends DAO<Car> {}

Im Codebeispiel ist zu sehen, wie der generische Typ der Klasse DAO zu der entsprechenden Entität konkretisiert wird, deren Persistenz über das konrete DAO gehändelt werden soll.

Mit der Implementierung von CarDAO ist man damit allerdings noch nicht fertig. Es fehlen noch mindestens 3 Methoden.

1. Default-Konstruktor

Für die Verwendung benötigt das Framework einen Default-Konstruktor, der den Aufruf an die Oberklasse delegiert:

public CarDAO(){
    super();
}

2. Konstruktor zur Initialisierung für die Datenbank

Damit das DAO auch in Verbindung mit der Datenbank benutzt werden kann, wird ein weitere Konsturktor benötigt, der das APersist-Datenbank-Objekt (com.ng.apersist.Database) übergeben bekommt:

public CarDAO( Database db ){
    super( db );
}

3. Funktion für den Entität-Typ

Zum Schluss muss noch eine Funktion (getParameterType) implementiert werden, welche die Klasse der Entitäten liefert:

public Class<Car> getParameterType(){
    return Car.class;
}

Was kann das DAO nun?

Das DAO, so wie es jetzt implementiert wurde, stellt Methoden für folgende Operationen bereit:

  • load( objectID ) – lädt ein bestimmtes Objekt mit der übergebenen ID
  • insertOrUpdate( object ) – wenn das übergebene Objekt bereits in der Datenbank vorhanden ist, wird dieses in der Datenbank aktualisiert, anderenfalls wird es in die Datenbank geschrieben
  • delete( object ) – lösche das übergebene Objekt aus der Datenbank
  • loadAll( ) – Lädt alle Objekte, die in der Datenbank existieren und über das jeweilige DAO gehändelt werden

Neben den o.g. Methoden kann das konrete DAO natürlich beliebig um erweitert werden.

Die Implementierung eines DAO reicht jedoch nicht aus, um das DAO im Kontext von APersist zu verwenden. Um das tun zu können, muss das DAO zusätzlich angemeldet werden.

3. Anmelden des DAO

Das Anmelder des DAOs erfolgt über die com.ng.apersist.DbRegistry, welche bei der Initialisierung der Datenbank übergeben werden muss (siehe Artikel Initialisieren der Datenbank).

Die Klasse com.ng.apersist.DbRegistry wird hierzu wieder durch eine eigenen Klasse konkretisiert.

Im Beispiel wird eine Klasse VehicleDbRegistry erzeugt:

public class VehicleDbRegistry extends DbRegistry {
   
    @Override
    protected void setup() {
    
    }
}

Diese Klasse weißt eine Methode setup( ) auf, in der die DAOs mit ihrene korrespondierenden Entity-Klassen über eine zur Verfügung stehende Methode add( daoClass, entityClass ) angemeldet werden:

public class VehicleDbRegistry extends DbRegistry {

    @Override
    protected void setup() {
        add( CarDAO.class, Car.class );
    }
}

Den Rest übernimmt APersist. Der Nutzer muss sich lediglich noch um den Zugriff auf das DAO kümmern.

Schreibe einen Kommentar