WiTa Datenbank Anbindung (Handout)

Werbung
WiTa – Datenbankanbindung:
Interfaces, Methoden und Attribute
1 Inhaltsverzeichnis
1
2
Inhaltsverzeichnis............................................................................................................... 1
Speichern............................................................................................................................ 2
2.1
Interfaces .................................................................................................................... 2
2.1.1
Storeable............................................................................................................. 2
2.1.2
Createable........................................................................................................... 2
2.1.3
Updateable.......................................................................................................... 3
2.2
Hilfsmethoden ............................................................................................................ 3
2.2.1
executeCommand ............................................................................................... 3
2.2.2
executeCreate ..................................................................................................... 4
3
Laden.................................................................................................................................. 5
3.1
Interfaces .................................................................................................................... 5
3.1.1
Restoreable ......................................................................................................... 5
3.2
Hilfsmethoden ............................................................................................................ 5
3.2.1
genericFind......................................................................................................... 5
3.2.2
calculateQuery.................................................................................................... 6
3.2.3
getMemberFromDatabase .................................................................................. 6
4
Hilfsstrukturen.................................................................................................................... 7
4.1
Interfaces .................................................................................................................... 7
4.1.1
SimpleIntId......................................................................................................... 7
4.2
Hilfsmethoden ............................................................................................................ 7
4.2.1
getConnection..................................................................................................... 7
4.2.2
getQuery ............................................................................................................. 7
4.2.3
getCompString ................................................................................................... 8
4.2.4
makeStringFuzzy................................................................................................ 8
4.2.5
makeSQLString.................................................................................................. 8
4.3
Hilfsattribute............................................................................................................... 9
4.3.1
sqlNames ............................................................................................................ 9
4.3.2
[Attribut-Name]Id .............................................................................................. 9
1
2 Speichern
2.1 Interfaces
2.1.1 Storeable
Name
Methoden
Attribute
Verwendung
Erläuterung
Beispiel
de.uni_marburg.wita.sql.Storeable
1. public String getCreateString()
2. public String getUpdateString()
3. public String getRemoveString()
Alle (in Db) speicherbaren Klassen sollten dieses Interface
implementieren.
Die Methoden liefern jeweils die entsprechende SQL-Statements der
Operationen:
getCreateString Æ INSERT INTO (…) VALUES (…)
getUpdateString Æ UPDATE … SET … WHERE …
getRemoveString Æ DELETE FROM … WHERE …
de.uni_marburg.wita.orga.StandardTextTemplate (einfach)
de.uni_marburg.wita.orga.Person (komplex)
2.1.2 Createable
Name
Methoden
Attribute
Verwendung
Erläuterung
Beispiel
de.uni_marburg.wita.sql.Createable
1. public void create()
2. public void remove()
Dieses Interface sollten nur speicherbaren Klassen implementieren, die
unabhängig von anderen Klassen existieren (d.h. unter anderem, dass sie
nicht stark aggregiert werden). Für abhängige Klassen übernimmt ein
„Master“-Klasse die Funktionalität dieses Interfaces:
add[Klassen-Name](…)
remove[Klassen-Name](…)
Die Methoden speichern/löschen ein Objekt in/aus einer Datenbank. Die
Implementierung des Interfaces durch eine Klasse bedeutet insbesondere,
dass Objekte dieser Klasse selbständig gespeichert werden können soll
(siehe „Verwendung“).
Die Methoden verwenden insbesondere getCreateString und
getRemoveString des Storable-Interfaces.
de.uni_marburg.wita.orga.StandardTextTemplate (einfach)
de.uni_marburg.wita.orga.Congress (komplex)
2
2.1.3 Updateable
Name
Methoden
Attribute
Verwendung
Erläuterung
Beispiel
de.uni_marburg.wita.sql.Updateable
1. public void update()
Alle (in Db) speicherbaren Klassen sollten dieses Interface
implementieren.
Die Methode macht den aktuellen Zustand eines Objektes persistent in der
Datenbank (Æ speichert). Das Objekt muss zuvor in der Datenbank
gespeichert worden sein: mit der Objekt-eigenen create() bzw. einer
add[Objekt-Name](…) Methode des Master-Objektes (vgl. Verwendung
beim Createable-Interface).
Die Methode verwendet insbesondere getUpdateString des StorableInterfaces.
de.uni_marburg.wita.orga.StandardTextTemplate (einfach)
de.uni_marburg.wita.orga.Congress (komplex)
2.2 Hilfsmethoden
2.2.1 executeCommand
Name
Varianten
Verwendung
(allgemein)
Verwendung
(Variante 1)
Verwendung
(Variante 2)
Verwendung
(Variante 3)
de.uni_marburg.wita.sql.Engine.executeCommand
1. public static void executeCommand(
String sqlString, Logger logger)
2. public static void executeCommand(
String[] sqlString, Logger logger)
3. public static void executeCommand(
String[] sqlStrings, Logger logger, Connection connect, boolean
commit)
Diese Methode wird allgemein dazu verwendet, SQL-Statements
aufzuführen, die keine speziellen Ergebnisse zurückliefern (wie z.B.
UPDATE und DELETE).
String sqlString: dieser Paramter sollte ein SQL-konformes Statement
enthalten.
Logger logger: ein Logger für Debug-Informationen (kann auch null sein)
Beispiel: in de.uni_marburg.wita.orga.Congress.update()
String[] sqlString: ein Sting-Array mit SQL-konformen Statements. Alle
Statements des Arrays werden innerhalb einer Transaktion ausgeführt und
– falls von der Datenbank unterstützt – als Batch-Vorgang.
Beispiel: in de.uni_marburg.wita.orga.Congress.remove()
Connection connect: ein Connection-Objekt, das mittels der Methode
de.uni_marburg.wita.sql.Engine.getConnection() geholt werden kann.
Diese Variante dient dazu, eigene Transaktionen zusammenzustellen:
Zuerst wird ein Connection-Objekt geholt und die Autocommit-Funktion
ausgeschaltet (setAutoCommit(false)). Dann kann diese Variante der
Methode (und die 2. Variante von executeCreate) mehrmals auf dem
selben Connection-Objekt ausgeführt werden, wobei der letzte booleanParameter commit mit false aufgerufen wird. Das letzte Mal, wenn die
Methode aufgerufen wird, wird dann die Transaktion abgeschlossen, indem
der Parameter commit mit true aufgerufen wird.
Beispiel: in de.uni_marburg.wita.orga.Congress.update()
3
2.2.2 executeCreate
Name
Varianten
Verwendung
(allgemein)
Verwendung
(Variante 1)
Verwendung
(Variante 2)
de.uni_marburg.wita.sql.Engine.executeCreate
1. public static int executeCreate(
Storeable ObjectToStore, Logger logger)
2. public static int executeCreate(
Storeable ObjectToStore, Logger logger, Connection connect,
boolean commit)
Diese Methode wird im allgemeinen in einer create()-Methode (vgl.
Createable-Interface) verwendet.
Insbesondere wird die getCreateString-Methode verwendet.
Falls das (param) ObjectToStore Objekt außerdem das
de.uni_marburg.wita.orga.SimpleIntId-Interface implementiert, so wird die
id des Objektes automatisch mit der von der Datenbank erzeugten id
belegt.
Als Rückgabe-Wert hat diese Methode die von der Datenbank erzeugte id
(da gültige ids echt größer 0 sind, bedeutet 0 als Rückgabe-Wert ein Fehler,
bzw. dass (param) ObjectToStore das SimpleIntId-Interface nicht
unterstützt).
Storeable ObjectToStore: dieser Paramter ist ein Objekt, das das StoreableInterface implementiert.
Logger logger: ein Logger für Debug-Informationen (kann auch null sein)
Beispiel: in de.uni_marburg.wita.orga. StandardTextTemplate.create()
Diese Variante der Methode kann dazu verwendet werden, eigene
Transaktionen zusammenzustellen (siehe executeCommand, Verwendung
(Variante 3)).
4
3 Laden
3.1 Interfaces
3.1.1 Restoreable
Name
Methoden
Attribute
Verwendung
Erläuterung
Beispiel
de.uni_marburg.wita.sql.Restoreable
1. public void restore(ResultSet source)
Alle (in Db) speicherbaren Klassen sollten dieses Interface
implementieren.
Die Methode füllt aus dem (param) ResultSet source die einzelnen
Attribute des Objekts.
de.uni_marburg.wita.orga.Person
3.2 Hilfsmethoden
3.2.1 genericFind
Name
Varianten
Verwendung
(allgemein)
de.uni_marburg.wita.sql.Engine.genericFind
1. public static Collection genericFind(
String queryString, String restoreableClassName, Logger logger)
Diese Methode wird zum Laden bzw. Suchen von Objekten in der
Datenbank verwendet.
Die Suche läuft über den (param) String queryString, der ein SQLkonformer Query sein sollte z.B.:
SELECT [fields] FROM [database_table [AS [alias-name]]] WHERE
[search_condition [AND [search_condition]]] ORDER BY [order]
Mit dem (param) String restoreableClassName gibt man den Namen des
Objekt-Typs an, den man sucht; d.h. der Klassen-Name inkl. der
vollständigen Package-Angabe (z.B. „de.uni_marburg.wita.orga.Person“).
Der (param) Logger logger ist optional (d.h. darf auch null sein) und dient
der Ausgabe von (Debug-) Informationen.
Die Methode gibt eine Collection zurück, die mit Objekten vom Type
(param) restoreableClassName sind und dabei den Such-Kriterien des
Paramters queryString gerecht werden. Falls es keine solche Objekte in der
Datenbank gibt, wird eine leere Collection zurückgegeben.
5
3.2.2 calculateQuery
Name
Varianten
Verwendung
(allgemein)
de.uni_marburg.wita.sql.Engine.calculateQuery
1. public static Object calculateQuery(String sqlQuery, boolean
longOrDouble, Logger logger)
Mit dieser Methode können (Zahlen-) Werte, die Datenbank-intern (d.h.
über ein SQL-Statement) berechnet werden, abgefragt werden.
Die Abfrage läuft über den (param) String sqlQuery, der SQL-konform
sein sollte z.B.:
SELECT sum([fields]) FROM [database] WHERE [search_condition
[AND [search_condition]]]
Mit (param) boolean longOrDouble gibt man an, welche Art von Wert
berchnet wird:
Bei true wird ein ganzzahliger Wert erwartet, bei false ein gebrochener.
Entsprechend ist der Rückgabe-Wert bei true ein java.lang.Long Objekt
und bei false ein java.lang.Double Objekt.
Der (param) Logger logger ist optional (d.h. darf auch null sein) und dient
der Ausgabe von (Debug-) Informationen.
Die Methode gibt ein Objekt zurück: falls (param) longOrDouble true ein
java.lang.Long, falls false ein java.lang.Double, wobei die Objekte jeweils
den durch die Methode berechneten Wert enthalten.
Falls der Rückgabe-Wert -1 ist, könnte das auf einen Fehler hindeuten (es
könnte aber auch wirklich -1 berechnet worden sein).
3.2.3 getMemberFromDatabase
Name
Varianten
Verwendung
(allgemein)
de.uni_marburg.wita.sql.Engine.getMemberFromDatabase
1. public static Object getMemberFromDatabase(
String sqlQuery, String restoreableObjectName, Logger logger)
Diese Methode ist zum Laden von Storeable Objekt-Feldern/Attributen aus
der Datenbank gedacht.
Die Suche nach dem richtigen Objekt läuft über den (param) String
sqlQuery, der ein SQL-konformer Query sein sollte, wobei in der WHEREKlausel nach dem Primär-Schlüssel des Objekts gesucht werden sollte z.B.:
SELECT [fields] FROM [database_table] WHERE [object_id=value].
Mit dem (param) String restoreableClassName gibt man den Namen des Objekt-Typs an, den man
sucht; d.h. der Klassen-Name inkl. der vollständigen Package-Angabe (siehe genericFind).
Der (param) Logger logger ist optional (d.h. darf auch null sein) und dient der Ausgabe von (Debug) Informationen (siehe genericFind).
Die Methode ist ähnlich der genericFind-Methode. Da aber mit dem
Primär-Schlüssel nach einem Objekt gesucht wird sollte das ResultSet des
SQL-Querys auch nur eine Zeile (row) enthalten. Weshalb auch nur ein
Objekt vom Typ (param) restoreableObjectName statt einer Collection
zurückgegeben wird. Im Unterschied zu genericFind wird auch keine
Exception geworfen (Fehlermeldungen werden gegebenenfalls über den
(param) logger ausgegeben).
6
4 Hilfsstrukturen
4.1 Interfaces
4.1.1 SimpleIntId
Name
Methoden
Attribute
Verwendung
Erläuterung
Beispiel
de.uni_marburg.wita.orga.SimpleIntId
1. public int getId()
2. public void setId(int identity)
Alle (in Db) speicherbaren Klassen sollten dieses Interface
implementieren, solange sie keine Assoziations-Klassen sind. Mit
Ausnahme der Assoziations-Klassen werden Klassen mit Hilfe einer
„künstlichen“ int-Objekt-ID eindeutig identifiziert. Die Objekt-ID wird in
der Regel vom Datenbank-System beim speichern (INSERT) erzeugt (Æ
AUTO_INCREMENT).
Mit den Methoden wird die Objekt-ID gesetzt (vgl. executeCreate(…))
bzw. kann abgefragt werden.
de.uni_marburg.wita.orga.Person
4.2 Hilfsmethoden
4.2.1 getConnection
Name
Varianten
Verwendung
(allgemein)
de.uni_marburg.wita.sql.Engine.getConnection
1. public static Connection getConnection()
Mit dieser Methode kann ein java.sql.Connection Objekt für die zum
Speichern benutzte Datenbank angefordert werden.
Das Connection Objekt kann i.d.R. dazu benutzt werden, um eigne
Transaktionen zusammen zustellen (siehe executeCommand, 3. Variante
und executeCreate, 2. Variante). Ansonsten sollte man möglichst die
vorhandenen Methoden benutzen, ohne die JDBC-Funktionalität direkt zu
nutzen.
4.2.2 getQuery
Name
Varianten
Verwendung
(allgemein)
Verwendung
(Variante 1)
Verwendung
(Variante 2)
Verwendung
(Variante 1)
de.uni_marburg.wita.sql.Engine.getQuery
1. public static String getQuery(String toQuery)
2. public static String getQuery(java.sql.Date toQuery)
3. public static String getQuery(boolean toQuery)
Diese Methoden wandeln Java Datentypen in Stringrepräsentationen um,
die direkt in einem SQL-Statement verwendet werden können.
(Parameter: String) „Test“ Æ (Rückgabe: String) „’[Test]’”
(wobei [Test] dem Rückgabe-String der Methode makeStringFuzzy enspricht)
(Parameter: Date) [Date-Obj.] Æ (Rückgabe: String) „’[Date-Patterned]’”
(wobei [Date-Patterned] der Mustervorgabe von
de.uni_marburg.wita.sql.Engine.DATABASE_DATE_FORMAT entspricht)
(Parameter: boolean) [true] Æ (Rückgabe: String) „1”
(Parameter: boolean) [false] Æ (Rückgabe: String) „0”
7
4.2.3 getCompString
Name
Varianten
Verwendung
(allgemein)
Verwendung
(Variante 1)
Verwendung
(Variante 2)
de.uni_marburg.wita.sql.Engine.getCompString
1. public static String getCompString(byte comparatorType)
2. public static String getCompString(boolean exactMatching)
Diese Methoden geben dem - Parameter entsprechend - eine
Stringrepräsentation eines bestimmten Vergleichs-Operators zurück, der
z.B. in einer WHERE-Klausel eines SQL-Statements verwendet werden
kann.
Sollte für Vergleichs-Operatoren von Zahlen bzw. Daten verwendet
werden (siehe Java-Docs für Informationen bzgl. der Parameter-Werte)
Sollte für Vergleichs-Operatoren von Zeichenketten verwendet werden
(siehe Java-Docs für Informationen bzgl. der Parameter-Werte)
4.2.4 makeStringFuzzy
Name
Varianten
Verwendung
(allgemein)
de.uni_marburg.wita.sql.Engine.makeStringFuzzy
1. public static String makeStringFuzzy(String toLoose)
Diese Methode ersetzt die üblichen Wildcards (für ein Suche: * ?) mit den
für die Datenbank-üblichen Wildcards (z.B. % _)
4.2.5 makeSQLString
Name
Varianten
Verwendung
(allgemein)
de.uni_marburg.wita.sql.Engine.makeSQLString
1. public static String makeSQLString(String[] fieldList, String prefix,
String separator)
Diese Methode konstuiert aus den Parametern einen String wie folgt:
Die Strings des Parameters fieldList werden hintereinander geschrieben,
wobei sie jeweils (param) prefix als Präfix erhalten und voneinander durch
(param) separator getrennt werden.
Beispiel: fieldList={„eins“, „zwei“, „drei“}, prefix= „Obj.“, separator= „; “
Æ Rückgabe-String: „Obj.eins; Obj.zwei; Obj.drei“
Mit dieser Methode und dem Objekt-Feld sqlNames (z.B. in Address) einer
speicherbaren Klasse als Parameter fieldList kann in einfacher Weise die
Projektion in einem SQL-Statement zusammengestellt werden (wobei mit
prefix die Datenbank-Tabelle bzw. ihr Alias gesetzt werden können):
SELECT addr.street, …, addr.faxNumber FROM Address AS addr
Dazu muß der Methode Address.sqlNames als fieldList, „addr.” als prefix
und „,” als separator übergeben werden.
8
4.3 Hilfsattribute
4.3.1 sqlNames
Name
Varianten
Verwendung
(allgemein)
de.uni_marburg.wita.orga.*.sqlNames
1. [private|public] final static transient String[] sqlNames
In diesem Attribute sollten alle Attribute der Klasse, die in der Datenbank
gespeichert werden aufgezählt werden.
Die „Aufzählung“ als Strings sollten jeweils die Spalten-Namen der
Datenbank-Tabelle sein, in der das jeweilige Attribut gespeichert wird:
(Attribut) street Æ (Spalten-Name) street_name
Î (sqlName-Eintrag) street_name
4.3.2 [Attribut-Name]Id
Name
Varianten
Verwendung
(allgemein)
de.uni_marburg.wita.orga.*.[Attribut-Name]Id
1. private transient int [Attribut-Name]Id
Für Attribute eines Objekts, die in einer eignen Datenbank-Tabelle
gespeichert werden, wird zusätzlich zum Attribut ein int-Attribut angelegt,
das die ID des Attributs enhält (vgl. auch SimpleIntId-Interface).
Beispiel: in BankDetail
(Attribut)
private Person owner
(Hilfsattribut) private transient int ownerId
Dieses (Hilfs-) Attribut wird benötigt, um das eigentliche Attribut (per
lazy-loading) aus der Datenbank zuholen ( siehe auch
BankDetail.getPerson() ).
Das Attribut [Attribute-Name]Id sollte nur in den create() (oder
add[Object-Name](…)) bzw. update() Methoden gesetzt werden (Æ nicht
in der set[Attribute-Name]([Attribut-Type]) Methode).
9
Herunterladen