Lehrer Nussbaumer - JAVA (eine kleine Einführung ;)

Grundlagen

GUI

Eingabe

Ausgabe

Applikationen

Applets

Servlets

Beispiele

  1. Ein- und Ausgabe
  2. Textdateien
  3. Kryptographie
  4. MySQL
  5. DOM
  6. SAX
  7. JDOM

Spiele

IDEs

Skriptum

JAVA-DOCS


-----------------
letzte Änderung:
09 December 2021
-----------------
Lehrer Nussbaumers Seite

... in Arbeit ...

MySQL

Voraussetzungen

  1. Ein MySQL-Server muss entweder am lokalen Rechner oder im Netzwerk erreichbar sein; im Rahmen der folgenden Beispiele wurde MySQL der Version 4.0.15 verwendet. Entsprechende Berechtigungen müssen für die Verbindung mit dem Server und für den Zugriff auf die Datenbank vorhanden sein.
  2. Für JAVA ist zusätzlich zum java.sql-Package der MySQL-Treiber MySQL Connector/J erforderlich. Aktuelle Versionen liegen auf der MySQL-Webseite als .zip- oder .tar.gz-Dateien bereit (http://www.mysql.com/downloads). Für die folgenden Beispiele wurde die Version mysql-connec]tor-java-3.0.9-stable.tar.gz verwendet. Nach dem Entpacken dieser Datei liest man am besten die mitgelieferte README-Datei: Hier wird u.A. angegeben, dass das notwendige .jar-Archiv mysql-connector-java-3.0.9-stable-bin.jar in das entsprechende $JAVA_HOME-Verzeichnis kopiert werden muss:
    nus@ice:~> ls $JAVA_HOME/jre/lib/ext
    dnsns.jar    
    localedata.jar 
    sunjce_provider.jar 
    ldapsec.jar  
    mysql-connector-java-3.0.9-stable-bin.jar
    Alternativ dazu kann der Ort des .jar-Archives über die CLASSPATH-Variable angegeben werden.

Datensätze anzeigen, Grundlagen

Im 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ügen

Die 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öschen

Einzelne 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ändern

In 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äufigkeitsanalyse

Ein Applikation soll eine Statistik über die Anzahl der Linkeinträge zu den bestimmten Kategorien grafisch ausgeben.



Wie oft ein Eintrag zu einer bestimmten Kategorie besteht kann am besten mit Hilfe der MySQL-Aggregatfunktion count() bestimmt werden:

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());
    }
  }
}

Aufgaben

In 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.

  • Eine Applikation ist zu erstellen, mit der die Eingabe und Ausgabe der Datenbankinhalte über entsprechende GUI-Objekte erfolgen (Textfelder, Labels, Buttons, etc.).
  • Mit Hilfe der JDBC-ODBC-Bridge für MS-ACCESS sind Datensätze einer ACCESS-Tabelle auszugeben.
  • ...

WebLinks


© Alfred Nussbaumer, Weblog "MiniNuss"