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