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
- Neues Projekt erstellen
- Paket erstellen: de.michel.mysql.readData
- Klasse erstellen: MySQLConnection.java
- Klasse erstellen: Test.java
MySQL JDBC-Treiber hinzufügen
Nach der Projekterstellung, muss der JDBC-Treiber dem Projekt noch hinzugefügt werden.
- Project Properties (Rechtsklick auf das Projekt >> Properties)
- Java Build Path
- Libraries
- Add External JARs…
- mysql-connector-java-5.0.8-bin.jar hinzufügen
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





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
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!
Wäre ich doch nur ein wenig früher darauf gestossen. Das hier ist echt super und sehr gut veranschaulicht erklärt. 5 Sterne!
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.
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.
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?
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.
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!
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();
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.
Danke für die Erklärung
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)?
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ß
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?
Hallo Aceh,
auch wenn mir der Fehler nicht bekannt ist solltest du deinen Java Pfad prüfen.
Gruß
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
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.
Hallo uiop,
die Klasse MySQLConnection wurde um die Methoden insertName() und updateName() erweitert.
Viel Spaß
danke! super!
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?
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
Grad mal schnell ein JDBC Tutorial gesucht weil ich was probieren wollte. Und was schlägt Google mir da direkt als zweiten Treffer vor…
Google+ ist toll…
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
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
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″;
Hallo Adorno,
danke für die Aufmerksamkeit. Hab den Code angepasst.
Simon