Objektorientierte Datenbank db4objects Herunterladen: von www.db4objects.de (für Java) Es kommt db4o-7.4-java.zip (13.1.2008), 32 MB gross. Installieren: Verzeichnis db4o anlegen, alles extrahieren. Klassenpfad anpassen: . C:\db4o\db4o-7.4\lib\db4o-7.4.71.12224-java5.jar Testen: entsprechend der Dokumentation: - Klasse Pilot compilieren, in ...\db4o-7.2\doc\tutorial\src\com\db4o\f1\chapter1 - Programm FirstSteps.java compilieren (liegt auch dort), muss Packages und Klassen finden - nach dem Programmstart liegt die erzeugte OODB in ...\db4o-7.2\doc\tutorial\src oder untenstehendes Programmbeispiel Programmaufbau: Imports für Dateiverarbeitung, import java.io.File; Datenbankoperationen, import com.db4o.Db4o; Ergebnismengen, import com.db4o.ObjectContainer; Mengensuche, import com.db4o.ObjectSet; Dienste import com.db4o.f1.Util; Klasse definieren: z.B. Person public class Person { private String _name; private int _age; public Person(String name,int age) { _name = name; _age = age; } public int getAge() { return _age; } public void setAge(int value) { _age = value; } … } Datenbank anlegen: new File(“Pfad-Name“).delete() Datenbank öffnen: ObjectContainer db=Db4o.openFile(“Pfad-Name“); Objekte eintragen: db.store(new Person("Gandhi",79)); db.store(new Person("Lincoln",56)); nach allen fragen ObjectSet result1 = (ObjectSet) db.queryByExample(new Person()); listResult(result1); ///get all nach Gandhi fragen Person p2 = new Person(); p2.setName("Gandhi"); ObjectSet result2 = (ObjectSet) db.queryByExample(p2); listResult(result2); nach 56 fragen Person p3 = new Person(); p3.setAge(56); ObjectSet result3 = (ObjectSet) db.queryByExample(p3); listResult(result3); Gandhis ID ermitteln und dann löschen Person p4 = new Person(); p4.setName("Gandhi"); ObjectSet result4 = (ObjectSet) db.queryByExample(p4); Person found=(Person)result4.next(); db.delete(found); // remove the Gandhi object Datenbank schliessen: db.close(); (Transaktionsende) Einzelaufgaben: neues Verzeichnis für die neue Anwendung anlegen classpath anpassen Datenbank anlegen Klasse definieren Objekt eintragen alle Objekte lesen bestimmtes Objekt lesen Objekt löschen Datenbank schliessen, löschen Windows-Einbettung/Java-Panel Klasse „person“ anlegen, interessanterweise (name, pin, konto, adresse (str, nr, plz, ort), alter, foto) Oberflächenwerkzeug (Object Manager, aber commercial) eigene SQL-Realisierung (flache Klasse) wichtig -> Arbeit mit bestehender SQL-Datenbank grosse Objekte (Bilder, Töne, Filme) wo sind Kapselung, Vererbung, Polymorphie ? wo sind Typkonstruktoren ? wichtige Datenbankeigenschaften fehlen: Sprache SQL o.ä. DDL = Java-Klassendefinition DML = Java-Programmiersprache DCL fehlt Prozeduralität = Java-Programmiersprache wichtig -> Benutzerverwaltung, Feinheit der geschützten Objekte Volle Transaktionen (4 levels) Daten sind nur in Dateien des Dateisystems gespeichert wichtig -> Dienstprogramme (save/restore) Interaktive Oberfläche (ohne Programmierung) Objektorientierte Datenbanksysteme sind Programmiersprachenerweiterungen, Datenbanken aber führen ein Eigenleben. Sie sind für die jeweilige Organisation zentral und wichtiger als die Oberflächen. Architektur, Benutzungsarten: 1) Programm mit eigenen Daten nur während des Programmlaufs einmalig verfügbar 2) für mehrere Programmläufe verfügbar meist für eine User, gleiche Klassendefinition für alle Programmläufe Anwendungsgebiet: embedded databases 3) mehrere Programmläufe und mehrere User Client/Server-Betrieb Start/Stopp notwendig SW-Struktur der Anwendungsprogramme: 1) 1 Programm mit Klassen-(Schema-)-Definition einfacher bei der Compilation 2) 2 Programme: eins für die Klassen-(Schema-)-Definition, eins für den Ablauf (Main) mit package, zweimalige Compilation Afragekonzepte: (kommt noch) Datenmodellierung: 1) relationale Konzepte z.B. person (name, pin, konto) Tabelle Spalte Zeile -> -> -> Klasse Attribut Objekt 2) objektorientierte Konzepte Tiefe -> Subklasse Funktionen -> Methoden z.B. person (name, pin, konto, adresse (str, nr, plz, ort), alter, foto) name text pin integer konto float adresse Unterklasse alter Funktion foto grosser Wert alter: j = jahr(HEUTE()) – jahr(geburtsdatum) if dayofyear(HEUTE()) <= dayofyear(geburtsdatum) then j--; allgemeine Objektdefinition: class c inherit ... properties ... operations ... initializations ... default ... constraints ... triggers ... Sprache: SQL-ähnlich, mit Punktnotation z.B. ... Programmbeispiel: import java.io.File; import com.db4o.Db4o; import com.db4o.ObjectContainer; import com.db4o.ObjectSet; public class Personenspeicher { public static class Person { private String _name; private int _age; public Person() {} public Person(String name,int age) { _name = name; _age = age; } public int getAge() { return _age; } public void setAge(int value) { _age = value; } public String getName() { return _name; } public void setName(String value) { _name = value; } public String toString() { return "[" + _name + ";" + _age + "]"; } } public static void main(String[] args) { new File("C:/vorlesung.yap").delete(); //reset the database ObjectContainer db=Db4o.openFile("C:/vorlesung.yap"); try { // eintragen db.store(new Person("Gandhi",79)); db.store(new Person("Lincoln",56)); // nach allen fragen ObjectSet result1 = (ObjectSet) db.queryByExample(new Person()); listResult(result1); ///get all // nach Gandhi fragen Person p2 = new Person(); p2.setName("Gandhi"); ObjectSet result2 = (ObjectSet) db.queryByExample(p2); listResult(result2); // nach 56 fragen Person p3 = new Person(); p3.setAge(56); ObjectSet result3 = (ObjectSet) db.queryByExample(p3); listResult(result3); // Gandhis ID ermitteln und dann löschen Person p4 = new Person(); p4.setName("Gandhi"); ObjectSet result4 = (ObjectSet) db.queryByExample(p4); Person found=(Person)result4.next(); db.delete(found); // remove the Gandhi object ObjectSet result5 = (ObjectSet) db.queryByExample(new Person()); listResult(result5); ///get all } finally { db.close(); } } public static void listResult(ObjectSet result) { while (result.hasNext()) { System.out.println(result.next()); } System.out.println("-------------------------"); } }