|
Letzte
Bearbeitung dieses Dokuments: |
Voraussetzungen für das Verständnis dieses Dokuments:Grundkenntnisse in
der Programmierung von Java (Klassen, Methoden,
Schleifen). |
Ungefährer Zeitbedarf zum Durcharbeiten dieses Dokuments:Arbeitszeit:
Für das Implementieren komplexerer Abfragen hängt der Arbeitsaufwand stark von der Aufgabe und der Routine ab. Eine Schätzung des Zeitaufwandes kann in diesen Fällen nicht gegeben werden. |
Dieses Dokument enthält Code-Muster für eine einfache DBA_Set (Liste mit DataBase-Access Objekten) Klasse und Erweiterungen, die entsprechend den jeweiligen Anforderungen zusätzlich implementiert werden können.
Vorbedingung
Einfacher
Muster-Code für ein DBA_Set
Anleitung
zur Adaptierung
* Änderung
des Namens des Java-Packages
* Adaptieren
des Kommentars
* Änderung
des Namens dieser Klasse und des DBA-Objektes
* Adaptieren
der Methode selectAllByObjectID(...)
*
Implementieren der Methode(n)
selectBySelectionCriteria(...)
Spezieller
Muster-Code
*
Selektieren von Datensätzen die erst in der Zukunft gültig
sind
*
Selektieren von Datensätzen die aktuell und in der Zukunft gültig
sind
Weitere
Schritte und verwandte Dokumentation
Tutorial für die Programmierung eines Heavyweight-Clients (Fat-Client) durchgearbeitet.
Datenmodell fertig ausgearbeitet.
Welche
Platzhalter durch Bezeichnungen des eigentlichen Projektes zu
ersetzen sind finden Sie im Abschnitt
Anleitung
zur Adaptierung.
package
application_package
.dba;
/*
*
Package für die Verbindung zur Datenbank. */import
java.sql.*;
/*
*
Package mit den Basisklassen für DBA und DBA-Set. */import
js_base.dba.*;
/*
* Package mit dem Minimalen Set an Parametern. Diese
enthalten das Arbeitsdatum.
* Das Arbeitsdatum wird für
verschiedene Abfragen gebrauucht. */import
js_base.structures.JSBS_MinimalParameters;
/*
*
Package mit der DBA-Klasse, dessen Objekte in der Liste dieses
DBA-Set enthalten ist. */import
application_package
.dba.
application_dbtable
_DBA;
/**
*
* @author
name[at]company
* @date
20xx-xx-xx
*
* @description
* Liste
mit DataBase-Access Objects (DBA_Set)
* der
Klasse application_dbtable
_DBA.
* Eine
Beschreibung der Aufgabe finden Sie im Kommentar der
DBA-Klasse.
*
* @change-log
* when who why
* -----------------------------------------------------------------
*
*/public
class
application_dbtable
_DBA_Set
extends
JSBS_DBA_Set
{
/*
*
de:
* Methode zum Selektieren aller Datensätze für einen
gegebenen Objekt-ID.
* Diese Methode wird zum Anzeigen von
Veränderungen (History) des BO und zum
* Abgleichen
der Daten bei einer 'MobileClient' Version verwendet.
*
Weiters wird damit beim 'deaktivieren' des BO festgestellt, welche
Datensätze
* noch über das aktuelle Datum hinaus gültig
sind. */
public
synchronized void
selectAllByObjectID(Connection
parmDBCon,
double
parmObjectID)
{
/*
de:
* 'Bauen' des SQL-Kommandos in einer Zeichenkette.
*
Das SQL-Kommando wird zuerst in einer eigenen Zeichenkette aufgebaut
(und nicht gleich
* als Parameter der preparedStatement
Methode) um das SQL-Kommando klar sehen zu können.
* Das
ist hilfreich wenn es notwendig ist, den Debugger einzusetzen.
*/
final
String
locstrSQLCommand
=
application_dbtable
_DBA.
CONST_SELECT_ALL_ATTRIBUTES
+
"
where "
+
application_dbtable
_DBA.
CONST_ObjectID
+
"
=?"
+
"
order by "
+
application_dbtable
_DBA.
CONST_ValidFrom
+
" asc,
"
+
application_dbtable
_DBA.
CONST_ValidTill
+
"
asc"
;
/*
de: 'PreparedStatement'; eine spezielle Klasse für Operationen auf
die Datenbank. */
PreparedStatement
SQLStatement;
try
{
/*
de: 'PreparedStatement' konstruieren und mit dem SQL-Kommando füllen.
*/
SQLStatement
= parmDBCon.prepareStatement(locstrSQLCommand);
/*
de: Füllen der Variablen im 'PreparedStatement'.
*/
SQLStatement.setDouble(1,
parmObjectID);
/*
de: Ausführen der Datenbank-Operation für ein SELECT.
*/
ResultSet
SQLResultSet = SQLStatement.executeQuery();
/*
*
de: Übertragen der Daten vom ResultSet in den Vector mit den
einzelnen DBA-Objekten.
*/
vecRecordSet
.removeAllElements();
for
(;;)
{
/*
de:
* Einen Datensatz nach dem Anderen lesen;
*
for-Schleife abbrechen wenn kein weiterer Datensatz mehr im ResultSet
vorhanden ist. */
if
(!SQLResultSet.next())
return
;
/* de:
*
Ein DBA-Objekt 'konstruieren' und die Werte aus dem SQLResultSet
übertragen.
*/
application_dbtable
_DBA
locstruct
application_dbtable
_DBA
=
new
application_dbtable
_DBA();
locstruct
application_dbtable
_DBA.getValuesFromSQLResultSet(SQLResultSet);
/*
de:
* Einfügen des einzelnen DBA-Objektes in den Vector;
* dieser ist in der geerbten Basisklasse definiert. */
vecRecordSet
.addElement(locstruct
application_dbtable
_DBA
)
;
/* de:
*
Datenbank-Operation wurde ohne Fehler ausgeführt; zurückmelden an
die aufrufende Methode
* durch eine leere Zeichenkette für
die Fehlermeldung (error-message). */
ErrorMsg
=
""
;
}
}
catch
(SQLException
SQLExc) {
/* de:
Während des Ausführens der DB-Operation ist ein Fehler aufgetreten;
Text-Nachricht holen. */
ErrorMsg
=
SQLExc.getMessage();
}
}
/*
*
METHODE zum Selektieren einer durch den Parameter
'parmNumberOfRecords' festgelegten
* Anzahl von
Datensätzen
deren Wert im Attribut 'ChangedAt' gleich oder kleiner ist
als
* der im Parameter 'parmBeginTimestamp' übergebene
Wert.
* Die Datensätze sind absteigend nach ihrem Wert im
Attribut 'ChangedAt' sortiert.
* Es werden mit dieser
Methode eine vorgegebene Anzahl von Datensätzen selektiert die
gleich
* alt oder älter sind als der im Parameter
'parmBeginTimestamp' übergebene Wert.
*
Diese Methode wird gebraucht wenn bei der Version 'MobileClient' die
Daten auf einem
* mobilen Client mit den Daten des Servers
synchronisiert werden müssen.
*/
public
synchronized void
selectAllByChangedAt(Connection
parmDBCon,
Timestamp
parmBeginTimestamp,
int
parmNumberOfRecords
) {
/*
de:
* 'Bauen' des SQL-Kommandos in einer Zeichenkette.
*
Das SQL-Kommando wird zuerst in einer eigenen Zeichenkette aufgebaut
(und nicht gleich
* als Parameter der preparedStatement
Methode) um das SQL-Kommando klar sehen zu können.
* Das
ist hilfreich wenn es notwendig ist, den Debugger einzusetzen.
*/
final
String
locstrSQLCommand
=
application_dbtable
_DBA.
CONST_SELECT_ALL_ATTRIBUTES
+
"
where "
+
application_dbtable
_DBA.
CONST_ChangedAt
+
"
<=? "
+
/*
*
de: Sortierkriterium mit dem die gefundenen Datensätze nach dem
Alter sortiert werden.
* en: Sorting-criteria to sort the
found records by age. */
"
order by "
+
application_dbtable
_DBA
.
CONST_ChangedAt
+
"
desc"
+
/*
*
de: Anzahl der Datensätze die mit dieser Abfrage gelesen werden
sollen.
* en: Number of records that should be read with
this selection. */
"
limit ? "
;
/*
de: 'PreparedStatement'; eine spezielle Klasse für Operationen auf
die Datenbank. */
PreparedStatement
SQLStatement;
try
{
/*
de: 'PreparedStatement' konstruieren und mit dem SQL-Kommando füllen.
*/
SQLStatement
= parmDBCon.prepareStatement(locstrSQLCommand);
/*
de: Füllen der Variablen im 'PreparedStatement'.
*/
SQLStatement.setTimestamp(1,
parmBeginTimestamp);
SQLStatement.setInt(2,
parmNumberOfRecords);
/*
de: Ausführen der Datenbank-Operation für ein SELECT.
*/
ResultSet
SQLResultSet = SQLStatement.executeQuery();
/*
*
de: Übertragen der Daten vom ResultSet in den Vector mit den
einzelnen DBA-Objekten.
*/
vecRecordSet
.removeAllElements();
for
(;;)
{
/*
de:
* Einen Datensatz nach dem Anderen lesen;
*
for-Schleife abbrechen wenn kein weiterer Datensatz mehr im ResultSet
vorhanden ist. */
if
(!SQLResultSet.next())
return
;
/* de:
*
Ein DBA-Objekt 'konstruieren' und die Werte aus dem SQLResultSet
übertragen.
*/
application_dbtable
_DBA
locstruct
application_dbtable
_DBA
=
new
application_dbtable
_DBA();
locstruct
application_dbtable
_DBA.getValuesFromSQLResultSet(SQLResultSet);
/*
de:
* Einfügen des einzelnen DBA-Objektes in den Vector;
* dieser ist in der geerbten Basisklasse definiert. */
vecRecordSet
.addElement(locstruct
application_dbtable
_DBA);
/* de:
*
Datenbank-Operation wurde ohne Fehler ausgeführt; zurückmelden an
die aufrufende Methode
* durch eine leere Zeichenkette für
die Fehlermeldung (error-message). */
ErrorMsg
=
""
;
}
}
catch
(SQLException
SQLExc) {
/* de:
Während des Ausführens der DB-Operation ist ein Fehler aufgetreten;
Text-Nachricht holen. */
ErrorMsg
=
SQLExc.getMessage();
}
}
/* ---------------------
* METHODE zum Lesen aller Datensätze die zum
Arbeitsdatum
* (im Parameter JSBS_MinimalParameters
enthalten) gültig sind und den in
* den Parametern
übergebenen Selektionskriterien entsprechen.
* 'Connection'
ist eine Klasse aus dem package 'java.sql' und enthält die
* Verbindung zum Datenbanksystem. */
public
void
selectBy
SelectionCriteria
(
Connection
parmDBCon, JSBS_MinimalParameters parmMinParm,
String
parmSelectionVariableName1
,
int
parm
SelectionVariableName2
)
{
/* Aufbauen
des SQL-Kommandos in einer eigenen Zeichenkette
(String).
* Gegenüber einem direkten Schreiben des des
SQL-Kommandos als Parameter
* beim 'Construct' des
'SQLStatement' hilft der eigene String beim Debuggen.
* Dabei
werden die als Konstante definierten Werte der
Klasse
* JS_ProjAssist_ProjLang_DBA verwendet.
*/
final
String
locstrSQLCommand =
application_dbtable
_DBA.
CONST_SELECT_ALL_ATTRIBUTES
+
/* Selectionskriterien
in die Zeichenkette einfügen. */
"
where "
+
application_dbtable
_DBA.
CONST_ClientID
+
"
=?"
+
"
and "
+
application_dbtable
_DBA.
CONST_ValidTill
+
"
>=?"
+
"
and "
+
application_dbtable
_DBA.
CONST_ValidFrom
+
"
<=?"
+
"
and "
+
application_dbtable
_DBA.
CONST_
AttributeName1
+
" =?"
+
/* Bei
einem LIKE-Statement wird ebenfalls hier ein Platzhalter
eingefügt.
* eventuelle 'Wildcards' im
Selektionskriterium werden beim Versorgen des Platzhalters
* mit
Werten an die Zeichenkette für die Selektion angehängt.
*/
"
and "
+
application_dbtable
_DBA.
CONST_
AttributeName2
+
" like
?"
+
/* Sortierkriterium,
damit die Datensätze aufsteigend (oder absteigend) nach
den
* Selektionskriterien (und eventuell weiteren
Attributen) gleich während der DB-Abfrage
* sortiert
werden. */
"
order by "
+
application_dbtable
_DBA.
CONST_
AttributeName1
+
",
"
+
application_dbtable
_DBA.
CONST_
AttributeName2
+
",
"
+
application_dbtable
_DBA.
CONST_
AttributeName3
+
",
"
+
application_dbtable
_DBA.
CONST_ValidFrom
+
"
desc, "
+
application_dbtable
_DBA.
CONST_ValidTill
+
"
asc"
;
/* Das
im Parameter 'JSBS_MinimalParameters' enthaltene Arbeitsdatum muß in
das
* Datumsformat der 'java.sql' Klassen konvertiert
werden. */
Date
locdteWorkDate = new
Date(parmMinParm.
calWorkDate
.getTime().getTime());
/* 'PreparedStatement'
ist eine Klasse aus dem 'java.sql'-package die das
* SQL-Kommando
an das Datenbanksystem überträgt. */
PreparedStatement
SQLStatement;
/* Es
folgt die Ausführung des SQL-Kommandos; die dafür zuständigen
Klassen
* und Methoden arbeiten mit 'try/catch' zur
Fehlerbehandlung. */
try
{
/* Gerade
vorher definiertes 'PreparedStatement' konstruieren
* und
dabei als Parameter das SQL-Kommando übergeben.
*/
SQLStatement
= parmDBCon.prepareStatement(locstrSQLCommand);
/*
Werte für die Selektion in die Zeichenkette mit dem SQL-Kommando
einfügen. */
SQLStatement.setInt(1,
parmMinParm.
intClientID
);
SQLStatement.setDate(2,
locdteWorkDate);
SQLStatement.setDate(3,
locdteWorkDate);
SQLStatement.setString(4,
parm
SelectionVariableName1
);
SQLStatement.setInt(5,
parm
SelectionVariableName2
);
/* Spezielle
Form für das Füllen eines Platzhalters innerhalb eines
LIKE-Statements.
* Grund ist, dass eventuelle
'Wildcards' innerhalb des LIKE-Statements nicht in der
* Zeichenkette mit dem SQL-Kommando geschrieben werden
können. */
SQLStatement.setString(5,
parmSelectVariableName2
+
"%"
);
/* SQL-Kommando
an die Datenbank 'absenden'; die Werte des gefundenen Datensatzes
* sind dann im Objekt der Klasse 'ResultSet'.
*/
ResultSet
SQLResultSet = SQLStatement.executeQuery();
/*
* Datenbank-Abfrage
ohne Fehler; Vector mit der Liste der DBA-Objekte leeren
und
* Fehler-Meldung mit leerem 'String' füllen –
als Zeichen der ordnungsgemäßen Ausführung. */
ErrorMsg
=
""
;
vecRecordSet
.removeAllElements()
;
/*
* In
einer Schleife jeden Datensatz aus dem SQLResultSet auslesen und auf
ein
* JS_ProjAssist_ProjLang_DBA Objekt übertragen.
*/
for
(;;)
{
/*
* Prüfen
ob ein weiterer Datensatz vorhanden ist. */
if
(!SQLResultSet.next())
return
;
/*
* Prüfen
ob die Gültigkeit des bearbeiteten Datensatzes mit dem Arbeitsdatum
übereinstimmt.
* Damit werden Datensätze
ausgeschlossen, deren Gültigkeit eventuell erst in der Zukunft
beginnt. */
locdteReadValidFrom
=
SQLResultSet.getDate(JSBS_DBA.
CONST_ValidFrom
);
locdteReadValidTill
=
SQLResultSet.getDate(JSBS_DBA.
CONST_ValidTill
);
/* Methode
aus der Basisklasse verwenden um die Gültigkeit zu prüfen.
*/
if
(isWithinDateRange(locdteWorkDate,
locdteReadValidFrom
,
locdteReadValidTill
))
{
/*
* Ein
DBA-Objekt 'konstruieren' und die Werte aus dem SQLResultSet
übertragen. */
application_dbtable
_DBA
locstruct
application_dbtable
_DBA
=
new
application_dbtable
_DBA();
locstruct
application_dbtable
_DBA.getValuesFromSQLResultSet(SQLResultSet);
/*
* Das
DBA-Objekt in den Vector mit der Liste der DBA-Objekte
einfügen.
* Der Vector ist in der geerbten Basisklasse
definiert.
*/
vecRecordSet
.addElement(locstruct
application_dbtable
_DBA);
}
}
}
catch
(SQLException
SQLExc) {
/* Wenn
ein Fehler aufgetreten ist dann den Fehler-Text extrahieren und an
die
* aufrufende Methode zurückliefern.
*/
ErrorMsg
=
SQLExc.getMessage();
}
}}
Anleitung
zur Adaptierung
Am
leichtesten funktioniert die Anpassung des Muster-Codes an die
eigenen Erfordernisse durch Kopieren des Muster-Codes und Verwendung
von
Edit
> Find/Replace...
.
|
Für
'Platzhalter', die nur einmalig im Muster-Code vorkommen ist die
'Find'-Funktion ist hilfreich zum Finden der beschriebenen
'Platzhalter'.
Änderung
des Namens des Java-Packages
package
application_package
.dba;
/*
.
. . . . . . . . .
.
. . . . . . . . .
/*
*
Package mit der DBA-Klasse, dessen Objekte in der Liste dieses
DBA-Set enthalten ist. */import
application_package
.dba.
application_dbtable
_DBA;
/**
D
ieser
Name kommt in der ersten Zeile und beim
import
der
DBA-Klasse vor.
Ein zeitsparendes Vorgehen ist, beim Kopieren des
Muster-Codes diese Zeile nicht zu überschreiben und dann die Zeile
des Muster-Codes mit dem Platzhalter für den Namen des Java-Packages
zu löschen.
Adaptieren
des Kommentars
'Kein
Kommentar ist besser als ein falscher'
.
Aus
diesem Grund ist im Muster-Code auch keine Hintergrund-Information
über Entwurfs-Entscheidungen für die DB-Tabelle vorhanden.
Meiner
Erfahrung nach ist hilfreich, im Kommentar zu sehen, welche Variable
jenen Schlüssel bilden, mit denen der Anwender ein Business Object
eindeutig identifizieren kann.
Änderung
des Namens dieser Klasse und des DBA-Objektes
/*
*
Package mit der DBA-Klasse, dessen Objekte in der Liste dieses
DBA-Set enthalten ist. */import
application_package
.dba.
application_dbtable
_DBA;
/*
Der
Name der DBA-Klasse, der auch Teil dieser Klasse (Set / Liste mit
DBA-Objekten) ist, kommt mehrmals innerhalb des Codes vor.
Am
einfachsten ist, den Platzhalter
application_dbtable
_DBA
durch
den tatsächlichen Namen zu ersetzen und dazu das Verfahren, das
unter
Anleitung
zur Adaptierung
beschrieben
ist, zu verwenden.
Adaptieren
der Methode
selectAllByObjectID(...)
Wenn
der Platzhalter
application_dbtable
_DBA
bereits,
wie im vorigen Abschnitt (
Änderung
des Namens dieser Klasse und des DBA-Objektes
)
empfohlen, durch 'Find/Replace' ersetzt wurde dann ist bei dieser
Methode keine Änderung mehr notwendig.
Adaptieren
der Methode(n)
selectBy
SelectionCriteria
(...)
Methoden
nach diesem Schema können mehrmals für verschiedene Kombinationen
von Selektions-Kriterien vorkommen.
Haupt-Aufgabe dieser Methoden
ist,
* eine Liste von Datensätzen entsprechend den vom Anwender
gewünschten Such-Kriterien oder
* eine Liste von
Datensätzen, die einen bestimmten Fremd-Schlüssel-Wert enthalten
zu
selektieren.
/* ---------------------
* METHODE zum Lesen aller Datensätze die zum
Arbeitsdatum
* (im Parameter JSBS_MinimalParameters
enthalten) gültig sind und den in
* den Parametern
übergebenen Selektionskriterien entsprechen.
* 'Connection'
ist eine Klasse aus dem package 'java.sql' und enthält die
* Verbindung zum Datenbanksystem. */
public
void
selectBy
SelectionCriteria
(
Connection
parmDBCon, JSBS_MinimalParameters parmMinParm,
String
parmSelectionVariableName1
,
int
parm
SelectionVariableName2
)
{
/* Aufbauen
des SQL-Kommandos in einer eigenen Zeichenkette (String).
Nachdem
das Schema dieses Muster-Codes für mehr als eine Methode (wobei die
verschiedenen Methoden für verschiedene Selektions-Kriterien
angepasst werden) passend ist, ist es erforderlich, den Namen der
Methode passend zu wählen.
Weiters sind die übergebenen
Parameter für das Selektions-Kriterium zu adaptieren.
In diesem
Muster sind zwei Variable (vom Typ 'String' und 'int') für das
Selektions-Kriterium vorgesehen - diese Anzahl kann aber auch
verkleinert oder vergrößert und der Datentyp verändert werden.
/* Aufbauen
des SQL-Kommandos in einer eigenen Zeichenkette
(String).
* Gegenüber
einem direkten Schreiben des des SQL-Kommandos als Parameter
* beim
'Construct' des 'SQLStatement' hilft der eigene String beim
Debuggen.
* Dabei werden die als Konstante definierten
Werte der Klasse
* JS_ProjAssist_ProjLang_DBA
verwendet. */
final
String
locstrSQLCommand =
application_dbtable
_DBA.
CONST_SELECT_ALL_ATTRIBUTES
+
/* Selectionskriterien
in die Zeichenkette einfügen. */
"
where "
+
application_dbtable
_DBA.
CONST_ClientID
+
"
=?"
+
"
and "
+
application_dbtable
_DBA.
CONST_ValidTill
+
"
>=?"
+
"
and "
+
application_dbtable
_DBA.
CONST_ValidFrom
+
"
<=?"
+
"
and "
+
application_dbtable
_DBA.
CONST_
AttributeName1
+
" =?"
+
/* Bei
einem LIKE-Statement wird ebenfalls hier ein Platzhalter
eingefügt.
* eventuelle 'Wildcards' im
Selektionskriterium werden beim Versorgen des Platzhalters
* mit
Werten an die Zeichenkette für die Selektion angehängt.
*/
"
and "
+
application_dbtable
_DBA.
CONST_
AttributeName2
+
" like
?"
+
/* Sortierkriterium,
damit die Datensätze aufsteigend nach ProjectCode
und
* LanguageCode in die Liste eingefügt werden.
*/
"
order by "
+
application_dbtable
_DBA.
CONST_
AttributeName1
+
",
"
+
application_dbtable
_DBA.
CONST_
AttributeName2
+
",
"
+
application_dbtable
_DBA.
CONST_ValidFrom
+
"
desc, "
+
application_dbtable
_DBA.
CONST_ValidTill
+
"
asc"
;
/* Das
im Parameter 'JSBS_MinimalParameters' enthaltene Arbeitsdatum muß in
das
Der
Auswahl-Teil des SQL-Kommandos muß die Variablen, die als Parameter
übergeben wurden, widerspiegeln.
Weiters ist es sinnvoll, die
Sortierung der Liste ebenfalls aufsteigend nach den
Selektions-Kriterien vorzunehmen.
Der
Platzhalter
application_dbtable
ist
in diesem Abschnitt bereits durch den 'richtigen' Namen der Klasse
ersetzt wenn das in Abschnitt
Änderung
des Namens dieser Klasse und des DBA-Objektes
beschriebene
Verfahren mit 'Find/Replace' ausgeführt wurde.
/* Gerade
vorher definiertes 'PreparedStatement' konstruieren
* und
dabei als Parameter das SQL-Kommando übergeben.
*/
SQLStatement
= parmDBCon.prepareStatement(locstrSQLCommand);
/*
Werte für die Selektion in die Zeichenkette mit dem SQL-Kommando
einfügen. */
SQLStatement.setInt(1,
parmMinParm.
intClientID
);
SQLStatement.setDate(2,
locdteWorkDate);
SQLStatement.setDate(3,
locdteWorkDate);
SQLStatement.setString(4,
parm
SelectionVa
riableName1
);
SQLStatement.setInt(5,
parm
SelectionVariableName2
);
/* Spezielle
Form für das Füllen eines Platzhalters innerhalb eines
LIKE-Statements.
* Grund ist, dass eventuelle
'Wildcards' innerhalb des LIKE-Statements nicht in der
* Zeichenkette mit dem SQL-Kommando geschrieben werden
können. */
SQLStatement.setString(5,
parmSelectVariableName2
+
"%"
);
/* SQL-Kommando
an die Datenbank 'absenden'; die Werte des gefundenen Datensatzes
* sind dann im Objekt der Klasse 'ResultSet'.
*/
ResultSet
SQLResultSet = SQLStatement.executeQuery();
Zuletzt
ist notwendig, das Prepared Statement mit den Werten für die
Selektion zu versorgen.
Spezieller
Muster-Code
In
diesem Teil wird Muster-Code vorgestellt, der nicht in jeder Klasse
für ein DBA-Set vorkommen wird und deswegen nicht in den Muster-Code
der Klasse aufgenommen wurde.
Selektieren
von Datensätzen die erst in der Zukunft gültig sind
Die
Arbeiten für die Adaptierungen der Platzhalter sind gleich wie für
den Abschnitt
Adaptieren
der Methode(n)
selectBy
SelectionCriteria
.
Zeilen
im Code bei denen Adaptierungen vorzunehmen sind, sind fett
dargestellt.
/* ---------------------
* METHODE zum Lesen von Datensätzen deren Gültigkeit
erst nach dem Arbeitsdatum
* (im Parameter
JSBS_MinimalParameters enthalten) beginnt und die den in
*
den Parametern übergebenen Selektionskriterien
entsprechen.
* 'Connection' ist eine Klasse aus dem
package 'java.sql' und enthält die
* Verbindung zum
Datenbanksystem. */
public
void
selectFutureBy
SelectionCriteria
(
Connection
parmDBCon, JSBS_MinimalParameters parmMinParm,
String
parmSelectionVariableName1
,
int
parm
SelectionVariableName2
)
{
/* Aufbauen
des SQL-Kommandos in einer eigenen Zeichenkette
(String).
* Gegenüber einem direkten Schreiben des des
SQL-Kommandos als Parameter
* beim 'Construct' des
'SQLStatement' hilft der eigene String beim Debuggen.
* Dabei
werden die als Konstante definierten Werte der
Klasse
* JS_ProjAssist_ProjLang_DBA verwendet.
*/
final
String
locstrSQLCommand =
application_dbtable
_DBA.
CONST_SELECT_ALL_ATTRIBUTES
+
/* Selectionskriterien
in die Zeichenkette einfügen. */
"
where "
+
application_dbtable
_
DBA.
CONST_ClientID
+
"
=?"
+
"
and "
+
application_dbtable
_
DBA.
CONST_ValidTill
+
"
>?"
"
and "
+
application_dbtable
_DBA.
CONST_ValidFrom
+
"
>?"
+
"
and "
+
application_dbtable
_DBA.
CONST_
AttributeName1
+
" =?"
+
"
and "
+
application_dbtable
_DBA.
CONST_
AttributeName2
+
" =?"
+
/* Sortierkriterium,
damit die Datensätze aufsteigend nach ProjectCode
und
* LanguageCode in die Liste eingefügt werden.
*/
"
order by "
+
application_dbtable
_DBA.
CONST_
AttributeName1
+
",
"
+
application_dbtable
_DBA.
CONST_
AttributeName2
+
",
"
+
application_dbtable
_DBA.
CONST_
ValidFrom
+
"
desc, "
+
application_dbtable
_DBA.
CONST_ValidTill
+
"
asc"
;
/* Das
im Parameter 'JSBS_MinimalParameters' enthaltene Arbeitsdatum muß in
das
* Datumsformat der 'java.sql' Klassen konvertiert
werden. */
Date
locdteWorkDate = new
Date(parmMinParm.
calWorkDate
.getTime().getTime());
/* 'PreparedStatement'
ist eine Klasse aus dem 'java.sql'-package die das
* SQL-Kommando
an das Datenbanksystem überträgt. */
PreparedStatement
SQLStatement;
/* Es
folgt die Ausführung des SQL-Kommandos; die dafür zuständigen
Klassen
* und Methoden arbeiten mit 'try/catch' zur
Fehlerbehandlung. */
try
{
/* Gerade
vorher definiertes 'PreparedStatement' konstruieren
* und
dabei als Parameter das SQL-Kommando übergeben.
*/
SQLStatement
= parmDBCon.prepareStatement(locstrSQLCommand);
/*
Werte für die Selektion in die Zeichenkette mit dem SQL-Kommando
einfügen. */
SQLStatement.setInt(1,
parmMinParm.
intClientID
);
SQLStatement.setDate(2,
locdteWorkDate);
SQLStatement.setDate(3,
locdteWorkDate);
SQLStatement.setString(4,
parm
SelectionVariableName1
);
SQLStatement.setInt(5,
parm
SelectionVariableName2
);
/* SQL-Kommando
an die Datenbank 'absenden'; die Werte des gefundenen Datensatzes
* sind dann im Objekt der Klasse 'ResultSet'.
*/
ResultSet
SQLResultSet = SQLStatement.executeQuery();
/*
* Datenbank-Abfrage
ohne Fehler; Vector mit der Liste der DBA-Objekte leeren
und
* Fehler-Meldung mit leerem 'String' füllen –
als Zeichen der ordnungsgemäßen Ausführung. */
ErrorMsg
=
""
;
vecRecordSet
.removeAllElements()
;
/*
* In
einer Schleife jeden Datensatz aus dem SQLResultSet auslesen und auf
ein
* JS_ProjAssist_ProjLang_DBA Objekt übertragen.
*/
for
(;;)
{
/*
* Prüfen
ob ein weiterer Datensatz vorhanden ist. */
if
(!SQLResultSet.next())
return
;
/*
* Prüfen
ob der in Zukunft beginnende Datensatz überhaupt 'gültig' werden
kann.
* Damit werden zukünftig bereits 'deaktivierte'
Datensätze ausgeschlossen. */
locdteReadValidFrom
=
SQLResultSet.getDate(JSBS_DBA.
CONST_ValidFrom
);
locdteReadValidTill
=
SQLResultSet.getDate(JSBS_DBA.
CONST_ValidTill
);
/* Methode
aus der Basisklasse verwenden um die Gültigkeit zu prüfen.
*/
if
(
locdteReadValidFrom
.getTime()
<=
locdteReadValidTill
.getTime())
{
/*
* Ein
DBA-Objekt 'konstruieren' und die Werte aus dem SQLResultSet
übertragen. */
application_dbtable
_DBA
locstruct
application_dbtable
_DBA
=
new
application_dbtable
_DBA();
locstruct
application_dbtable
_DBA.getValuesFromSQLResultSet(SQLResultSet);
/*
* Das
DBA-Objekt in den Vector mit der Liste der DBA-Objekte
einfügen.
* Der Vector ist in der geerbten Basisklasse
definiert.
*/
vecRecordSet
.addElement(locstruct
application_dbtable
_DBA);
}
}
}
catch
(SQLException
SQLExc) {
/* Wenn
ein Fehler aufgetreten ist dann den Fehler-Text extrahieren und an
die
* aufrufende Methode zurückliefern.
*/
ErrorMsg
=
SQLExc.getMessage();
}
}
Selektieren
von Datensätzen die aktuell und in der Zukunft gültig sind
Die
Arbeiten für die Adaptierungen der Platzhalter sind gleich wie für
den Abschnitt
Adaptieren
der Methode(n)
selectBy
SelectionCriteria
.
Zeilen
im Code bei denen Adaptierungen vorzunehmen sind, sind fett
dargestellt.
/* ---------------------
* METHODE zum Lesen von Datensätzen die aktuell
gültig sind und Datensätzen deren
* Gültigkeit erst
nach dem Arbeitsdatum (im Parameter JSBS_MinimalParameters enthalten)
* beginnt und die den in den Parametern übergebenen
Selektionskriterien entsprechen.
* 'Connection' ist
eine Klasse aus dem package 'java.sql' und enthält die
* Verbindung zum Datenbanksystem. */
public
void
selectValidAndFutureBy
SelectionCriteria
(
Connection
parmDBCon, JSBS_MinimalParameters parmMinParm,
String
parmSelectionVariableName1
,
int
parm
SelectionVariableName2
)
{
/* Aufbauen
des SQL-Kommandos in einer eigenen Zeichenkette
(String).
* Gegenüber einem direkten Schreiben des des
SQL-Kommandos als Parameter
* beim 'Construct' des
'SQLStatement' hilft der eigene String beim Debuggen.
* Dabei
werden die als Konstante definierten Werte der
Klasse
* JS_ProjAssist_ProjLang_DBA verwendet.
*/
final
String
locstrSQLCommand =
application_dbtable
_DBA.
CONST_SELECT_ALL_ATTRIBUTES
+
/* Selectionskriterien
in die Zeichenkette einfügen. */
"
where "
+
application_dbtable
_
DBA.
CONST_ClientID
+
"
=?"
+
"
and "
+
application_dbtable
_
DBA.
CONST_ValidTill
+
"
>=?"
+
"
and "
+
application_dbtable
_DBA.
CONST_
AttributeName1
+
" =?"
+
"
and "
+
application_dbtable
_DBA.
CONST_
AttributeName2
+
" =?"
+
/* Sortierkriterium,
damit die Datensätze aufsteigend nach ProjectCode
und
* LanguageCode in die Liste eingefügt werden.
*/
"
order by "
+
application_dbtable
_DBA.
CONST_
AttributeName1
+
",
"
+
application_dbtable
_DBA.
CONST_
AttributeName2
+
",
"
+
application_dbtable
_DBA.
CONST_
ValidFrom
+
"
desc, "
+
application_dbtable
_DBA.
CONST_ValidTill
+
"
asc"
;
/* Das
im Parameter 'JSBS_MinimalParameters' enthaltene Arbeitsdatum muß in
das
* Datumsformat der 'java.sql' Klassen konvertiert
werden. */
Date
locdteWorkDate = new
Date(parmMinParm.
calWorkDate
.getTime().getTime());
/* 'PreparedStatement'
ist eine Klasse aus dem 'java.sql'-package die das
* SQL-Kommando
an das Datenbanksystem überträgt. */
PreparedStatement
SQLStatement;
/* Es
folgt die Ausführung des SQL-Kommandos; die dafür zuständigen
Klassen
* und Methoden arbeiten mit 'try/catch' zur
Fehlerbehandlung. */
try
{
/* Gerade
vorher definiertes 'PreparedStatement' konstruieren
* und
dabei als Parameter das SQL-Kommando übergeben.
*/
SQLStatement
= parmDBCon.prepareStatement(locstrSQLCommand);
/*
Werte für die Selektion in die Zeichenkette mit dem SQL-Kommando
einfügen. */
SQLStatement.setInt(1,
parmMinParm.
intClientID
);
SQLStatement.setDate(2,
locdteWorkDate);
SQLStatement.setString(3,
parm
SelectionVariableName1
);
SQLStatement.setInt(4,
parm
SelectionVariableName2
);
/* SQL-Kommando
an die Datenbank 'absenden'; die Werte des gefundenen Datensatzes
* sind dann im Objekt der Klasse 'ResultSet'.
*/
ResultSet
SQLResultSet = SQLStatement.executeQuery();
/*
* Datenbank-Abfrage
ohne Fehler; Vector mit der Liste der DBA-Objekte leeren
und
* Fehler-Meldung mit leerem 'String' füllen –
als Zeichen der ordnungsgemäßen Ausführung. */
ErrorMsg
=
""
;
vecRecordSet
.removeAllElements()
;
/*
* In
einer Schleife jeden Datensatz aus dem SQLResultSet auslesen und auf
ein
* JS_ProjAssist_ProjLang_DBA Objekt übertragen.
*/
for
(;;)
{
/*
* Prüfen
ob ein weiterer Datensatz vorhanden ist. */
if
(!SQLResultSet.next())
return
;
/*
* Prüfen
ob der in Zukunft beginnende Datensatz überhaupt 'gültig' werden
kann.
* Damit werden zukünftig bereits 'deaktivierte'
Datensätze ausgeschlossen. */
locdteReadValidFrom
=
SQLResultSet.getDate(JSBS_DBA.
CONST_ValidFrom
);
locdteReadValidTill
=
SQLResultSet.getDate(JSBS_DBA.
CONST_ValidTill
);
/* Methode
aus der Basisklasse verwenden um die Gültigkeit zu prüfen.
*/
if
(
locdteReadValidFrom
.getTime()
<=
locdteReadValidTill
.getTime())
{
/*
* Ein
DBA-Objekt 'konstruieren' und die Werte aus dem SQLResultSet
übertragen. */
application_dbtable
_DBA
locstruct
application_dbtable
_DBA
=
new
application_dbtable
_DBA();
locstruct
application_dbtable
_DBA.getValuesFromSQLResultSet(SQLResultSet);
/*
* Das
DBA-Objekt in den Vector mit der Liste der DBA-Objekte
einfügen.
* Der Vector ist in der geerbten Basisklasse
definiert.
*/
vecRecordSet
.addElement(locstruct
application_dbtable
_DBA);
}
}
}
catch
(SQLException
SQLExc) {
/* Wenn
ein Fehler aufgetreten ist dann den Fehler-Text extrahieren und an
die
* aufrufende Methode zurückliefern.
*/
ErrorMsg
=
SQLExc.getMessage();
}
}
Dokument |
Inhalt |
Schritt desTutorials für die Entwicklung von Heavyweight-Client Anwendungen in dem die Implementierung der DBA-Klasse vorgestellt wird. |