Skip to content

Java MySQL (JDBC) Tutorial

von am 05.09.2010

1287078593_source_java

Nicht selten ist es notwendig über Java Daten aus einer MySQL Datenbank auszulesen. Und wie es bei den meisten Fällen so ist, ist der erste Schritt der schwierigste. Um diesen Schritt zu vereinfachen, wird eine kleine Demo Anwendung erstellt die die notwendigen Zeilen an Code benötigt, um Daten aus einer MySQL Datenbank auszulesen. Die HSQLDB ist ein eingebettetes Datenbanksystem und bietet eine weitere Variante zu der MySQL Datenbank.

Eine Alternative zu der nachfolgenden Umsetzung bietet das Spring Framework. Dank der Spring JDBC-API kann die Verbindung zu einer (MySQL) Datenbank schneller und vor allem sicherer hergestellt werden. Mehr Informationen in dem Blogartikel Spring MySQL (JDBC) Tutorial.

Bevor jedoch losgelegt werden kann, müssen zunächst einige Vorbereitungen getroffen werden. Hierzu benötigen wir zum einen erst einmal den JDBC Datenbanktreiber. Offiziell heißt dieser Connector/J und steht auf der MySQL Homepage im Downloadbereich zur Verfügung.

Projekt Vorbereitungen

  1. Neues Projekt erstellen
  2. Paket erstellen: de.michel.mysql.readData
  3. Klasse erstellen: MySQLConnection.java
  4. Klasse erstellen: Test.java

MySQL JDBC-Treiber hinzufügen

Nach der Projekterstellung, muss der JDBC-Treiber dem Projekt noch hinzugefügt werden.

  1. Project Properties (Rechtsklick auf das Projekt >> Properties)
  2. Java Build Path
  3. Libraries
  4. Add External JARs…
  5. mysql-connector-java-5.0.8-bin.jar hinzufügen

Java Build Path

Der MySQL JDBC-Treiber ist nun dem Projekt hinzugefügt. Zur Erläuterung sei gesagt, das die .jar Datei alle Funktionalitäten enthält, welche für einen MySQL Datenbankzugriff notwendig sind. Somit kann nun der Zugriff über MySQL auf die Daten über den Quellcode stattfinden.

Hinweis: Für den content der Daten sorgt Sakila. Sakila ist eine Testdatenbank die von MySQL für Testzwecke bereitgestellt wird und hier heruntergeladen werden kann. Wie ein MySQL Server mit Sakila zu Testzwecken lokal in Betrieb genommen werden kann wird im Artikel MySQL Server lokal installieren beschrieben.

Quellcode

MySQLConnection.java

package de.michel.mysql.readData;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MySQLConnection {

  private static Connection conn = null;

  // Hostname
  private static String dbHost = "192.168.0.110";

  // Port -- Standard: 3306
  private static String dbPort = "3306";

  // Datenbankname
  private static String database = "sakila";

  // Datenbankuser
  private static String dbUser = "simon";

  // Datenbankpasswort
  private static String dbPassword = "toor";

  private MySQLConnection() {
    try {

      // Datenbanktreiber für ODBC Schnittstellen laden.
      // Für verschiedene ODBC-Datenbanken muss dieser Treiber
      // nur einmal geladen werden.
      Class.forName("com.mysql.jdbc.Driver");

      // Verbindung zur ODBC-Datenbank 'sakila' herstellen.
      // Es wird die JDBC-ODBC-Brücke verwendet.
      conn = DriverManager.getConnection("jdbc:mysql://" + dbHost + ":"
          + dbPort + "/" + database + "?" + "user=" + dbUser + "&"
          + "password=" + dbPassword);
    } catch (ClassNotFoundException e) {
      System.out.println("Treiber nicht gefunden");
    } catch (SQLException e) {
      System.out.println("Connect nicht moeglich");
    }
  }

  private static Connection getInstance()
  {
    if(conn == null)
      new MySQLConnection();
    return conn;
  }

  /**
   * Schreibt die Namensliste in die Konsole
   */
  public static void printNameList()
  {
    conn = getInstance();

    if(conn != null)
    {
      // Anfrage-Statement erzeugen.
      Statement query;
      try {
        query = conn.createStatement();

        // Ergebnistabelle erzeugen und abholen.
        String sql = "SELECT first_name, last_name FROM actor "
            + "ORDER BY last_name";
        ResultSet result = query.executeQuery(sql);

        // Ergebnissätze durchfahren.
        while (result.next()) {
          String first_name = result.getString("first_name"); // Alternativ: result.getString(1);
          String last_name = result.getString("last_name"); // Alternativ: result.getString(2);
          String name = last_name + ", " + first_name;
          System.out.println(name);
        }
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * Fügt einen neuen Datensatz hinzu 
   */
  public static void insertName(String firstName, String lastName)
  {
    conn = getInstance();

    if(conn != null)
    {
      try {

        // Insert-Statement erzeugen (Fragezeichen werden später ersetzt).
        String sql = "INSERT INTO actor(first_name, last_name) " +
                     "VALUES(?, ?)";
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        // Erstes Fragezeichen durch "firstName" Parameter ersetzen
        preparedStatement.setString(1, firstName);
        // Zweites Fragezeichen durch "lastName" Parameter ersetzen
        preparedStatement.setString(2, lastName);
        // SQL ausführen.
        preparedStatement.executeUpdate();

        // Es wird der letzte Datensatz abgefragt
        String lastActor = "SELECT actor_id, first_name, last_name " +
                           "FROM actor " +
                           "ORDER BY actor_id DESC LIMIT 1";
        ResultSet result = preparedStatement.executeQuery(lastActor);

        // Wenn ein Datensatz gefunden wurde, wird auf diesen zugegriffen 
        if(result.next())
        {
          System.out.println("(" + result.getInt(1) + ")" + 
              result.getString(2) + " " + 
              result.getString(3));
        }
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * Aktualisiert den Datensatz mit der übergebenen actorId 
   */
  public static void updateName(String firstName, String lastName, int actorId)
  {
    conn = getInstance();

    if(conn != null)
    {
      try {

        String querySql = "SELECT actor_id, first_name, last_name " +
                          "FROM actor " +
                          "WHERE actor_id = ?";
        
        // PreparedStatement erzeugen.
        PreparedStatement preparedQueryStatement = conn.prepareStatement(querySql);
        preparedQueryStatement.setInt(1, actorId);
        ResultSet result = preparedQueryStatement.executeQuery();

        if(result.next())
        {
          // Vorher
          System.out.println("VORHER: (" + result.getInt(1) + ")" + 
                                           result.getString(2) + " " + 
                                           result.getString(3));
        }

        // Ergebnistabelle erzeugen und abholen.
        String updateSql = "UPDATE actor " +
                           "SET first_name = ?, last_name = ? " +
                           "WHERE actor_id = ?";
        PreparedStatement preparedUpdateStatement = conn.prepareStatement(updateSql);
        // Erstes Fragezeichen durch "firstName" Parameter ersetzen
        preparedUpdateStatement.setString(1, firstName);
        // Zweites Fragezeichen durch "lastName" Parameter ersetzen
        preparedUpdateStatement.setString(2, lastName);
        // Drittes Fragezeichen durch "actorId" Parameter ersetzen
        preparedUpdateStatement.setInt(3, actorId);
        // SQL ausführen
        preparedUpdateStatement.executeUpdate();
        
        // Es wird der letzte Datensatz abgefragt
        result = preparedQueryStatement.executeQuery();

        if(result.next())
        {
          System.out.println("NACHHER: (" + result.getInt(1) + ")" + 
                                            result.getString(2) + " " + 
                                            result.getString(3));
        }

      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }
}

Test.java

Zum testen rufen wir in der Test.java Datei die Funktion auf, die uns die Namen in der console ausgeben soll.

package de.michel.mysql.readData;

public class Test
{
  public static void main(String[] args)
  {
    // Abfrage aller vorhandenen Namen
    MySQLConnection.printNameList();

    // Neuen Datensatz hinzufügen
    MySQLConnection.insertName("Simon", "Michel");

    // Datensatz mit der ID 1 ändern
    MySQLConnection.updateName("Peter", "Pan", 1);
  }
}

Ergebnis

Das Ergebnis wird in der Konsole ausgegeben:

AKROYD, DEBBIE
AKROYD, KIRSTEN
AKROYD, CHRISTIAN
ALLEN, MERYL
ALLEN, CUBA
ALLEN, KIM
ASTAIRE, ANGELINA
BACALL, RUSSELL
BAILEY, JESSICA
BAILEY, AUDREY
BALE, HARRISON
BALL, RENEE
BARRYMORE, JULIA
BASINGER, VIVIEN
....
(210)Simon Michel
VORHER: (1)PENELOPE GUINESS
NACHHER: (1)Peter Pan

Von → Java

26 Kommentare
  1. Torsten Roehner Permalink

    Definitiv ein cooles Script, als Nicht- Java Programmierer gelang es mir mit Hilfe des kleinen Programms und Eclipse innerhalb von 10 Minuten die JDBC Schnittstelle gegen meine Datenbank zu testen.

    Viele Dank

  2. Also da muss ich echt mal sagen:
    Vielen vielen Dank!
    Das Tutorial ist echt gut und dennoch einfach und wie bei meinem Vorposter, hat es auch bei mir 10min. gedauert bis ich also mit der Struktur der JDBC vertraut wurde und alles weitere lässt sich ausbauen, zumal, wenn man schon mit MySQL eine Menge in PHP gelernt hat.
    Also nochmal vielen vielen Dank!

  3. chris Permalink

    Wäre ich doch nur ein wenig früher darauf gestossen. Das hier ist echt super und sehr gut veranschaulicht erklärt. 5 Sterne!

  4. Mostal Permalink

    Hi, die Frage klingt vlt. blöd, aber muss zum Ausführen des Programmes beim User irgendetwas auser der Datenbank installiert sein? Würde mich über eine Antwort sehr freuen, danke.

  5. Simon Michel Permalink

    Hallo Mostal,
    für das Ausführen von Java benötigst du natürlich die JRE. Die Datenbank muss ja noch nicht einmal lokal vorhanden sein, sondern kann auch bei einem Hoster liegen.

  6. Mostal Permalink

    Hallo, ja das ist mir schon klar, ich habe mich nur falsch ausgedrückt: Brauch ich noch zusätzlich zum JConnector einen Treiber bzw. ODBC auf dem Clientrechner?

  7. Simon Michel Permalink

    Wenn du dein Projekt schlussendlich als ausführbare Datei exportierst, sollten alle notwendigen Klassen, Treiber etc. darin enthalten sein. Vorausgesetzt du kannst die oben beschriebenen Dateien lokal aus Eclipse (oder einer anderen Entwicklungsumgebung) heraus starten.

  8. youpwnT Permalink

    Wow! Genau so etwas habe ich gesucht! Ich werde mich zwar noch ziemlich ausführlich mit dem Connector/J beschäftigen müssen, aber dieses Tutorial veranschulicht sehr gut die Arbeitsweise des JDBC.. Vielen Dank!

  9. Bin gerade beim Stöbern in Deinem Blog auf diesen Beitrag gestoßen.
    Sehr gut erklärt, hat mich gleich wieder an mein JavaProgramme erinnert :-)

    Was ich allerdings nicht ganz verstehe ist, wie Du den Treiber lädst, vielleicht kannst Du mir kurz den Unterschied zu meiner Variante erklären .

    Ich hab das bisher immer so gemacht.


    Driver drv;
    drv = new com.mysql.jdbc.Driver();

  10. Simon Michel Permalink

    Hallo Christian,

    da die Treiberklasse bereits in dem Classpath liegt, kann diese anschließend mit Hilfe von reflection über den vollqualifizierten Namen geladen werden. Dies passiert demnach mit “Class.forName(…)”.
    In deinem Fall erzeugst du zunächst ein “Driver” Objekt und registriert ihn anschließend, was grundsätzlich auch klappen sollte.

  11. Chloroplast Permalink

    wie müsste ich den code verändern das ich auf eine datenbank zugreifen kann, welche auf einem seperaten server läuft (subdomain von http://www.bplaced.net)?

    • Simon Michel Permalink

      Hallo Chloroplast,

      du müsstest die Variable “dbHost” neu zuweisen (in deinem Fall auf bplaced.net), den Datenbanknamen, den User (“dbUser”) und das Passwort (dbPassword) anpassen. Zusätzlich musst du die MySQL Datenbank für einen externen Zugriff erlauben.

      Gruß

  12. hallo, ich bin ziemlich neu in Android apps-Entwickeln. ich habe die komplette Anweisung befolgt, bloß mit meinen persönlichen MySQL-Daten und ich bekomme in der Console immer diese Meldung:

    Error occurred during initialization of VM
    java/lang/NoClassDefFoundError: java/lang/ref/FinalReference

    Was soll ich machen?

  13. qwertz Permalink

    Kann mich nur anschließen, sehr schönes Tutorial.

    Ich musste bei mir nur noch unter “MySQL JDBC-Treiber hinzufügen” als 6. Schritt den Classpath angeben:
    Project Properties (Rechtsklick auf das Projekt >> Properties) –> Java Build Path –> Libraries –> “Add Class Folder” wählen und den Order der “mysql-connector-java-5.0.8-bin.jar” angeben. Dann lief es glatt ;)

  14. uiop Permalink

    Hi! Super Tutorial!

    Habe nur eine Frage!?

    Die Datenbank auslesen kann ich jetzt, doch wie ändere ich sie bzw. lösche ich etwas (usw…) ???

    sry bin neuling auf dem Gebiet.

    • Simon Michel Permalink

      Hallo uiop,

      die Klasse MySQLConnection wurde um die Methoden insertName() und updateName() erweitert.

      Viel Spaß

  15. uiop Permalink

    danke! super!

  16. uiop Permalink

    Funkt alles super! Nur wenn ich das selbe auf meinen Laptop mache bringt er immer die Fehlermeldung Connect nicht möglich!!!! Habe exakt das selbe gemacht wie auf meinem Pc! (selbes Betriebssystem Win7 ).

    Wo liegt der Fehler? Hat das viell. irgendwas mit der Firewall am Laptop zu tun? Auf die Datenbank kann ich zugreifen, alles kein Problem….. doch irgenwie verbindet sich Java nicht mehr mit der Datenbank.

    Hat vielleicht jemand ne Idee?

  17. uiop Permalink

    Die genaue Fehlermeldung: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. Connect nicht moeglich

  18. Grad mal schnell ein JDBC Tutorial gesucht weil ich was probieren wollte. Und was schlägt Google mir da direkt als zweiten Treffer vor… :D
    Google+ ist toll…

  19. Christoph Permalink

    Hallo!

    Gutes Tutorial, schön strukturiert und wunderbar kommentiert – dadurch super geeignet als Referenz.
    Ein böser Schnitzer ist meiner Meinung die Verwendung Statements – es sollten besser PreparedStatements verwendet werden – wer sich nach diesem Tutorial richtet baut sonst direkt mal eine SQL-Injection empfindeliche Anwendung.
    Netter Nebeneffekt: PreparedStatements sind schneller und man muss sich nicht um Escaping kümmern – wie geschaffen für den faulen Programmierer ;)

    • Simon Michel Permalink

      Hallo Christoph,

      auch wenn es in diesem Artikel grundsätzlich um den Aufbau gehen soll wie eine Verbindung zum MySQL Server hergestellt wird ist deine Anmerkung bezüglich der PreparedStatements eine Verbesserung wert.

      Danke und schöne Grüße

  20. Adorno Permalink

    In Zeile 111 ff. muss es wie folgt heissen:
    String lastActor = “SELECT actor_id, first_name, last_name FROM actor ORDER BY actor_id DESC LIMIT 1″;

    • Simon Michel Permalink

      Hallo Adorno,

      danke für die Aufmerksamkeit. Hab den Code angepasst.

      Simon

Einen Kommentar hinterlassen

Beachte: XHTML ist erlaubt. Ihre E-Mail-Adresse wird nie angezeigt.

Abonniere diese Seite via RSS