JDBC

 

MySQL

JDBC steht für "Java Data Bank Connectivity". Dieses Feature von Java ermöglicht es, dass wir von Java aus auf praktisch alle auf der Welt existierenden Datenbanksysteme zugreifen können. Beispiele sind wie immer die von Microsoft (Access, Firefox, etc.) Wir wollen uns aber hier mit demjenigen Datenbanksystem befassen, welches auf dem Webserver der Schule eingerichtet ist: MySQL ist ein frei erhältliches Datenbanksystem, welches mittlerweile sehr verbreitet und fast bei jedem Webspace - Provider zugänglich ist. Falls Sie mehr über MySQL wissen möchten, sehen Sie sich auf der Website des Projektes um: http://dev.mysql.com/. Hier können Sie den MySQL Server herunterladen, die Dokumentation studieren, ... und wenn Sie wollen, auch am MySQL Projekt mitarbeiten!

Die nachfolgende Figur soll das Zusammenspiel der Komponenten etwas erläutern: Auf der "Client Machine", also auf Ihrem PC läuft die Java Application, welche Sie gleich erstellen werden. Diese greift über die JDBC Schnittstelle auf den Database server zu. In unserem Falle ist das der MySQL Server, welcher auf www2.dgb.ch läuft. Weil auf diesen Server mit einem "proprietary protocol" zugegriffen wird, braucht JDBC noch einen MySQL spezifischen Treiber. Wir verwenden den "Connector/J".

JDBC ist im Java Developer Kit bereits vorhanden. Was uns fehlt, ist der Treiber. Dieser ist frei erhältlich. Damit Ihr JCreator Projekt auf MySQL zugreifen kann, sind folgende Schritte nötig:

  • Erstellen Sie ein neues Projekt z.B. namens Datenbank vom Typ Basic Java Application.
  • Kopieren Sie den Treiber, den Sie hier als jar-Archiv finden in den Ordner Ihres Projektes.
  • Teilen Sie JCreator mit, dass er bei diesem Projekt auch im soeben kopierten Archiv nach Klassen suchen soll und zwar folgendermassen: Wählen Sie Menü "Project", "Project Properties", "JSDK1.4..." anklicken, "Edit", "Add", "Archive". Suchen Sie die Datei mysql-connector-java-3.1.8-bin.jar, klicken Sie sie an und wählen Sie "Öffnen", "OK", "OK".

Ihr Projekt ist so vorbereitet, dass es eine Verbindung zu einer MySQL Datenbank herstellen kann.Jetzt soll Ihr Projekt so ausgebaut werden, dass die Applikation auf eine bereits bestehende Datanbank - Tabelle zugreift und deren Inhalt darstellt. Dabei gibt es folgende Schritte:

  1. Treiber für MySQL holen.
  2. Verbindung zum Server herstellen.
  3. Datenbankabfrage durchführen
  4. Resultate anzeigen.
  • Als Vorbereitung erstellen Sie noch ein GUI - Element, in welchem Ihnen Meldungen und Resultate angezeigt werden. Ich habe eine TextArea vorgesehen, weil diese mehrzeilig ist: Deklarieren Sie die TextArea als Klassenvariable, also vor dem Konstruktor, gleich nach "public class DatenbankFrame...":

    TextArea area;

    und erzeugen Sie eine Instanz von TextArea im Konstruktor:

    area = new TextArea("Start");
    add(area);

  • Jetzt kommen wir zur Datenbank. Das Package, in welchem sich die Klassen der JDBC befinden heisst sql - warum dieser Name sehen Sie später. Also importieren Sie zusätzlich:

    import java.sql.*;
  • Die ganze Danenbankkommunikation habe ich in einer Methode namens verbindung() vorgesehen, also rufen Sie diese am Ende des Konstruktors auf mit:

    verbindung();
  • Deklarieren Sie die Methode nach dem Konstruktor, vor oder nach der Methode windowClosed():

    // Verbindung zur Datenbank:
    void verbindung() {
      area.setText("Connecting ...");
      Connection conn = null;
      Statement stmt = null;
      ResultSet rs = null;
      try {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        area.setText("Driver found ...");
      } catch (Exception e) {
        area.setText("No driver!");
      }
    }

Erklärungen:

  1. Als erstes schreiben wir in die TextArea, dass wir jetzt am Verbinden sind.
  2. Dann deklarieren wir drei Variablen: conn wird unsere Verbindung sein, stmt der Abfragebefehl und rs as Abfrageresultat. Wir setzen alle auf "null", damit sind sie definiert und zeigen mal "ins Leere".
  3. Die folgenden Statements sind in einem try - catch - Block, weil da etwas schief gehen könnte, also eine "Exception" auftreten könnte. In der geschweiften Klammer nach try stehen die "gefährdeten" Anweisungen, in der runden Klammer nach catch, steht, welche Exception wir "abfangen" und in der geschweiften Klammer, was zu tun ist, wenn der Fehler auftritt.
  4. Die Methode forName holt uns den Treiber. Wenn das gut gegangen ist, schreiben wir "Driver found..." und sonst "No driver!"
  • Testen Sie. Wenn Sie nicht "Driver found ..." sehen, geht es auf Fehlersuche!
  • Im zweiten Schritt stellen wir anschliessend die Verbindung zur Datenbank her, wieder analog in einem try - catch - Block. Im nachfolgenden Quelltext ist das wirkliche Passwort einzusetzen - fragen Sie mich!

    try {
      conn = DriverManager.getConnection("jdbc:mysql://www2.dgb.ch/javakurs?user=javakurs&password=***");
      area.setText("Connected.");
    } catch (SQLException e) {
      area.setText("No connection!");
    }


  • Damit besteht eine Verbindung zur Datenbank javakurs auf www2.dgb.ch. Jetzt holen wir uns den Inhalt der Tabelle test dieser Datenbank:

    try {
    stmt = conn.createStatement();
    rs = stmt.executeQuery("SELECT * FROM test");
    } catch (SQLException e) {
    area.setText("Error in query!");
    }
  • Mit createStatement() haben wir einen Abfragebefehl gemacht und ihn mit executeQuery an den Server geschickt. "SELECT ..." wird noch erklärt. das Resultat ist in rs. Jetzt müssen wir noch das Resultat darstellen:

    String s = "Resultate:\n";
    try {
      while (rs.next()) {
        s = s + "\n" + rs.getString("name");
        s = s + "\t" + rs.getString("vorname");
        area.setText(s);
    }
    } catch (SQLException e) {
      area.setText("Error in result set!");
    }

Erklärungen zu beiden Erweiterungen

  1. Der Parameter von executeQuery() ist ein SQL Befehl. SQL ist eine Datenbanksprache. Genauere Angaben folgen. Hier nur die Erklärung dieses Befehls: SELECT * FROM test bedeutet folgendes: Wähle (selcet) alles (*) aus (from) der Tabelle test.
  2. String s wird am Schluss in der TextArea dargestellt. Zuerst enthält er "Resultate" und einen Zeilenvorschub "\n". Später werden mit "s = s + ..." weitere Dinge an den String angehängt.
  3. In der While - Schlaufe wird das Resultat rs ausgewertet. Die Methode next() holt den nächsten Datensatz (Record) aus dem Resultat und liefert als Rückgabewert true, wenn es noch einen hat und false andernfalls.
  4. getString() holt aus einem Datensatz ein Feld und wandelt es in einen String um. Als Paramerter müssen wir getString() den Namen des gewünschten Feldes angeben. In unserer Tabelle hat jeder Record (Zeile) die Felder (Spalten) nr, name, vorname und plz.
    :

 

SQL 

Damit haben Sie fast alle Javakenntnisse für den Umgang mit Datenbanken. Es gibt noch eine kleine Ergänzung: Befehle, welche Veränderungen in der Datenbank bewirken, werden mit der Methode executeUpdate() gesendet. Diese hat keinen Rückgabewert.

Wenn es darum geht, raffiniertere Abfragen zu machen oder Datenbankinhalte zu verändern oder sogar ganze Tabellen neu zu machen, ist die Sprache SQL gefragt. SQL steht für Standard Query Language. Diese Sprache wird von praktisch jedem Datenbanksystem verstanden und kann in vielen verschiedenen Programmiersprachen verwendet werden. Es lohnt sich also, SQL zu lernen! Deshalb hier ein kleiner SQL Crashkurs:

SELECT:
Select ist wohl der häufigste SQL Befehl. Wir brauchen ihn, wenn wir Daten aus einer Tabelle holen. Nach dem Befehl steht, was wir holen. Mit SELECT name FROM test würden wir also jeweils nur das Feld name holen. Hinter FROM steht der Name der Tabelle, aus welcher wir lesen. Und dahinter steht meist noch eine Abfragebedingung, z.B. SELECT name FROM test WHERE vorname = 'Vornamedrei'liefert alle Records, bei denen das Feld vorname den Wert Vornamedrei hat, in unserem Fall erhalten wir also alle Nachnahmen der Leute mit einem bestimmten Vornamen. Wichtig ist, dass man nicht nur auf Gleichhiet prüfen kann und dass es insbesondere möglich ist, auf Ähnlichkeit zu prüfen mit LIKE.

INSERT:
Mit Insert können wir Zeilen in eine Tabelle einfügen. Z.B. INSERT INTO test (name,vorname,plz) VALUES ('Hinz','Charly','1200')". Dabei sagen wir: füge eine Zeile in die Tabelle test ein, wobei das Feld name den Wert Hinz hat etc. Ein Beispiel wäre hier:

stmt.executeUpdate("INSERT INTO test (name,vorname,plz) VALUES ('Hinz','Charly','1200')");

Allgemeine Syntax von INSERT:

INSERT INTO <Tabellenname>(<Spaltenname> [, weitere Spaltennamen]) SELECT <Spalte-1> [, weitere Ausgaben] [FROM ...] [WHERE ...] [GROUP BY ...] [HAVING ...]

Natürlich kann hier kein Resultat ausgewertet werden.

Ein sehr schönes deutschsprachiges SQL Tutorial finden Sie z.B. hier: http://www.sql-und-xml.de/sql-tutorial/. Aus diesem Tutorial habe ich die obige allgemeine Syntax kopiert. Hier noch ein paar Stichworte zu weiteren SQL Befehlen (bitte verändern Sie nichts an den ursprünglichen drei Zeilen in der Tabelle test!):

UPDATE:
Inhalt vorhandener Zeilen verändern.
UPDATE <Tabelle> SET <Name einer Spalte> = <Ausdruck aus Spalten, Konstanten, Funktionen> [, weitere Spaltennamen = Ausdruck] WHERE <Bedingung>

DELETE:
Zeilen aus einer Tabelle löschen.
DELETE FROM <Tabelle> WHERE <Bedingung>

Speziellere Befehle sind z.B. im folgenden englischen Tutorial zu finden: http://www.w3schools.com/sql/

CREATE TABLE:
Neue Tabelle erstellen.
CREATE TABLE table_name (column_name1 data_type,column_name2 data_type,.......)

Wichtige Datentypen: text,

DROP TABLE:
Tabelle löschen.
DROP TABLE table_name

Damit sollten Sie einen "Starter" habe zum Thema Datenbanken und Java. Eine eigentliche Einführung in das Thema Datenbanken war's nicht. Falls Sie mehr wissen möchten, lesen Sie doch bitte im deutschsprachigen Tutorial das Kapitel "Grundlagen ...". Insbesondere ist das Thema relationale Datenbanken nicht zum Zuge gekommen (Befehl JOIN), das Thema Primärschlüssel und dass man bei Abfragen z.B. die Resultate sortieren kann.

Und jetzt wie immer: Ihre eigenen Ideen!