 
                                Kapitel 6
Dr. Brigitte Mathiak
Anbindung an Anwendungen
Lernziele
• Das grundsätzlichen Problem bei der Kopplung von
objektorientierten Programmiersprachen mit relationalen
Datenbanken kennenzulernen
• Konzepte zur Anbindung von Datenbanken an Applikationen
• Selbst einfache Datenbankanbindungen programmieren zu
können
• Die grundlegende Funktionsweise von Persistenz
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
2
Impedance Mismatch zwischen OO und RM
Ein Objekt wird definiert durch:
• Identität
• Zustand
• Verhalten
• Kapselung
Eine Relation enthält Aussagen mit dem Wahrheitswert TRUE.
Beispielsweise: Es gibt einen PROFESSOR namens Sokrates,
dieser hat den RANG C4 und arbeitet im RAUM 226.
Beides ist nicht trivial kompatibel. Warum?
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
3
Impedance Mismatch zwischen OO und RM (2)
Struktur:
• Dieses Problem haben wir bereits in Kapitel 3 kennengelernt,
um von UML ins Relationenmodell zu kommen
• RM hat keine Vererbung, kein Verhalten, keine 1-zu-n oder gar
n-zu-n Beziehungen
Identität:
• Tupel haben von sich aus keine eindeutige Identität.
Datenkapselung:
• Objekte können selbst bestimmen wie sie verändert werden
Arbeitsweise:
• Relationen arbeiten global transaktionsbasiert
• Objekte sind untereinander vernetzt
Ergebnismenge:
• SQL-Anfragen liefern (Multi-)Mengen, keine Objekte
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
4
Die gute Nachricht
Alle diese Probleme sind im Einzelfall lösbar.
Die schlechte Nachricht
Entweder man muss Einschränkungen bei den Objekten
hinnehmen, die persistent sein sollen, oder es wird sehr
kompliziert und/oder unperformant.
(Oder man nimmt eine nicht-relationale Datenbank.)
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
5
Struktur einer OCCI Anwendung
Quellcode
(benutzt OCCI API und
Klassen)
C++ Compiler
OCCI Header
occi.h
•occiCommon.h
•occiControl.h
•occiData.h
•occiObjects.h
Linker
OCCI API header
Von OTT generierte C++
Header
Von OTT generierte C++
Implementierungen
OCCI Bibliothek
(statisch .lib oder
dynamisch .dll)
OCCI Bibliothek
•libocci.so/libocci.a/oraocci9.dll
Anwendung
Oracle C++ Call Interface(OCCI)
6
OCCI – Klassenstruktur
Environment
Create
Create
Create
ConnectionPool
Get
Get
MetaData
Connection
Get
StatelessConnection
Pool
Create
Statement
Get
Execute
ResultSet
Oracle C++ Call Interface(OCCI)
7
Schritt 1 – Eine Verbindung aufbauen
#include "DatabaseConnection.h";
…
try {
Environment* env = Environment::createEnvironment();
Connection* con = env->createConnection(user, password,
connectionString);
cout << "Connection success!" << endl;;
}
catch(SQLException &e) {
cout << "Connection failed!" << endl;
cout << e.what();
}
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
8
Schritt 2 – Etwas ausführen
try {
Statement *stmt = con->createStatement("INSERT INTO
hören VALUES (:1, :2)");
stmt->setInt(1, 26120);
stmt->setInt(2, 5001);
stmt->executeUpdate();
con->terminateStatement(stmt);
}
catch(SQLException &e) {
cout << "Exception thrown for INSERT" << endl;
cout << e.what() << endl;
}
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
9
Schritt 3 – Etwas auslesen
Statement stmt =
con->createStatement("SELECT PersNr, Boss FROM
Assistenten");
stmt->executeQuery();
ResultSet rset = stmt->getResultSet();
while (rset->next()) {
cout << " PersNr: " << rset->getInt(1) << "
"
<< " Boss: " << rset->getInt(2) << endl;
count++;
}
stmt->closeResultSet(rset);
con->terminateStatement(stmt);
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
10
Schritt 4 – Verbindung kappen
env->terminateConnection(con);
Environment::terminateEnvironment(env);
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
11
Schritt 5 - Errorhandling
try {…}
catch(SQLException &e) {
int errno = oraex->getErrorCode();
// die ORA nummer, http://www.ora-error.com/
string errmsg = oraex->getMessage();
//Die Nachricht zum Fehler
cout << ex.what() << endl;
//
// echte Fehlerbehandlung nicht vergessen …
}
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
12
Nachteile von Treibern
• Kein Syntax-Check des SQL-Statements
• Es kann nicht über Statement-Grenzen hinweg optimiert
werden.
• Es werden keine Objekte abgespeichert, sondern nur
simple Types (kann mit OTT umgangen werden)
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
13
Spracheinbettung (z.B. SQLJ)
• Beispiel:
/*
EXEC SQL
DELETE FROM emp
WHERE CURRENT OF emp_cursor;
sqlstm.stmt = “DELETE FROM EMP WHERE ROWID=:b1”;
sqlstm.iters = (unsigned long)1;
sqlstm.offset = (unsigned short)193;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)0;
sqlcex(&sqlctx, &sqlstm, &sqlfpn);
*/
• Spracheinbettungen und 4GL-Sprachen bieten eine bessere Integration,
weil das SQL direkt im Quellcode steht
• Ein Präprozessor übersetzt die eingebettete Befehle und fängt damit auch
Syntax-Fehler ab
• Weiterer Vorteil: Variablen können besser eingesetzt werden
Hauptnachteil:
• Geringe Unterstützung von anderen Produkten, da Spracheinbettungen als
altmodisch gelten
• Die Sprache selbst wird verändert, dies kann
• zu Inkompatibilitäten mit anderen Präprozessoren führen
• Debugging deutlich schwieriger machen
Fazit: Nicht mehr state-of-the-art
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
14
Persistenzframeworks – Object Relational Mapper (ORM)
• Grundidee: Transparente Persistenz von Objekten durch
Mapping zwischen Objekten und Relationen
• Vorgehen: Der Zustand bestimmte Objekte wird vom
Framework in der Datenbank festgehalten
• Vorteil: Der Programmierer kann mit den Objekten normal
arbeiten
• Weiterer Vorteil: Das Mapping ist nicht mehr implizit in der
Geschäftslogik „versteckt“, sondern wird explizit angegeben
• Netter Nebeneffekt: Die Aufteilung in Domänenklassen, die
persistiert werden, und in andere Klassen entspricht dem MVCProgrammierparadigma
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
15
ORM (Beispiel Hibernate)
• Das Modell wird in Domänenklassen
festgehalten (EJBs)
• Der Zugriff auf die EJBs erfolgt von
Applikationsseite aus über DAOs
(Data Access Objects) zur Entkopplung
• Hibernate selbst greift auf die
Domänenklassen per Reflection zu
• Das Mapping zwischen Objekten und
Datenbank wird durch XML-Dateien
festgelegt (oder Annotations)
• Der Zugriff auf die Datenbank geschieht per JDBC
• Die Konfiguration sowohl des Datenbankzugriffs als auch des
Verhaltens von Hibernate wird zentral verwaltet
http://www.hibernate.org/hib_docs/v3/reference/en/html/architecture.html
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
16
ORM (Beispiel Hibernate; Domänenklasse)
Professoren
• Beispiel einer Domänenklasse:
PersNr
Name
Rang
Raum
2125
Sokrates
C4
226
2126
Russel
C4
232
// Markiert die Klasse als persistierbar
@Entity
// Der Default Tabellenname wäre PROFESSOR
@Table ( name = “Professoren“)
public class Professor {
@Id @GeneratedValue
Long PersNr; // Jede Klasse sollte eine ID haben
String Name;
String Rang;
Long Raum;
// leerer public Konstruktur ist notwendig für Entities
public Professoren(){};
/* getter und setter … */
}
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
17
ORM (Beispiel Hibernate; DAO)
Professoren
• Beispiel eines DAOs:
•
Hinweis:
getHibernateTemplate() kommt aus DAO
PersNr
Name
Rang
Raum
2125
Sokrates
C4
226
2126
Russel
C4
232
public class ProfessorDAOHibernate extends DAO
implements ProfessorDAO{
public void saveProfessor(Professor toSave){
getHibernateTemplate().saveOrUpdate(toSave);
}
public Professor getProfessorByPersNr(int PersNr){
return (Professor) getHibernateTemplate().
get(Professor.class, PersNr);
}
public void deleteProfessor(Professor toDelete){
getHibernateTemplate().delete(toDelete);
}
}
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
18
ORM (Beispiel Hibernate; weiterführend)
• Komplexe Anfragen können sowohl über die Hibernate eigene
Anfragesprache HQL als auch SQL gemacht werden
• Es werden mehrere Methoden angeboten 1-zu-n und n-zu-n
Beziehungen in der Datenbank darzustellen
• Sowohl andere Objekte als auch Collections werden als Attribute
akzeptiert
• Allerdings muss ein Mapping explizit angegeben werden
• Es gibt viele Tools, die den Einstieg in Hibernate erleichtern
und viele der benötigten Dateien automatisch generieren
• Domänenklassen können aus der Datenbank erzeugt werden
• Standard DAOs können generiert werden
• Das Datenbankschema kann aus den Domänenklassen generiert
werden
• Etc.
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
19
Nachteile ORM
• Relativ großer Overhead für kleine Projekte
• Alles muss in Objekten gespeichert werden
• Gerade am Anfang ist einem nicht ganz klar, was tatsächlich
passiert
• Benötigt Introspection, kann daher nicht für alte
Programmiersprachen, wie etwa C++ umgesetzt werden
Vorteile ORM
• Weniger Quellcode in der Persistenzschicht (-> weniger Fehler)
• Viele Konfigurationsoptionen um z.B. die Performanz zu
optimieren
• Hervorragende Umsetzung von loser Kopplung zwischen den
Komponenten Modell und Persistenz innerhalb eines
Programms
• Im Moment der State-of-the-Art daher stete Weiterentwicklung
und neue Features
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
20
Fazit
• Es gibt verschiedene Möglichkeiten Anwendungen an eine
relationale Datenbank anzubinden
• Das Hauptproblem ist dabei der Impedance Mismatch zwischen
objektorientierter und relationaler Welt
• Der einfachste Weg ist es direkt per Treiber mit der Datenbank
zu kommunizieren
• Eine etwas bessere Integration bieten Spracheinbettungen
• OR-Mapper erlauben es das Mapping zwischen den Objekten
und der Datenbank festzulegen. So kann der Programmierer
direkt mit den Objekten arbeiten.
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
21