Mammut Framework

Entwicklerhandbuch :: Database Abstraction Layer :: Einführung

DAL: Einführung

DAL: Übersicht DAL: Hauptklassen

Einführung

Der Datenbank-Abstraktionslayer (Database Abstraction Layer, DAL) des Mammut Framework erlaubt eine vom verwendeten Datenbanksystem unabhängige Programmierung. Somit wird eine Portierung des Codes zwischen unterschiedlichen Implementierungen des SQL-Standards erleichtert.

Für die meisten Aufgaben bietet das Framework sowohl klassische SQL-Methoden als auch spezielle objektbasierende bzw. klassenbasierende Methoden zum Arbeiten mit der Datenbank an.

Unterstützte Datenbanksysteme
Name Unterstützte Version Status
MariaDB - beta
MySQL(+Cluster) 4.1 und neuer rc(/beta)
MSSQL 8.0 (2000) und neuer rc
IBM DB2 - geplant
PostGre 8.0 and above rc
Oracle - geplant
 
Unterstützte Datenbankschnittstellen
Name Unterstützte Version Status
PDO mysql, mssql, firebird, postgre rc/alpha/geplant/beta
MySQL 4.1 und neuer rc
MySQLi 4.1 und neuer rc
MSSQL 8.0 (2000) und neuer beta
PostGre 8.0 and above beta

Ein kurzes Beispiel

Im Folgenden wollen wir uns zu einer lokalen MySQL-Datenbank verbinden. Diese ist auf der Instanz unter dem Namen "demo" angelegt, und ein Benutzer "user" hat mit dem Passwort "passwd" volle Zugriffsrechte auf diese. Das Framework ist im Unterverzeichnis "lib" abgespeichert.

Zuerst einmal wollen wir eine Verbindung zum Datenbankserver aufbauen. Hierzu benötigen wir den passenden Datenquellennamen (DSN):

mysqli:localhost/demo

Mit diesem und den Benutzerdaten können wir uns nun zur Datenbank verbinden:

// Mammut Framework laden
set_include_path(get_include_path().PATH_SEPARATOR.'./lib');
define('USE_MAMMUT',true);
require('Mammut/lib.mammut.php');

// Zur Übersichtlichkeit importieren wir die Klassen in den lokalen Namensraum use Mammut\DB\DB; use Mammut\DB\TableInfo; use Mammut\DB\ColumnInfo; // nun erstellen wir die neue Datenbankinstanz mithilfe der Klasse Mammut\DB\DB $instance = DB::newInstance('mysqli:localhost/demo', 'user', 'passwd');

Nun haben wir ein neues Objekt der entsprechenden Datenbankverbindung in $instance. Im Falle eines Fehlers reagiert diese Klasse mit einer entsprechenden Ausnahme, die entsprechend abgefangen werden kann.

Nun wollen wir eine einfache Tabelle "demotable" mit zwei Spalten a und b erstellen, wobei a mit Integerwerten den Primärschlüssel darstellt und b eine Zeichenkette mit maximal 20 Zeichen. Hierzu verwenden wir die Beschreibungsklassen TableInfo und ColumnInfo. Falls diese Tabelle existieren sollte, löschen wir diese (!!!).

// Infoobjekt für die Tabellenstruktur erstellen
$info = new TableInfo('demotable');
$info->addColumn(new ColumnInfo('a', ColumnInfo::TYPE_INT, -1, array(ColumnInfo::P_AUTONUM));
$info->addColumn(new ColumnInfo('b', ColumnInfo::TYPE_VCHAR, 20);
$info->setPrimary(array('a'));

// Wenn vorhanden, alte Tabelle löschen
if ($instance->tableExists('demotable'))
    $instance->dropTable('demotable');

// Nun erstellen wir die neue Tabelle
$instance->createTable($info);

Der nächste Schritt ist nun, ein paar Daten in die Tabelle einzutragen. Theoretisch wäre dies direkt mit den üblichen "INSERT INTO..."-SQL-Befehlen möglich, jedoch unterstützt der DAL auch alternative Varianten, auf welche wir hier eingehen wollen. Hierzu benötigen wir die Zeilen entweder als Objekt oder als Feld, wobei das Feld "a" wegen der automatischen Generierung der Werte entweder nicht angegeben oder ignoriert werden muss.

// Tabellenobjekt von Datenbank erstellen
$table = $instance->table('demotable');

// Daten definieren
$row = array('b' => 'Hallo');
$table->insert($row);

// Diesmal ignorieren wir den Schlüssel 'a'
$row = array('a' => 0, 'b' => 'Hallo');
$table->insert($row, array('a'));

// Dies ist auch mit Objekten möglich
$row = new stdClass();
$row->b = 'Welt';
$table->insert($row);

// Auf ähliche Weise kann auch ein Datensatz gelöscht werden
$row = new stdClass();
$row->b = 'Welt';
$table->delete($row);

Abfragen können entweder in SQL oder in einer Methodenvariante gestellt werden. Die Methodenvariate hat den Vorteil, dass man hierbei nicht darauf achten muss welchen Dialekt der Datenbankserver unterstützt.

// SQL-Variante mit Ergebnissen in Feldern
$result = $instance->query('SELECT * FROM demotable');
while ($row = $result->fetchArray())
   echo $row['b'].'<br/>';
$result->close();

// Methoden-Variante mit Ergebnissen in Objekten
$result = $table->select();
while ($row = $result->fetchObject())
   echo $row->b.'<br/>';
$result->close();
Dies sollte nun eine kurze Übersicht über die Arbeit mit dem DAL liefern. Genauere Beschreibungen und weitere Möglichkeiten finden sich in der Beschreibung der Hauptklassen.