Objektorientierte Datenbanken Ralf Möller, FH-Wedel Beim vorigen Mal: Java Data Objects Heute: Der Object Data Standard der ODMG-Group Kurz: ODMG-Standard Die POET-Implementierung FastObjects (t7) Lernziele: Vergleich ODMG-Standard vs. JDO Object Data Standard: ODMG 3.0 Standard für die Erzeugung und Verwaltung von persistenten Objekten (seit 1991 entwickelt) Entwickelt von der Object Data Management Group Konsortium vieler Firmen Unterstützung verschiedener Programmiersprachen (Java, C++, ...) Wir betrachten nur Java ODMG 3.0 Object Definition Language (ODL) Deklarative Sprache zur Beschreibung von Struktur und Operationen von Objekten Prinzipiell: neue Sprache Umsetzung in Java möglich Object Manipulation Language (OML) Programmiersprache Object Query Language Sprachanbindungen ODMG für Java Anwendungsklassen = Java-Klassen + Enhancement Spezielle Klassen für Collections Packages import org.odmg.*; import com.poet.odmg.*; Enhancement Dateien mit Klassendeklarationen müssen aufbereitet werden, damit Instanzen persistent werden können (Enhancement) Beispiel: Gegeben: Directory mit .class-Dateien und Datei ptj.opt ptj -enhance -create Datenbasen Erzeugung: Database db = new Database(); Methoden: db.open( String url, int accessMode ) db.close() Logische Namen für Datenbasen: URL Abbildung auf spezielle Dateinamen in Konfigurierungsdatei möglich Datenbasen bestehen aus einem Teil zur Beschreibung der Klassen (Schema) und einem Teil zur Beschreibung der Instanzen Beispiel // declare a Database reference Database applicationDB; try { // call the open method to gain access to the database applicationDB = new Database(); applicationDB.open( "FastObjects://LOCAL/my_base“, Database.OPEN_READ_WRITE ); // ... application code goes here ... applicationDB.close } catch ( ODMGException e ) { // handle any exceptions . . . } Transaktionen Erzeugung als Instanz: Transaction txn = new Transaction(db); Methoden: txn.begin() txn.commit() txn.abort() Beispiel Database db = new Database(); db.open( . . . ); // create a transaction . . . Transaction txn = new Transaction( db ); // start the transaction . . . txn.begin(); // . . . // end the transaction (with commit) . . . txn.commit(); Datenmodellierung: Collections (1) Datenmodellierung: Collections (2) Datenmodellierung: Maps Interface org.odmg.DMap Klasse com.poet.odmg.util.MapOfObjects Persistenz Persistenz durch Erreichbarkeit Persistenz durch Bindung von Instanzen an Namen (repräsentiert durch Zeichenketten) Anonyme Persistenz Bindungen von Instanzen an Namen Methoden der Klasse Database: bind(Object o, String name) MyClass o = new MyClass( ... ); db.bind(o, "test") lookup(String name) MyClass o = (MyClass) db.lookup("test") unbind(String name) db.unbind("test") Anonyme Persistenz Methode der Klasse Database: makePersistent(Object o) deletePersistent(Object o) Zugriff auf anonyme Objekte über Klassen und Anfragesprache Zugriff auf Objekte Zugriff über Klassen (Extents) Zugriff über Anfragesprache: Object Query Language Extents Extents enthalten alle Instanzen einer Klasse Extents werden vom System verwaltet Konstruktor: Database db; String className; Extent ext = new Extent(db, className) Methoden: boolean hasNext() Object next() int size() ext.setFilter(String filter) Beispiel String dbName = new String( "FastObjects://LOCAL/product_base" ); Database db = new Database(); db.open( dbName, Database.OPEN_READ_WRITE ); Transaction txn = new Transaction(); txn.begin(); Extent extentPerson = new Extent( db, "Person" ); // perform operations with the Person objects... txn.commit(); Beispiel // . . . // print all stored instances of MyClass Extent myInstances = new Extent(db, "MyClass"); while ( myInstances.hasNext() ) { System.out.println( myInstancees.next() ); } // . . . Indizierung Extents können "indiziert" werden, d.h. es kann eine Ordnung definiert werden und man kann mit quasi-konstantem Aufwand auf eine bestimmte Instanz zugreifen Details können wir hier nicht besprechen Filter für Extents Database db = new Database(); db.open( . . . ); Transaction txn = new Transaction( db ); txn.begin(); Extent engineerExtent = new Extent( db, "Engineer" ); String predicate = "WHERE this.name_ LIKE \"*Schmidt*\""; engineerExtent.setFilter( predicate ); while (engineerExtent.hasNext() ) { System.out.println( engineerExtent.next() ); } OQL: Object Query Language Klasse OQLQuery Konstruktoren: OQLQuery() OQLQuery(String query) Methoden: create(String predicate) execute() OQL Syntax an SQL angelehnt: Definitionen DEFINE EXTENT <Extent> FOR <Klassenname> Selektion: SELECT <VarName> FROM <Extent> AS <VarName> WHERE <Bedingung> Navigation: SELECT <VarName.Attribut.Attribut....> FROM <Extent> AS <VarName> WHERE <Bedingung> Bedingungen Vergleiche für numerische Werte: =, >=, >, <=, < für Zeichenketten: =, LIKE (+ regulärem Ausdruck) Boolesche Operationen: AND, OR, NOT Beispiel (1) db.open("FastObjects://LOCAL/ToolsBase", Database.OPEN_READ_WRITE ); Transaction txn = new Transaction( toolsBase ); txn.begin(); // Here is the OQL string for the query . . . String queryString = "SELECT c FROM ToolkitExtent AS c " + "WHERE c.year_ = 1997"; // create a new query object . . . OQLQuery query = new OQLQuery( queryString ); // perform the query . . . Object result = query.execute(); // evaluate the result . . . Beispiel (2) if ( result instanceof CollectionOfObject ) { long n = ((CollectionOfObject) result).size(); System.out.println( "found " + n + " objects" ); Iterator iter = ((CollectionOfObject) result).iterator(); while ( iter.hasNext() ) { Object obj = iter.next(); System.out.println( obj.toString() ); } } // no need to save anything . . . txn.abort(); // close the database . . . toolsBase.close() Anfragen mit Parametern Kennzeichung von formalen Parametern in Anfragezeichenketten durch spezielle Namen $1, $2, $3, ... Methode zum Binden von Aktualparametern Query.bind(String parameter, ...) Beispiel // . . . OQLQuery query = new OQLQuery( txn ); // The toolkits managed by . . . query.create( "SELECT c FROM ToolkitExtent AS c, " + "c.managers_ AS d " + "WHERE d.indexName_ = $1" ); // . . . Tom Avery String manager = "Avery, Tom"; query.bind( manager ); Object resultObj = query.execute(); // . . . Zusammenfassung, Kernpunkte Überblick über den ODMG-Standard Object Definition Language = Java Object Manipulation Language Klassen: Database, Transaction, Extent, Query Object Query Language Was kommt beim nächsten Mal? Fortsetzung OQL Schema-Versionierung