ODMG-Standard, FastObjects

Werbung
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
Herunterladen