DAL: Einführung
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.
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 |
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.