Statement Container Regeln

Aus Cismet Wiki

Wechseln zu: Navigation, Suche

Die Klasse StatementContainer fungiert als eine Art simple Datenbank für SQL Statements und deren Schlüssel und Parameter, die in Verbindung mit der Klasse PreparationAPI benutzt werden.

Regeln für das Erstellen neuer Anfragen

  1. Die Definition eines Statements besteht aus mindestens zwei Elementen: Dem Schlüssel und dem Wert. Der Schlüssel ist ein String, der einen eindeutigen Namen für ein Statement enthält. Der Wert ist ein String, der das SQL Statement selbst enthält.
  2. Um Mehrdeutigkeit und daraus resultierendes unerwünschtes Verhalten zu vermeiden, soll der Inhalt des Schlüssel-Strings gleich dem Schlüssel-String selbst sein.
  3. Der definierte Schlüssel und der zugehörige Wert sollen deklariert werden, indem man bei beiden den gleichen Identifier nutzt, mit der Ausnahme, dass die Deklaration des Wertes immer mit dem Suffix '_STMT' endet.
  4. Statements, denen keine zusätzlichen Parameter übergeben werden müssen, werden 'static' genannt. Diese sind durch Vorranstellen des Präfix 'STATIC_' zu deklarieren.
  5. Statements, bei denen zusätzliche Parameter übergeben werden müssen, werden 'pattern' genannt. Diese sind durch Vorranstellen des Präfix 'PATTERN_' zu deklarieren.
  6. Der Gültigkeitsbereich von Schlüsseln soll immer 'public' sein. Der Gültigkeitsbereich von Werten soll nicht definiert, und somit den Gültigkeitsbereich 'package local' erhalten.

Beispiel

Wir wollen das folgende SQL Statement in den Container eintragen:

 SELECT * FROM mySample WHERE name = ? 

Zunächst ist offensichtlich, dass das Statement mit einem Wert für den Namen versorgt werden muss, um ausführbar zu sein. Es ist also ein 'pattern' und so beginnen auch die zu deklarierenden Felder mit 'PATTERN_'. Als nächstes wollen wir den Namen 'MY_SAMPLE' für dieses Statement benutzen. Wir definieren den Schlüssel wie folgt:

 static final String PATTERN_MY_SAMPLE = "pattern_my_sample"; 

Wie man sehen kann, ist der Name des definierten Feldes gleich seinem Inhalt. Danach definieren wir den Wert bzw. das SQL Statement selbst:

 static final String PATTERN_MY_SAMPLE_STMT = "SELECT * FROM mySample WHERE name = ?"; 

Hier sieht man, das der Name der Schlüssels äquivalent zum Namen des Wertes + '_STMT' ist. Jetzt kann man die PreparationAPI benutzen, um das Statement vorzubereiten und auszuführen, indem man den vorher definierten Schlüssel PATTERN_MY_SAMPLE benutzt.

Im Falle von 'pattern' Statements müssen Parameter übergeben werden. Um die Benutzung der PreparationAPI zu vereinfachen, könnte es nützlich sein, sich Integer Schlüssel zu definieren, die die Position eines Parameters im Statement anzeigen. Bezogen auf das vorhergehende Beispiel gibt es nur einen Parameter der übergeben werden muss. Man könnte also einen Schlüssel wie folgt definieren:

 public static final String int KEY_MY_SAMPLE_NAME = 1; . 

Der Name des Schlüssels unterliegt keinen Einschränkungen. Man sollte jedoch sicherstellen, das ein Benutzer den Namen eines Schlüssels mit dem korrespondierenden Statement assoziieren kann.

Wenn man Statements zur Verfügung stellen will, die Parameter benutzen, sollte man sicher stellen, das man mit den Anforderungen für 'prepared statements' vertraut ist. 'prepared statements' behandeln  ? als Platzhalter. Diese Platzhalter können nicht an beliebiger Stelle in ein 'prepared statement' geschrieben werden. Also bietet diese API erweiterte Funktionalitäten für 'prepared statements'. Man kann Platzhalter definieren, indem man das Schlüsselwort _DYNAMIC_ benutzt, wo immer ein  ? den Anforderungen nicht genügt.

Persönliche Werkzeuge