Teil 2 der MySQL-Serie

MySQL und Java: JDBC einrichten

Christian Barthel

Im ersten Teil ging es um die allgemeinen Grundlagen. Ich habe Ihnen kurz gezeigt, wie Sie eine SQL-Abfrage formulieren. Zudem haben wir eine Kunden-Klasse erstellt, mit der wir unsere Kundendatensätze aus der Datenbank in Java verwalten werden. In diesem Teil möchte ich Ihnen zeigen, wie Sie den JDBC-Treiber in Eclipse bzw. NetBeans einrichten. Danach werden wir eine Verbindung mithilfe eines JDBC-URLs herstellen.

JDBC-Treiber auftreiben und einbinden

Wir benötigen einen Treiber für eine MySQL-Datenbank. Diesen können wir im Internet unter dem URL http://www.mysql.de/downloads/connector/j/ bekommen. Sie haben zwei Downloadmöglichkeiten:

  • JDBC-Treiber in einem TAR-Archiv (für Linux): mysql-connector-java-5.1.12.zip (Die letzten Ziffern entsprechen der jeweiligen Versionsnummer: mysql-connector-java-x.xx.xx.zip
  • JDBC-Treiber in einer ZIP-Datei (für Windows): mysql-connector-java-5.1.12.tar.gz

Nachdem Sie den Treiber heruntergeladen haben, können Sie mit den jeweiligen Bordmitteln des Betriebssystems das Archiv entpacken.

Abb. 1: Entpacktes Verzeichnis

Nach dem Extrahieren sollten Sie ein neues Verzeichnis mit der Aufschrift mysql-connenctor-java-versionnummer sehen können. In diesem Verzeichnis befinden sich mehrere Dinge, z. B. die Quelldateien (src), Dokumentationen und die von uns benötigte JAR-Datei.

Die JAR-Datei (mysql-connector-java-5.1.12-bin.jar) müssen wir nun in unserer Entwicklungsumgebung einbinden. Ich zeige es Ihnen anhand von Eclipse und NetBeans.

Nochmals in Kürze: Es ist zwingend notwendig, diesen Treiber einzubinden, da ansonsten eine Datenbankabfrage nicht gestellt werden kann.
NetBeans

Nachdem Start von NetBeans sollten Sie im linken Fensterbereich das Projektverzeichnis sehen. Klicken Sie mit der rechten Maustaste auf den Ordner Libraries (der auch die Standard-Java-Bibliotheken enthält) ihres aktuellen Projekts (Abb. 2).

Abb. 2: Projektverzeichnis

Wählen Sie in dem aufgehenden Kontextmenü den Punkt „Add JAR/Folder“ aus

Danach bekommen Sie einen Auswahldialog angezeigt, in den Sie entweder eine JAR, ein ZIP oder direkt einen Folder angeben können. Ich wähle nun in diesem Auswahldialog das zuvor entpackte JAR-Archiv aus und bestätige den Vorgang mit „Öffnen“ (Abb. 3).

Abb. 3: Treiber lokalisieren und einbinden

Nach einer kurzen Ladezeit sollten Sie nun im Verzeichnisbaum unter „Libraries“ den eingebundenen MySQL-Connector sehen können (Abb. 4).

Abb. 4: Zusätzlich zum JDK gibts jetzt den MySQL Connector

[ header = Seite 2: Eclipse ]

Eclipse

Die Installation des JAR-Archivs unter Eclipse gestaltet sich ähnlich einfach.

Nachdem Sie Eclipse gestartet haben, müssen Sie mit Rechtsklick auf das jeweilige Projekt zu den „Properties“ (Eigenschaften) wechseln. (Rechtsklick auf den „Gesamt-Projektordner“ z. B. JavaDB; Abb. 5)

Abb. 5: Der Package-Explorer

Nach einem Klick auf Properties erhalten Sie sämtliche Einstellungsmöglichkeiten für das jeweilige Projekt (Abb. 6).

Abb. 6: Projektbezogene Einstellungsmöglichkeiten

Hier müssen wir zunächst in der linken Spalte auf das Register „Java Build Path“ wechseln. Auf der rechten Seite bekommen wir nun wieder mehrere Register: Hier muss „Libraries“ angeklickt werden (Abb. 7).

Abb. 7: "Add External JARs"

Unterhalb des Registerkopfes muss nun der Button „Add External JARs…“ gedrückt werden. Im darauffolgenden Auswahldialog können wir nun unseren JDBC-Treiber laden.

Nach einem Klick auf „Öffnen“ taucht unser Treiber dann auch schon in der Übersichtsspalte (mitte) auf (Abb. 8):

Abb. 8: JRE-Umgebung + MySQL Connector

Mit einem Klick auf OK gelangen Sie wieder in die Standardansicht. Auf der rechten Seite sollten Sie zusätzlich den neuen Treiber sehen können (Abb. 9):

 Abb. 9: Den MySQL-Connector finden sie unter "Referenced Libraries"

[ header = Seite 3: Verbindung herstellen ]

Verbindung herstellen

Nachdem wir nun unseren Treiber korrekt und funktionstüchtig eingebunden haben, können wir nun mit unserem Java-Programm Datenbankverbindungen aufbauen. Hierfür sollte zunächst eine eigene Klasse erstellt werden, die Sie zum Beispiel „DBVerbindung“, „IOManager“ oder „Connection“ nennen sollten. Im Folgenden werde ich meine Klasse IOManager nennen.

Zuerst die Imports angeben

Nachdem Sie korrekterweise die Paketinformation (falls diese Organisationsmöglichkeit von Ihnen benutzt wird, andernfalls lassen sie die Packetinformationen einfach weg) angegeben haben, folgen einige neue „Import“-Anweisungen. Theoretisch wäre es auch möglich, den vollständigen Pfad zur Java-Klasse anzugeben, da dies allerdings den Schreibaufwand erhöht und die Übersichtlichkeit vermindert, sollten Sie ebenfalls folgende Pakete importieren:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;
import java.sql.Date;

Alle datenbankspezifischen Pakete finden Sie unter java.sql.*. Den Vektor (java.util.Vector) benötigen wir, um die von der Datenbank zurückgelieferten Daten sinnvoll und einfach zu speichern. Alternativ könnte statt einem Vektor auch eine ArrayList oder gar ein Array verwendet werden – dies ist allerdings nicht so komfortabel wie der Vektor.

Verbindungsmethode

Da wir keine Aktion bei der Instanziierung der IOManager – Klasse haben wollen, belassen wir es bei einem leeren Konstruktor (dieser leere Konstruktor kann auch ganz weggelassen werden; er wird dann von dem Java Compiler leer hinzugefügt). In der Instanzvariable „connection“ werden wir die Verbindung, die durch die Methode „connectToMysql“ hergestellt wird, im Speicher ablegen.

. . . //Import-Anweisungen wurden zwecks Übersichtlichkeit entfernt
public class IOManager{
Connection connection;

public IOManager() {

}

public boolean connectToMysql(String host, String database, String user, String passwd){
try{
Class.forName("com.mysql.jdbc.Driver").newInstance();
String connectionCommand = "jdbc:mysql://"+host+"/"+database+"?user="+user+"&password="+passwd;
connection = DriverManager.getConnection(connectionCommand);
return true;

}catch (Exception ex){
System.out.println("false");
return false;
}
}
}

Die einzelnen Schritte nochmals:

  • in Zeile 2 beginnt natürlich jede Klasse mit dem Klassennamen und den üblichen Modizierern
  • in Zeile 3 befindet sich unsere Instanzvariable „connection“, in der wir unsere Verbindung ablegen werden (beinhaltet alle Informationen über den Datenbankserver, Passwörter, Benutzer, …)
  • In Zeile 5 – 7 folgt der leere Konstruktor
  • Ab Zeile 9 beginnen wir, eine Verbindung aufzubauen. Schauen wir uns diese Methode kurz nochmals näher an

[ header = Seite 4: connectToMysql ]

connectToMysql

Diese Methode erstellt unsere Datenbankverbindung und speichert diese in der Instanzvariable „connection“ ab. Als Parameter werden folgende String-Litorale benötigt:

  • Hostname  FQDN): Hierbei handelt es sich um unseren Datenbankserver, auf dem MySQL installiert ist.à(kann eine IP-Adresse oder ein vollständiger Domain-Name sein
  • Database (die Datenbank, die für die folgenden Abfragen relevant ist): Da auf einem Datenbankserver mehrere verschiedene Datenbanken vorhanden sein können, müssen Sie die Datenbank genauer spezifizieren (auch wenn nur eine Datenbank vorhanden sein sollte)
  • User (der Datenbankbenutzername, der Zugriff auf die gewünschte Datenbank hat) Hier müssen auch Aspekte der User-Right-Handlings beachtet werden. Hat ein Datenbankbenutzer nur Leserechte, so kann ich eben keine neuen Datensätze der Datenbank anfügen.
  • Passwort (das passende Passwort des oben genannten Users im Klartext)

Nach den Paramterangaben muss zunächst ein neuer TRY/CATCH-Block gestartet werden. Da bei dem Verbindungsaufbau zu einer Datenbank Dinge gemacht werden, die zur Laufzeit eben nicht „gesichert“ werden können, müssen die Exceptions entweder deklariert oder abgefangen werden. Verläuft der Verbindungsaufbau positiv, so gibt die Methode den Wert „true“ zurück (im TRY-Block). Wird im TRY-Block an irgendeiner Stelle eine Exception geworfen, so wird der CATCH-Block ausgeführt. In diesem Fall würde die Methode ein „false“ zurückliefern.

In der ersten Zeile des try-Blocks holen wir uns zunächst eine neue Instanz des MySQL-Treibers (muss natürlich vorhanden sein, da ansonsten bereits hier eine Exception – also Catch-Block – geworfen wird). Danach bauen wir einen String, der unsere JDBC-URL darstellt.

public boolean connectToMysql(String host, String database, String user, String passwd){
try{
Class.forName("com.mysql.jdbc.Driver").newInstance();
String connectionCommand = "jdbc:mysql://"+host+"/"+database+"?user="+user+"&password="+passwd;
connection = DriverManager.getConnection(connectionCommand);
return true;
}catch (Exception ex){
System.out.println("false");
return false;
}
}

Der JDBC-URL beinhaltet alle wichtigen Informationen, die benötigt werden, um eine Datenbankverbindung aufzubauen. Dabei sieht das Muster folgendermaßen aus:

  1. jdbc:db://[host][,failoverhost…][:port]/[database][?propertyName1][=propertyValue1][&propertyName2]...
  • „jdbc:“: Den Beginn macht JDBC, da es sich um 99 % der Fälle um einen Java Database Connectivity Driver handelt.
  • „db:“: Hier folgt die Datenbank:
    • MySQL (jdbc:mysql:)
    • PostgreSQL (jdbc:postgresql:)
    • Microsoft SQL Server (jdbc:Microsoft:sqlserver:)
  • „//[host]“: Als Nächstes folgt der Hostname oder die IP-Adresse. Theoretisch wäre es auch möglich, mehrere Hosts anzugeben, da im Fall einer Downtime des DB-Servers der nächste DB-Server kontaktiert wird. Allerdings nicht praxisüblich, da meist die Datenbank-Serverredundanz durch ein Cluster dargestellt wird. Es wird also hier nur ein Datenbankcluster als Host angegeben, der wiederum im Hintergrund mehrere Datenbankserver beinhaltet (aber nur zur Info)
  • „:port“: Die Port-Adresse (jeder Serversocket wird über eine IP-Adresse und einem Port adressiert). Dabei legt JDBC bereits Standardports fest:
    • MySQL: 3306
    • PostgreSQL: 5432
    • Microsoft SQL Server: 1433

Sollte Ihr Datenbankserver einen vom Standard abweichenden Port verweden, so müssen Sie dies mit der Portdirektive angeben, z. B.: „jdbc:mysql://servername:11111“.

  • „/database“: Hier folgt die gewünschte Datenbank (wird auch von uns als Parameter in der Methode verlangt. Wollen wir beispielsweise die Datenbank kundenverwaltung von einem MySQL-Datenbankserver verwenden, so lautet der String wie folgt: jdbc:mysql://servername:3306/kundenverwaltung
  • „?propertyName“: Nun können beliebig viele Zusatzeigenschaften gesetzt werden. Jede Zusatzfunktionalität besitzt einen Namen und einen Wert.
PropertyName
  • „=propertyValue“: Die Werte einer Zusatzeigenschaft werden mittels „=“ zugewiesen. ?user=root ?password=superGeheim24 ?charSet=LATIN!
  • „&propertyNameN“: Wollen Sie mehrere Eigenschaften mit angeben, so müssen Sie ein „&“-Symbol verwenden. Hier ist der Aufbau äquivalent: propertyName=wert …servername:11111/database/?user=root&password=superGeheim

Für unsere Datenbankverbindung setzen wir nun den JDBC-URL wie folgt zusammen:

  1. jdbc:mysql://“+host+“/“+database+“?user=”+user+”&password=”+passwd;

Die Parameter host, database, user und passwd werden also in den String so eingabaut, dass am Ende ein korrekter JDBC-URL entsteht.

Rufen wir die Methode beispielsweise mit dem Hostnamen dbserver, der Datenbank kundenverwaltung, dem Benutzer root (Datenbankadministrator) und dem Passwort superGeheim auf, so ensteht folgender URL:

  1. jdbc:mysql://dbserver/kundenverwaltung?user=root&password=superGeheim;

Im nächsten Schritt weisen wir nun der Instanzvariable „connection“ die Verbindung hinzu. Dafür eignet sich die statische Methode getConnection, die mit dem JDBC-URL aufgerufen werden muss, aus der Klasse DriverManager.

Nun beinhaltet die Instanzvariable unsere Verbindung und wir können diese Verbindung nutzen, um unsere Anfragen an den Datenbankserver zu stellen.

Christian Barthel macht eine Ausbildung zum Informatikkaufmann. Neben den Themen der Programmierung mit Java beschäftigt er sich ebenfalls mit Linux, Perl und infrastrukturellen Themen wie z. B. Backup, Dokumentmanagement mit Alfresco und Virtualisierung mit KVM, Xen und VMware. Durch seine Offenheit steht er sehr gerne mit anderen Menschen in Kontakt und tauscht Wissen über seine Interessensgebiete aus: christian.barthel@hotmail.de
Geschrieben von
Christian Barthel
Kommentare
  1. chrissiralu2014-03-08 08:21:48

    Hallo, ich suche den ersten Teil der MySql serie und finde ihn nicht. Kann mir jemand sagen wo ich hn finde.
    Vielen dank
    Chris

  2. hartmut2014-03-11 11:24:09

    Hallo Chris,

    wir bemühen uns, den Teil 1 so schnell wie möglich wieder zugänglich zu machen. Danke für die Info!

    Hartmut

    Redaktion JAXenter

  3. Maren2014-06-20 09:40:21

    Mich würde auch der erste Teil interessieren. Können wir noch damit rechnen, dass dieser wieder eingepflegt wird?

    Viele Grüße,

    Maren

  4. EnttäuschterBesucher2014-10-23 12:19:29

    "Hallo Chris, wir bemühen uns, den Teil 1 so schnell wie möglich wieder zugänglich zu machen. Danke für die Info! Hartmut Redaktion JAXenter"
    Zitat von hartmut am 11.03.2014 - 12:24

    Über 7 Monate ists her und ich habe nichts gefunden...
    http://jaxenter.de/news/Top-15-Entwicklerluegen

  5. Samy2015-04-10 10:15:04

    Hallo
    Guter Beitrag... hier noch ein Fehler den ich gefunden habe..

    Hierfür sollte zunächst eine eigene Klasse erstellt werden, die Sie zum Beispiel “DBVerbindung”, “IOManager” oder “Connection”

    Connection koennt ihr die nicht nennen, da es sonst ein Konflikt mit der Connection Klasse aus dem sql Paket gibt.

    lg

  6. Norbert Wich2016-09-17 08:39:35

    Hallo,

    leider habe auch ich keinen Erfolg bei der Suche nach Teil 1 der Serie MySQL und Java von Christian Barthel. Eine Mail an christian.barthel@hotmail.de kommt auch nicht (mehr) an. Gibt es irgendwo diesen Teil 1?

    MfG Norbert Wich

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.