|
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
locstructapplication_dbtable_DBA
= new application_dbtable_DBA();
locstructapplication_dbtable_DBA.getValuesFromSQLResultSet(SQLResultSet);/*
de:
* Einfügen des einzelnen DBA-Objektes in den Vector;
* dieser ist in der geerbten Basisklasse definiert. */
vecRecordSet.addElement(locstructapplication_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
locstructapplication_dbtable_DBA
= new application_dbtable_DBA();
locstructapplication_dbtable_DBA.getValuesFromSQLResultSet(SQLResultSet);/*
de:
* Einfügen des einzelnen DBA-Objektes in den Vector;
* dieser ist in der geerbten Basisklasse definiert. */
vecRecordSet.addElement(locstructapplication_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 selectBySelectionCriteria(
Connection
parmDBCon, JSBS_MinimalParameters parmMinParm,
String
parmSelectionVariableName1, int
parmSelectionVariableName2)
{/* 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,
parmSelectionVariableName1); SQLStatement.setInt(5,
parmSelectionVariableName2);/* 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
locstructapplication_dbtable_DBA
=
new
application_dbtable_DBA(); locstructapplication_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(locstructapplication_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 AdaptierungAm
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-Packagespackage
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;/**
Dieser
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) selectBySelectionCriteria(...)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 selectBySelectionCriteria(
Connection
parmDBCon, JSBS_MinimalParameters parmMinParm,
String
parmSelectionVariableName1, int
parmSelectionVariableName2)
{/* 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,
parmSelectionVariableName1); SQLStatement.setInt(5,
parmSelectionVariableName2);/* 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-CodeIn
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 sindDie
Arbeiten für die Adaptierungen der Platzhalter sind gleich wie für
den Abschnitt Adaptieren
der Methode(n)
selectBySelectionCriteria.
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 selectFutureBySelectionCriteria(
Connection
parmDBCon, JSBS_MinimalParameters parmMinParm,
String
parmSelectionVariableName1, int
parmSelectionVariableName2)
{/* 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,
parmSelectionVariableName1); SQLStatement.setInt(5,
parmSelectionVariableName2);/* 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
locstructapplication_dbtable_DBA
=
new
application_dbtable_DBA(); locstructapplication_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(locstructapplication_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 sindDie
Arbeiten für die Adaptierungen der Platzhalter sind gleich wie für
den Abschnitt Adaptieren
der Methode(n)
selectBySelectionCriteria.
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
selectValidAndFutureBySelectionCriteria(
Connection
parmDBCon, JSBS_MinimalParameters parmMinParm,
String
parmSelectionVariableName1, int
parmSelectionVariableName2)
{/* 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,
parmSelectionVariableName1); SQLStatement.setInt(4,
parmSelectionVariableName2);/* 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
locstructapplication_dbtable_DBA
=
new
application_dbtable_DBA(); locstructapplication_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(locstructapplication_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. |