Datenbanken
Allgemeines
Der Datenbank-Layer ders Frameworks wurde konzipiert, um portable Anwendungen zu entwickeln, die auf möglichst vielen SQL-Implementierungen ohne oder nur mit geringen Anpassungen lauffähig sind, ohne hierbei einen all zu großen Leistungsverlust zu erzeugen.
Grundlegend gibt es drei verschiedene Arten, wie Zugriffe durchgeführt werden können:
- Über direktes SQL über einheitliche Methodennamen. Keine weitere Abstraktion ist hierbei vorhanden, der Entwickler muss sich selbst um die korrekte Syntax kümmern. Hohe Geschwindigkeit.
- Über SQL-Builder-Klassen in Mammut\DB\Sql. Die SQL-Befehle werden mit entsprechenden Hilfsklassen erstellt und vom Framework in passenden SQL-Code übersetzt. Einfachere Verwendung, aber etwas langsamer.
- Über entsprechende programmatische Methoden und Objekte, welche einen eher funktionalen Zugriff auf die Datenbank bieten. Diese ersetzten die Erstellung von SQL und können Standardaufgaben ohne großes Performanceprobleme erledigen, sind allerdings weit weniger flexibel als die anderen Methoden (beschränken sich meist auf einfache CRUD-Funktionalität).
Unterstützte Systeme
Folgende Datenbanksysteme werden derzeit unterstützt (jeweils per nativer Schnittstelle und PDO):
- MySQL/MariaDB ab 5.1 (produktiv, mysqli-Extension)
- MS SQLServer ab 2005(produktiv, sqlsrv&mssql-Extension)
- PostgreSQL ab 9.1 (beta)
- Oracle ab 11g lesend (alpha)
- DB2 ab 10.0 (alpha)
- Tests: SQLite 3.x (alpha)
Verbindungsaufbau
Nach dem Laden des Frameworks erhält man eine neue Datenbankverbindung durch folgenden Code:
$this->con = \Mammut\DB\DB::newInstance([DSN], [Benutzer], [Passwort]);
Der DataSourceName ist eine Art URL, welche die Datenbank angibt. Diese ist je nach Implementierung unterschied, Details finden sich meist in der Beschreibung der entsprechenden Datenbankklasse. Hier zwei Beispiele für MySQL und Microsoft SQLServer:
MySQL: 'mysqli:localhost/demodb' SQLServer: 'mssql:localhost/demodb' PostgreSQL: 'postgre:localhost/demodb'
Dieses Datenbankobjekt repräsentiert die Verbindung zur Datenbank und wird für alle weiteren Aufrufe benötigt.
Basisoperationen und Klassen
Mammt\DB\DB
Diese Klasse repräsentiert die Datenbankverbindung.
Folgende Methoden werden häufig benötigt:
- query($sql) : mixed
Sendet eine Abfrage unverändert an die Datenbank. Gibt ein Result-Object für Datenergebnisse zurück. - executeP($sql, array $param) : boolean|int
Sendet eine Abfrage als Prepared Statement unverändert an die Datenbank. Gibt ein den Erfolgsstatus oder die Menge der betroffenen Zeilen zurück. - prepare($sql) : Statement
Erstellt ein neues Prepared Statement auf Basis des SQL-Befehls. Dieser wird unverändert auf der Datenbank ausgeführt. Gibt ein entsprechndes Statement-Objekt für die Ausführung zurück. - getInsertId() : int
Liefert die letzte automatisch generierte Nummer zurück.
(für AUTO_INCREMENT/SEQUENCE/...) - getDialect() : iDialect
Liefert das iDialect-Objekt zum entsprechend SQL-Dialekt der Datenbank. - escapeValue($value) : string
Wandelt einen Wert in einen SQL-fähigen String um - close() : void
Beendet die Serververbindung.
Mammut\DB\Result
Diese Klasse repräsentiert Ergebnisdaten.
Folgende Methoden werden häufig benötigt:
- getRowCount(): int
Liefert die Anzahl der Ergebnissätze zurück. - fetchRow(): array
Liefert den nächsten Datensatz als nummerisches Feld. - fetchArray(): array
Liefert den nächsten Datensatz als assoziatives Feld. - fetchObject($class = stdClass, $param = array()): object
Liefert den nächsten Datensatz als Objekt der Klasse $class. Optional werden die Parameter $param an den Konstruktor übergeben. - close(): void
Gibt die verwendeten Ressourcen wieder frei.
Alle fetch*-Methoden stehen auch als fetch*List-Methode zur Verfügung, welche ein Feld aller entsprechden Datensätze zurückgibt.
Mammut\DB\Statement
Diese Klasse repräsentiert ein Prepared Statement. Die Klasse stellt identische Methoden wie ein Result zur Verfügung, um die Ergebnisdaten bereitzustellen. Hinzu kommen Methoden zur Ausführung des Statements.
Folgende Methoden werden zusätzlich häufig benötigt:
- execute($param = array()): void
Führt das Statement mit den entsprechenden Parametern aus.
Objektbasierender Zugriff
Objektbasierende Methoden stellen die Datenbank in einer eher OOP-typischen Weise zur Verfügung.
Mammt\DB\DB
Folgende Methoden werden häufig benötigt:
- tableExits($name): boolean
Prüft, ob die entsprechende Tabelle vorhanden ist. - table($name): Table
Liefert das entsprechende Tabellenobjekt zurück.
Mammut\DB\Table
Repräsentiert eine Tablle der Datenbank.
$limiter entspricht einem Feld, welches als Key=>Value die ensprechenden Felder und die hierzu entsprechenden Werte beschreibt (WHERE Feld=Wert).
Folgende Methoden werden häufig benötigt:
- insert($mixed): void
Schreibt den Datensatz in die Tabelle. Die Daten sollten als Objekt mit Attribut=Feld oder als assoziatives Feld (Feldname => Wert) vorliegen. - getRow($limiter = false): array
Liefert die erste passende Zeile der Tabelle als nummeriertes Feld zurück. - getArray($limiter = false): array
Liefert die erste passende Zeile der Tabelle als assoziatives Feld zurück. - getObject($limiter = false): object
Liefert die erste passende Zeile als Objekt zurück. - update($data, $limiter): void
Aktuallisiert die pasenden Datensätze mit den Felddaten aus $data (Daten entsprechend insert()). - delete($limiter = false): void
Löscht die entsprechenden Daten aus der Tabelle. - size(): int
Liefert die Anzahl der Datensätze in der Tabelle.
Beispiele
Insert:
$data = new \stdClass(); $data->row1 = 'ABC'; $data->row2 = new \DateTime('1998-12-12'); $db->table('mytable')->insert($data);
SQL-Builder
Um an die jeweilige Datenbank angepasste SQL-Befehle zu erstellen stehen Entwicklern einige Hilfsklassen zur Verfügung. All diese Klassen beschreiben entsprechende SQL-Abfragen, welche durch einen Aufruf der getSql($dialect)-Methode den passenden SQL-String zurückgeben. Ein entsprechendes iDialect-Objekt erhält man von der Datenbankverbindung.
Mammt\DB\DB
Folgende Methoden werden zusätzlich häufig benötigt:
- insert() : Insert
Liefert eine Insert-Instanz. - select(): Select
Liefert eine Select-Instanz. - update(): Update
Liefert eine Update-Instanz. - delete(): Delete
Liefert eine Delete-Instanz.
Mammut\DB\Sql\Insert
Repräsentiert ein INSERT-Statement.
Mammut\DB\Sql\Select
Repräsentiert ein SELECT-Statement.
Mammut\DB\Sql\Update
Repräsentiert ein UPDATE-Statement.
Mammut\DB\Sql\Delete
Repräsentiert ein DELETE-Statement.
Beispiele
Select:
$sql = $db->select()->from('table')->where('group' => 1)->limit(5); $result = $db->query($sql);
Delete:
$sql = $db->delete()->from('table')->where('id' => 1); $result = $db->query($sql);