Preparation API

Aus Cismet Wiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Einleitung

Die Preparation API ist eine Klasse zur Vorbereitung und Ausführung von SQL Statements im Rahmen der Cids Software. Der Statement Container enthält entsprechend alle statischen und pattern basierten SQL Statements, die von der Cids Software ausgeführt werden können.

Arbeitsweise

In Preparation API werden alle Statements in Form von JAVA HashMaps verwaltet. Diese Implementierung hat den Vorteil in Laufzeit O(1) die Standartoperationen (Einfügen, Löschen, Suchen) durchführen zu können. Ausserdem werden die Statements ihrer Arbeitsweise nach in zwei Kategorien eingeteilt:

  • static Statements sind solche, die bereits eine vollständige ausführbare SQL Abfrage darstellen.
  • pattern Statements sind solche, die zusätliche Informationen benötigen, bevor sie zu einer ausführbaren SQL Abfrage werden (etwa den Name eines bestimmten Objekts in einer SQL Datenbank).

Pattern Statements können durch Methoden der Klasse Preparation API zu static Statements gemacht werden, wodurch sie dann ausführbar sind.

Vorbereitung der Statements

Die eigentliche Vorbereitung der Statements läuft in mehreren Schritten ab:

Initialisierung der HashMaps für statische/pattern basierte Statements

Hierbei werden in der vom Konstruktor aufgerufenen Methode init() Instanzen der Klasse HashMap initialisiert. Es werden insgesamt vier HashMaps benötigt:

  1. staticStatements, für noch nicht vorbereitete statische Statements
  2. patternStatements, für noch nicht vorbereitete pattern basierte Statements
  3. staticPreparedStatements, für vorbereitete statische Statements, die vom Programm benutzt werden können
  4. patternPreparedStatements, für vorbereitete pattern basierte Statements, die vom Programm verwendet werden können

Die initialisierten HashMaps akzeptieren Strings als Schlüssel um auf gespeicherte Objekte zuzugreifen. Noch nicht vorbereitete Statements sind lediglich String Einträge in der jeweiligen Tabelle, während vorbereitete unter Benutzung der Klasse PreparedStatement verwaltet und gespeichert werden.

Füllen der HashMaps und vorbereiten der Statements

Während die Maps für nicht vorbereitete Statements bereits im Konstruktor durch die Methode buildMaps() mit allen in der Klasse Statement Container zur Verfügung stehenden SQL Anfragen gefüllt werden, werden die beiden Maps, die die vorbereiteten Statements enthalten nur mit denjenigen Anfragen gefüllt, die auch tatsächlich durch den Aufruf einer 'prepare' Methode vorbereitet wurden.

Die aufrufbaren prepare Methoden und deren Funktionen sind im einzelnen:

  • preparePreparable():

Überprüft die HashMaps, ob in ihnen Statements enthalten sind, die vorbereitet werden können. Dies sind alle Einträge in der staticStatements Map, sowie alle Statements in der patternStatements Map, die nicht durch "_DYNAMIC_" qualifiziert sind.

  • preparePreaparablePatterns():

Wie preparePreparable, jedoch werden hier nur diejenigen Statements berücksichtigt, die in der patternStatement HashMap stehen.

  • prepareStatement(String key):

Bereitet ein durch einen String (Schlüssel für eine HashMap) eindeutig bestimmtes Statement vor. Die Methode gibt ein String Objekt zurück, welches den Schlüssel repräsentiert, unter welchem das Statement in die entsprechende HashMap gespeichert wurde.

  • prepareStatement(String key, Object... args):

Arbeitet wie prepareStatement(String key) falls keine Argumente übergeben werden. Falls genau so viele Argumente übergeben werden, wie das Statement Platzhalter enthält, wird ein static 'prepared Statement' generiert. Werden so viele Argumente übergeben, wie das Statement "_DYNAMIC_" Platzhalter enthält, wird ein pattern prepared Statement erzeugt. Auch hier wird wieder ein String Objekt zurück gegeben, welches das fertige Statement in der HashMap repräsentiert. Da der Schlüssel von den übergeben Argumenten abhängig ist, sollte er abgespeichert werden, um später das speziell vorbereitete Statement wiederfinden und ausführen zu können.

  • prepareStatement(String key, HashMap<Integer, Object> args):

Arbeitet wie prepareStatement(String key, Object... args), nur dass hier die Werte für Parameter in einer HashMap hinterlegt sind. Die Schlüssel sollen hier die sein, die zusammen mit dem Statement im StatementContainer definiert wurden.

  • prepareStatics():

Bereitet alle statischen Statements auf einmal vor.

Ausführen von Statements

Da sich Statements nicht nur durch ihre Einteilung in static und pattern unterscheiden, sondern auch in ihrem Rückgabewert nachdem sie von einer SQL Datenbank ausgewertet wurden, existieren mehrere Methoden, die das Ausführen der definierten Methoden möglich machen.

Die folgenden Methoden haben als Rückgabewert 'ResultSet', womit eine Rückgabe Tabelle beschrieben wird:

  • executeQuery(String key):

Führt ein vorher vorbereitetes, statisches Statement aus, das eindeutig durch 'key' repräsentiert wird. Es werden auch pattern Statements ausgeführt, sofern sie bereits mit allen Argumenten versorgt wurden.

  • executeQuery(String key, Object... args):

Führt bereits vorbereitete Statements aus. Falls keine Argumente übergeben werden arbeitet die Methode wie executeQuery(String key). Das Hauptanwendungsgebiet ist jedoch das Ausführen von pattern Statements, die mit Argumenten versorgt werden. Diese erhalten sie aus der Variablen args, welche ein Array oder eine Liste von Object sein kann, die die Argumente enthält. Die Reihenfolge in der die Argumente angegeben werden, ist absolut entscheidend.

  • executeQuery(String key, HashMap args):

Arbeitet wie oben, jedoch können die Argumente durch eine HashMap an das Statement übergeben werden. Um sich nicht immer Gedanken um die benutzten keys machen zu müssen, unter denen die Argumente eines Statements in der HashMap gespeichert werden, definiert jedes Statement Schlüssel, mit denen man eine gültige HashMap aufbauen kann.


Die folgenden Methoden arbeiten jeweils wie ihr Äquivalent für queries. Der Unterschied besteht darin, dass diese Methoden statt einer Rückgabemenge (Tabelle) einen Integer als Exit Status ausgeben:

  • executeUpdate(String key)
  • executeUpdate(String key, Object... args)
  • executeUpdate(String key, HashMap args)

Entfernen vorbereiteter Statements

Sind in den beiden preparedStatement Tabellen Einträge vorhanden, die wieder entfernt werden sollen, so kann dies durch die Benutzung der folgenden Methoden geschehen:

  • releaseAll()

Entfernt alle Einträge aus den HashMaps 'patternPreparedStatements' und 'staticPreparedStatements'.

  • releasePatterns()

Entfernt alle Einträge aus der HashMap 'patternPreparedStatements'

  • releaseStatic()

Entfernt alle Einträge aus der HashMap 'staticPreparedStatements'

  • releaseStatement(String key)

Entfernt das Statement mit dem Schlüssel key aus der HashMap, in der es steht.

Zusätliche Klassen

DefaultConnectionProvider

Eine Klasse, die das JAVA Interface ConnectionProvider implementiert. Sie stellt der Klasse PreparationAPI eine JDBC Verbindung zur Verfügung.

Konstruktoren

  • DefaultConnectionProvider()

Default Konstruktor, der die default Einstellungen läd, wie sie in der Properties-Datei de.cismet.cids.sql.resource.sqlConnection.properties definiert sind.

  • DefaultConnectionProvider(Properties connectionProperties)

Konstruktor, der eine neue Instanz der Klasse generiert, indem er auf die übergebenen Properties zurückgreift.

Methoden

  • getConnection()

Benutzt die Klasse java.sql.DriverManager, um eine neue Verbindung mit Hilfe der gesetzten Properties zu erzeugen.

Persönliche Werkzeuge