Einführung in die Informatik - Teil XV – Datenbanken mit dem

Werbung
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
Einführung in die Informatik
- Teil XV –
Datenbanken mit dem JBuilder
Inhalt:
1. Einordnung in den Unterricht
2. Datenzugriff auf Access-Tabellen
2.1 Anlegen einer Tabelle
2.2 Zugriff auf die Tabelle
2.3 Zugriff auf Tupel („Records“)
2.4 Zugriff auf einzelne Tabellenelemente
3. Zugriff auf Datenbanken
3.1 OBDC-Treiber installieren und einrichten
3.2 Auf OBDC-Verknüpfungen zugreifen
3.3 SQL-Abfragen unter JBuilder
Literaturhinweise:
• Küchlin/Weber: Einführung in die Informatik, Objektorientiert mit Java,
Springer 1998
• Krüger, Guido: Handbuch der Java-Programmierung,
http://www.javabuch.de oder Addison Wesley 2002
S.
1
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
S.
2
1. Einordnung in den Unterricht
Datenbanken lassen sich gut mit den dafür vorgesehenen Tools bearbeiten, z. B. mit mySQL
oder MS-Access. Beschäftigen wir uns etwa mit Anfragen an die anonymisierten Schuldaten
von Herrn Beckmann, dann reichen diese Werkzeuge auch völlig aus, weil wir uns ja für einzelne Daten(mengen), Zählergebnisse, Mittelwerte etc. interessieren. Ganz anders sieht es aus,
wenn diese Daten
•
entweder mit Methoden ausgewertet werden sollen, die die Standardtools nicht beherrschen,
•
oder Ergebnisse z. B. grafisch aufbereitet werden sollen.
Beide Themenbereiche liefern Aufgabenstellungen unterschiedlichster Art, die für praktische
Schülerarbeit geeignet und vom Anspruch wieder über einen weiten Bereich skalierbar sind.
Insbesondere finden wir auch sehr einfache Aufgaben, die für Programmieranfänger geeignet
sind. Auf diese Art lassen sich z. B. Datenschutzfragen leicht in einen Anfängerkurs integrieren, ohne auf praktisches Arbeiten zu verzichten.
In jedem Fall benötigen wir den Zugriff auf Datenbanken – und da gibt es zumindest zwei
Möglichkeiten:
•
Entweder greifen wir auf die Tabellen eines Datenbanksystems direkt zu
•
oder wir nutzen einen SQL-Server, um den zu befragen.
In diesem Kurs wollen wir für den ersten Fall MS-Access-Tabellen benutzen, für den zweiten
mySQL.
2. Datenzugriff auf AccessTabellen
2.1 Anlegen einer Tabelle
Wir starten MS-Access und legen eine neue,
leere Datenbank an. Nach Auswahl eines geeigneten Unterverzeichnisses auf der Festplatte
(vielleicht im Verzeichnis Datenbanken) erstellen wir eine neue Tabelle in der Entwurfsansicht und geben die gewünschten Attribute
mit jeweiligem Datentyp ein. Eins der Attribute
sollte sich als Schlüsselfeld eignen. Um Dubletten zu vermeiden wählen wir meist dafür
einen „Autowert“. Textfelder sollten wir in der
Länge etwas beschränken (50 Zeichen sind
meist zu viel).
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
S.
3
Nach dem Speichern des Entwurfs wechseln wir in die Datenblattansicht und geben Daten
ein. Das Ergebnis wird wieder gespeichert – fertig!
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
S.
4
2.2 Zugriff auf die Tabelle
Unter Java können wir auf alle Tabellen zugreifen, für die es einen JDBC- oder OBDCTreiber gibt. Weil wir Access-Datenbanken über einen OBDC-Treiber bereitstellen können,
haben wir also auch auf diese Zugriff. Hier wollen wir als Werkzeug den JBuilder benutzen,
weil der auf diesem Gebiet sehr viel leistungsfähigere Komponenten bereitstellt.
Der Zugriff erfolgt mehrstufig:
• Zuerst wird für die Datenbank ein OBDC-Treiber bereitgestellt (s. u.). Dazu benutzen wir
die Verwaltung in der Systemsteuerung.
In dieser wählen wir einen AccessTreiber aus und danach die zu öffnende Datenbank.
Danach steht die Datenbank (hier: test) zum
Zugriff bereit.
Da ist sie!
Jetzt starten wir den JBuilder, erzeugen ein neues
Projekt und in dem eine Anwendung. In diese
fügen wir aus der DataExpess-Komponentenleiste eine DataBase-Komponente in das Formular
ein (im Designer). Deren Eigenschaft connection
wird auf den Wert sun.jdbc.odbc.JdbcOdbcDriver gesetzt – durch Auswahl aus der
angegebenen Liste. Danach können wir eine der offenen OBDC-Datenbanken wählen. Der
Button Testverbindung dient zum Überprüfen der Verbindung.
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
S.
5
• Anschließend fügen wir eine QueryDataSet-Komponente hinzu und stellen bei der query-Eigenschaft unsere Datenbank database1 und als Abfrage select * from schueler ein.
Auch hier sollten wir die Testabfrage erfolgreich absolvieren.
• Jetzt können die Daten angezeigt werden. Am einfachsten geht das mit einer JdbTableKomponente aus der dbSwing-Palette. Diese fügen wir der Anwendung hinzu, setzen die
constraints-Eingenschaft auf CENTER und wählen in der dataset-Eigenschaft die Query-Komponente aus.
• Jetzt können wir das Programm laufen lassen. Zu sehen sind alle Daten der SchuelerTabelle der Access-Datenbank.
fertig!
Das war die Minimal-Version einer Abfrage.
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
S.
6
2.3 Zugriff auf Tupel („Records“)
Meist will man nicht die ganze Tabelle sehen, sondern nur einen Ausschnitt davon. Wir könnten z. B. die Elemente eines Tupels („Datensatzes“) in einzelnen Editierfeldern des Typs JdbTextField aus der dbSwing-Palette anzeigen, die insgesamt ein Formular bilden. Als Hilfsmittel dafür steht dort auch die JdbNacToolBar-Komponente bereit, mit man sich durch die
Tabelle bewegen kann und ggf. auch Datensätze hinzufügt bzw. entfernt.
Als Beispiel platzieren wir die Navigations-Toolbar und einfache Datenbank-Textfelder auf
das Formular. Diese verbinden wir über die dataSet-Eigenschaft jeweils mit dem QueryDataset. Bei den Textfeldern wählen wir zusätzlich das anzuzeigende Attribut über die Eigenschaft columnName.
JdbText
Field
JdbNav
Toolbar
Attribut
auswählen
Obwohl wir keine Zeile Programmtext geschrieben haben, können wir jetzt im laufenden Programm die Datensätze der Tabelle durchblättern.
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
S.
7
2.4 Zugriff auf einzelne Tabellenelemente
Der Zugriff auf einzelne Felder der Relation kann auf höchst unterschiedliche Art geschehen.
Wir wollen ihn hier auf dem kleinen Umweg über eine jdbTable-Komponente realisieren,
weil diese Komponente schon bekannt und sehr anschaulich ist. Damit das Bild durch deren
Erscheinen nicht gestört wird, setzen wir die visible-Eigenschaft dieser Komponente im
Eigenschaftsfenster auf false. Statt der Tabelle wollen wir in dem Fenster eine Grafik
erzeugen, die auf der Auswertung der in der Tabelle gespeicherten Daten beruht: in unserem
Fall stellen wir einfach die Altersmittelwerte von Jungen und Mädchen dar.
Eine Tabelle können wir uns als eine Liste von Spalten („Columns“) vorstellen, über die eine
Art Sichtfenster geschoben wird. Die in diesem Fenster erscheinenden Daten stellen das aktuelle Datentupel dar.
PNr
2
1
Name
Müller
Meier
Alter
17
18
Geschlecht
w
m
2
Müller
17
w
3
Hansen
18
w
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
ausgewählte
Zelle
aktuelles
Tupel
im
„Sichtfens
ter“
Tabelle
Spalte
Auf einzelne Zellen der Tabelle können wir mit der Tabellenmethode getValueAt(…) zugreifen, wobei als Parameter die Zeilen- und die Spaltennummer übergeben wird. Die Anzahl
der Zeilen erhalten wir mit getRowCount(), die der Zeilen mit getColumnCount(). Da wir
als Inhalt der Tabellenzelle ein Objekt zurück erhalten, müssen wir einen Typecast durchführen, um dieses in eine verarbeitbare Form zu bringen.
Also los:
double mwJ = 0, mwM = 0;
boolean berechnet = false;
Mittelwerte
wurden die Werte schon berechnet?
void jButton1_actionPerformed(ActionEvent e)
alle Zeilen
{
durchlaufen
int alterJ = 0, alterM = 0, anzJ = 0, anzM = 0;
for (int i = 0; i < jdbTable1.getRowCount(); i++)
{
das Geschlecht
String s = jdbTable1.getValueAt(i,4).toString();
überprüfen
if (s.equals("m"))
{
anzJ++;
alterJ = alterJ + ((Integer) jdbTable1.getValueAt(i, 3)).intValue();
}
else
Werte für die Jungen
{
anzM++;
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
}
}
S.
8
alterM = alterM + ((Integer) jdbTable1.getValueAt(i, 3)).intValue();
}
if(anzJ>0) mwJ = alterJ/anzJ;
if(anzM>0) mwM = alterM/anzM;
berechnet = true;
repaint();
public void paint(Graphics g)
{
g.setColor(Color.black);
g.drawLine(25,250,200,250);
if(berechnet)
{
int J = 10*(int) Math.round(mwJ);
int M = 10*(int) Math.round(mwM);
g.setColor(Color.blue);
g.fillRect(50, 250-J, 50, J);
g.setColor(Color.red);
g.fillRect(120, 250-M, 50, M);
}
}
Mittelwerte berechnen
und Diagramm zeichnen
Diagramm
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
S.
9
3. Zugriff auf Datenbanken
3.1 OBDC-Treiber installieren und einrichten
Der Datenzugriff auf Tabellen und Datenbanken von anderen Programmen aus ist unter
Windows unter OBDC möglich (Open Database Connectivity). Dafür werden Treiber benötigt, die die Tabellendaten standardisierter Form aufbereiten. Für Microsoftprodukte sind
diese Treiber natürlich meist schon bei der Installation vorhanden, für andere Programme
müssen sie installiert werden. Als Beispiel wollen wir die anonymisierten Schuldatenbank
von Herrn Beckmann mit mySQL befragen.
1. Dazu müssen wir zuerst den aktuellen
OBDC-Treiber von mySQL im Internet
suchen, herunterladen und installieren.
Ich gebe dazu meist in einer Suchmaschine „mySQL“ ein, erhalte eine der
möglichen Adressen für Downloads
(die ich mir nicht merken will) und suche dort den richtigen Treiber, der von
der Betriebssystemversion abhängt. Für
Windows 2000, -NT und –XP wird der
Treiber myODBC-NT benötigt, derzeit
in der Version 2.50.39. Dieser wird
entpackt und installiert (mit Setup) –
fertig.
2. Jetzt müssen wir mithilfe dieses
Treibers eine ODBC-Verknüpfung zu
der gewünschten Datenbank herstellen.
Wir gehen dazu in die Windows-Systemsteuerung und wählen im Ordner
Verwaltung den Unterpunkt „Datenquellen (ODBC) Verknüpfung“ o. ä.
Dort klicken wir „Hinzufügen“ an und
wählen den mySQL-Treiber aus (ziemlich weit unten). Danach klicken wir auf „Fertig
stellen“ und geben die für die Verknüpfung benötigten Daten an:
•
den Namen, unter dem die Verknüpfung erscheinen soll (Windows DSN name). Hier:
Schule
•
den Ort des mySQL-Servers. Läuft der auf dem gleichen Rechner: localhost.
•
den Namen der (existierenden) mySQL-Datenbank. Hier: schule
•
den Namen und das Password eines eingetragenen Benutzers. Hier: emodrow und …
(sag ich nicht!)
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
S.
10
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
S.
11
3.2 Auf OBDC-Verknüpfungen zugreifen
Jetzt geht es wie bisher weiter: Unter JBuilder richten wir eine Database-Komponente ein
und setzen den Wert der connection-Eigenschaft, indem wir eine existierende ODBC-Verknüpfung und den JBDC:OBDC-Treiber von Sun auswählen:
Danach testen wir die Verbindung.
Dann fügen wir eine dbDisposMonitor-Komponente aus der Mehr dbSwing-Palette hinzu,
setzen deren dataAwareComponentContainer-Eigenschaft auf this und sorgen so dafür,
dass die Verbindung zur Datenbank „anständig“ beendet wird.
Jetzt kommt eine QueryDataSetKomponente hinzu, deren query-Eigenschaft die Verbindung zu Datenbank
schafft. Auch diese Verbindung testen wir
sicherheitshalber!
Jetzt können wir andere Datenzugriffskomponenten auf diese DataSource einstellen, z. B. eine jdbTable. In diesem
sollten sofort die Ergebnisse der SQLAbfrage angezeigt werden. Wollen wir
diese jetzt in eigenen Programmteilen auswerten, dann können wir genauso weitermachen wie im letzten Abschnitt: Diagramme zeichnen, …
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
S.
12
3.3 SQL-Abfragen unter JBuilder
Zuletzt wollen wir ein JBuilder-Formular dafür benutzen, direkt SQL-Anfragen an eine Datenbank einzugeben und deren Ergebnisse in einem jdbTable darzustellen. Das hat nebenbei
den Vorteil, von der spartanischen DOS-Box des mySQL-Clients wegzukommen und die
Ergebnismenge in einem scrollbaren Fenster zu sehen.
Wir benötigen für dieses Vorhaben nur sehr wenig:
•
eine TextArea-Komponente, um die Anfragen einzugeben,
•
einen Button, um diese Eingabe auszuwerten
•
eine TableScrollPane, um größere Tabellen darzustellen
•
und in dieser eine JdbTable, um die Ergebnisse der Anfrage darzustellen.
TextArea zur Eingabe
der SQL-Abfrage
Start-Button
TableScrollPane
und jdbTable zur
Anzeige der Daten
Der Eventhandler des Auswerte-Buttons muss jetzt die Anfrage starten und darstellen. Dazu
gehen wir wie folgt vor:
• Wir holen den Text der SQL-Abfrage aus der TextArea:
String h = jTextArea1.getText();
• Dann schließen wir die alte Abfrage:
queryDataSet1.close();
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
S.
13
• Der neue Abfragetext wird der Query-Komponente übergeben, eingebettet in ein neues
QueryDescriptor-Objekt, das auch den Namen der benutzten Datenbank enthält:
queryDataSet1.setQuery(new QueryDescriptor(database1, h));
• Dann öffnen wir die Abfrage wieder:
queryDataSet1.open();
• Das Ganze wird in einen try-.. catch ..-Block eingebettet, um Fehler abzufangen.:
void jButton1_actionPerformed(ActionEvent e)
{
String h = jTextArea1.getText();
try
{
queryDataSet1.close();
queryDataSet1.setQuery(new QueryDescriptor(database1, h));
queryDataSet1.open();
}
catch(Exception ex)
{
JOptionPane.showMessageDialog(this,ex.getMessage() );
}
}
Damit lässt sich jetzt einiges anfangen!
Suchen wir doch mal alle Schülerinnen, deren Nachname mit „B“ anfängt:
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
Werden eigentlich die Mädchen schlecht benotet in Physik?
Wohl nicht.
Und wie sieht es in den anderen Fächern aus?
S.
14
Virtuelle Lehrerweiterbildung Informatik in Niedersachsen
Eckart Modrow
Datenbanken mit dem JBuilder
Wie zensieren eigentlich die lieben Kolleginnen und Kollegen in den Leistungskursen?
Und insgesamt?
Wie gut, dass die Daten anonymisiert worden sind!
S.
15
Herunterladen