Java MySQL (JDBC) Tutorial

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.

[ad#co-3]

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

[ad#co-3]