Lehrer Nussbaumer - JAVA (eine kleine Einführung ;) |
---|
GrundlagenGUIEingabeAusgabeApplikationenAppletsServletsBeispieleSpieleIDEsSkriptumJAVA-DOCS----------------- letzte Änderung: 09 December 2021 ----------------- Lehrer Nussbaumers Seite ... in Arbeit ... |
MySQLVoraussetzungen
Datensätze anzeigen, GrundlagenIm ersten Beispiel sollen alle Datensätze einer MySQL-Tabelle ausgegeben werden. Dazu ist es zunächst notwendig, eine Verbindung zum MySQL-Server herzustellen. Dies ist mittels JDBC (Java Database Connectivity) möglich, welches von der Firma SUN entwickelt wurde, um den Zugriff auf externe Datenbankschnittstellen zu ermöglichen. Das Package java.sql stellt die entsprechenden Interfaces und Klassen zur Verfügung, eine detallierte Beschreibung dazu findet sich in der Dokumentation zu Java (http://java.sun.com/j2se/1.4.2/docs/index.html). Für die Beispiele verwenden wir die einfach aufgebaute MySQL-Tabelle weblinks: mysql> describe weblinks; +-----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+----------------+ | id | int(11) | | PRI | NULL | auto_increment | | kategorie | char(3) | YES | | NULL | | | url | varchar(120) | YES | | NULL | | | notiz | text | YES | | NULL | | | datum | date | YES | | NULL | | +-----------+--------------+------+-----+---------+----------------+ Auf dem MySQL-Server hat der Benutzer nus lediglich Zugriff auf die Datenbank mdat_nus. Zunächst muss der MySQL-Treiber mit der Methode Class.forname() geladen werden. Die Methode DriverManager.getConnection() stellt schließlich die Verbindung zur Datenbank her: Dabei müssen die Datenquelle mit URL und Name der Datenbank, der Benutzername, der auf die Datenbank zugreifen darf, und das Passwort des Benutzers angegeben werden. Ist dies erfolgreich, so liefert getConnection() einen Datenbankhandler (im Beispiel das Connection-Objekt con) zurück, mit dem schließlich die gewünschten SQL-Abfragen realisiert werden können. Die Methode con.createStatement() liefert dabei das Statement-Objekt stmt, aus dem alle gefundenen Datensätze mit der Methode stmt.executeQuery() ausgelesen werden: Das Ergebnis dieser Abfrage wird im ResultSet-Objekt rslt zurückgegeben, dessen Methode rslt.next() die Ausgabe aller Datensätze erlaubt: import java.sql.*; public class mysql1 { public static void main(String args[]) { treiber_laden(); daten_ausgeben(); } public static void treiber_laden() { try { Class.forName("com.mysql.jdbc.Driver"); } catch (Exception e) { System.out.println(e.getMessage()); } } public static void daten_ausgeben() { try { Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/mdat_nus","nus","pwd); Statement stmt = con.createStatement(); ResultSet rslt = stmt.executeQuery("select * from weblinks"); while (rslt.next()) { System.out.println(rslt.getInt(1) + "\t" + rslt.getString(2) + "\t" + rslt.getString(3) + "\t" + rslt.getDate(5)); } stmt.close(); con.close(); } catch (Exception e) { System.out.println(e.getMessage()); } } } Nach dem Kompilieren erhalten wir eine einfach formatierte Ausgabe der Datensätze: 1 edv http://www.mysql.com 2003-12-30 2 phy http://www.cern.ch 2003-12-31 Man beachte die ResultSet-Methoden rslt.getInt(), rslt.getString() und rslt.getDate(), mit denen die einzelnen Datenfelder des jeweiligen Datensatzes ausgegeben werden. Als Parameter wird jeweils die Position des Datenfeldes als ganze Zahl (beginnend ab 1) übergeben. Datensätze hinzufügenDie Statement-Methode stmt.executeUpdate() erlaubt neue Datensätze in eine Tabelle zu schreiben. public static void daten_hinzufuegen() { try { Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/mdat_nus","nus","pwd"); Statement stmt = con.createStatement(); stmt.executeUpdate("insert into weblinks values('','edv','http://www.novell.com','',now())"); stmt.close(); con.close(); } catch (Exception e) { System.out.println(e.getMessage()); } } Die Methode executeUpdate() übermittelt ein SQL-Statement, sie liefert jedoch kein Ergebnis zurück. Allfällige SQL-Fehler werden als Exception erkannt. Soll eine SQL-Anweisung wiederholt ausgeführt werden, ist es günstiger so genannte PreparedStatement-Objekte zu verwenden: Mit der Connection-Methode prepareStatement() wird eine SQL-Anweisung zunächst mit Hilfe von Platzhaltern an den MySQL-Server gesendet und übersetzt; anschließend erfolgt mit den PreparedStatement-Methoden setInt(), setString(), usf. die Zuweisung von Inhalten. Die PreparedStatement-Methode executeUpdate() aktualisiert schließlich die MySQL-Tabelle.public static void daten_hinzufuegen() { try { Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/mdat_nus","nus","pwd"); PreparedStatement ppstmt = con.prepareStatement( "insert into weblinks values('',?,?,?,now())"); ppstmt.setString(1,"edv"); ppstmt.setString(2,"http://www.heise.de"); ppstmt.setString(3,"IT-Nachrichten online"); ppstmt.executeUpdate(); ppstmt.close(); con.close(); } catch (Exception e) { System.out.println(e.getMessage()); } } Datensätze löschenEinzelne Datensätze sollen anhand der eindeutigen id ausgewählt und gelöscht werden. In der entsprechenden SQL-Anweisung ist der Parameter für die id in der where-Klausel enthalten: public static void daten_loeschen() { try { Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/mdat_nus","nus","pwd"); PreparedStatement ppstmt = con.prepareStatement("delete from weblinks where id = ?"); ppstmt.setInt(1,4); ppstmt.executeUpdate(); ppstmt.setInt(1,3); ppstmt.executeUpdate(); ppstmt.close(); con.close(); } catch (Exception e) { System.out.println("e.getMessage()); } } Zu beachten ist, dass die PreparedStatement-Methode executeUpdate() nach jeder Belegung des Parameters aufgerufen werden muss. Datensätze verändernIn diesem Beispiel soll die Kurzbezeichnung für die Kategorie geändert werden. Dabei wird die neue Bezeichnung ikt für alle Datensätze eingetragen, für die die Klausel where kategorie = edv erfüllt ist. public static void daten_aendern() { try { Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/mdat_nus","nus","pwd"); PreparedStatement ppstmt = con.prepareStatement("update weblinks set kategorie=? where kategorie=?"); ppstmt.setString(1,"ikt"); ppstmt.setString(2,"edv"); ppstmt.executeUpdate(); ppstmt.close(); con.close(); } catch (Exception e) { System.out.println(e.getMessage()); } } Beispiel - Applikation: HäufigkeitsanalyseEin Applikation soll eine Statistik über die Anzahl der Linkeinträge zu den bestimmten Kategorien grafisch ausgeben. mysql> select kategorie, count(kategorie) -> from weblinks -> group by kategorie; +-----------+------------------+ | kategorie | count(kategorie) | +-----------+------------------+ | ang | 2 | | ast | 4 | | ikt | 12 | | mat | 3 | | new | 7 | | phy | 6 | | rel | 1 | +-----------+------------------+ 7 rows in set (0.00 sec) Für die folgende JFrame-Anwendung müssen zusätzlich die Packages java.awt, java.awt.event, und javax.swing geladen werden. Um die Länge der Balken an die Fenstergröße anzupassen wird in einem ersten Durchgang das Maximum der ermittelten Häufigkeiten ermittelt: Die Länge der Balken wird schließlich im richtigen Verhältnis zum zur Verfügung stehenden Platz (im Beispiel 220 Pixel) dargestellt. import java.sql.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class mysqlapp extends JFrame { mysqlapp() { super("MySQL - Weblinks"); setBackground(Color.white); } public static void main(String args[]) { mysqlapp proggi = new mysqlapp(); WindowListener wl = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; proggi.addWindowListener(wl); proggi.setSize(400,250); proggi.show(); } public void paint(Graphics bs) { try { Class.forName("com.mysql.jdbc.Driver"); } catch (Exception e) { System.out.println(e.getMessage()); } try { Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/mdat_nus","nus","n7bt.new"); Statement stmt = con.createStatement(); ResultSet rslt = stmt.executeQuery( "select kategorie, count(kategorie) from weblinks group by kategorie"); int i=0; int anzahl; int max = 0; bs.setColor(Color.blue); while (rslt.next()) { anzahl = rslt.getInt(2); if (anzahl > max) max = anzahl; } System.out.println(max); rslt = stmt.executeQuery( "select kategorie, count(kategorie) from weblinks group by kategorie"); while (rslt.next()) { bs.drawString(rslt.getString(1),20,i*20+50); bs.fillRect(60,i*20+35,(int) (((double)rslt.getInt(2)/max) * 220),18); i++; } stmt.close(); con.close(); } catch (Exception e) { System.out.println(e.getMessage()); } } } AufgabenIn Verbindung zu bekannten Themen (etwa PHP und MySQL, Verwendung von Office-Datenbanken) können zahlreiche Aufgabenstellungen mit JAVA-Applikationen realisiert werden. Applets haben aufgrund der Sicherheitseinschränkungen keinen Zugriff auf Datenbankserver.
WebLinks
|