Objektorientierte Datenbanken zBeim vorigen Mal: yJava Data Objects zHeute: yDer Object Data Standard der ODMG-Group xKurz: ODMG-Standard yDie POET-Implementierung FastObjects (t7) zLernziele: yVergleich ODMG-Standard vs. JDO Ralf Möller, FH-Wedel
Object Data Standard: ODMG 3.0 zStandard für die Erzeugung und Verwaltung von persistenten Objekten (seit 1991 entwickelt) zEntwickelt von der Object Data Management Group yKonsortium vieler Firmen zUnterstützung verschiedener Programmiersprachen (Java, C++,...) zWir betrachten nur Java
ODMG 3.0 zObject Definition Language (ODL) yDeklarative Sprache zur Beschreibung von Struktur und Operationen von Objekten yPrinzipiell: neue Sprache yUmsetzung in Java möglich zObject Manipulation Language (OML) yProgrammiersprache zObject Query Language
Sprachanbindungen zODMG für Java yAnwendungsklassen = Java-Klassen + Enhancement ySpezielle Klassen für Collections
Packages zimport org.odmg.*; zimport com.poet.odmg.*;
Enhancement zDateien mit Klassendeklarationen müssen aufbereitet werden, damit Instanzen persistent werden können (Enhancement) zBeispiel: 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() zLogische Namen für Datenbasen: URL yAbbildung auf spezielle Dateinamen in Konfigurierungsdatei möglich zDatenbasen 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); zMethoden: 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 zInterface org.odmg.DMap zKlasse com.poet.odmg.util.MapOfObjects
Persistenz zPersistenz durch Erreichbarkeit zPersistenz durch Bindung von Instanzen an Namen (repräsentiert durch Zeichenketten) zAnonyme Persistenz
Bindungen von Instanzen an Namen zMethoden der Klasse Database: ybind(Object o, String name) xMyClass o = new MyClass(... ); xdb.bind(o, "test") ylookup(String name) xMyClass o = (MyClass) db.lookup("test") yunbind(String name) xdb.unbind("test")
Anonyme Persistenz zMethode der Klasse Database: ymakePersistent(Object o) ydeletePersistent(Object o) zZugriff auf anonyme Objekte über Klassen und Anfragesprache
Zugriff auf Objekte zZugriff über Klassen (Extents) zZugriff über Anfragesprache: yObject Query Language
Extents zExtents enthalten alle Instanzen einer Klasse zExtents werden vom System verwaltet zKonstruktor: yDatabase db; String className; yExtent ext = new Extent(db, className) zMethoden: yboolean hasNext() yObject next() yint size() yext.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 zExtents können "indiziert" werden, d.h. yes kann eine Ordnung definiert werden und yman kann mit quasi-konstantem Aufwand auf eine bestimmte Instanz zugreifen zDetails 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 zKlasse OQLQuery zKonstruktoren: yOQLQuery() yOQLQuery(String query) zMethoden: ycreate(String predicate) yexecute()
OQL zSyntax an SQL angelehnt: zDefinitionen yDEFINE EXTENT FOR zSelektion: ySELECT FROM AS WHERE zNavigation: ySELECT FROM AS WHERE
Bedingungen zVergleiche yfür numerische Werte: =, >=, >, <=, < yfür Zeichenketten: =, LIKE (+ regulärem Ausdruck) zBoolesche 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 zKennzeichung von formalen Parametern in Anfragezeichenketten durch spezielle Namen y$1, $2, $3,... zMethode zum Binden von Aktualparametern yQuery.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 zÜberblick über den ODMG-Standard yObject Definition Language = Java yObject Manipulation Language xKlassen: Database, Transaction, Extent, Query yObject Query Language
Was kommt beim nächsten Mal? zFortsetzung OQL zSchema-Versionierung