objektorientierte datenbanken zbeim vorigen mal: yjava data objects zheute: yder object data...
TRANSCRIPT
Objektorientierte Datenbanken
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
Ralf Möller, FH-Wedel
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öglichDatenbasen bestehen aus einem Teil zur
Beschreibung der Klassen (Schema) und einem Teil zur Beschreibung der Instanzen
Beispiel
// declare a Database referenceDatabase 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.DMapKlasse com.poet.odmg.util.MapOfObjects
Persistenz
Persistenz durch ErreichbarkeitPersistenz 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 MyClassExtent 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 zugreifenDetails 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 OQLQueryKonstruktoren:
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 AveryString 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 OQLSchema-Versionierung