Wie greift man in Java auf eine Datenbanktabelle zu?
Um mit Java auf eine Datenbank zuzugreifen, muss
zunächst ein entsprechender Treiber installiert
werden, der die Verbindung zum gewünschten DBMS1 herstellt. Die gängigen
Linux-Distributionen stellen diesen bereit, er kann
jedoch für MySQL-Datenbanken auch unter https://www.mysql.com
heruntergeladen werden. Die Installation selbst sollte
problemlos verlaufen. Die Einbindung in Java kann jedoch
gelegentlich Kopfzerbrechen bereiten, weil der
Treibername unbekannt ist. Man muss nämlich wissen,
dass hierunter nichts anderes zu verstehen ist als die
Paketstruktur der Treiberklasse innerhalb des
Treiber-*.jar-Archivs.
Ein Beispiel: Das Archiv
(z.B. unter) /usr/share/java/mysql-connector-java-5.0.4.jar
beinhaltet die folgenden Verzeichnisse:
com
META_INF
org
Unter com
und org
liegen in
einer tieferen Ordnerstruktur jeweils ein class
-File
namens Driver.class
. Von diesen beiden muss
eines angegeben werden, um mittels Class.forName()
zu Beginn des Programms ein Treiberobjekt zu bilden:
Class.forName("com.mysql.cj.jdbc.Driver");
Im Konstruktor wird hier zunächst diese Treiber-Instanz erzeugt. Die eigentlichen Funktionalitäten zum Auslesen der Datenbanktabelle und zum Ausgeben der Ergebnisse sind in zwei Methoden ausgelagert, die im Konstruktor aufgerufen werden.
readDBData(int i)
steuert die Abfrage der Zugangsdaten und liest anschließend die gewünschten Daten aus der Datenbank aus.printDBData(ArrayList list)
gibt die Daten auf der Konsole aus.
readDBData(int i)
steuert über den
int-Parameter die Abfrage der Datenbank-Zugangsdaten.
Das Prinzip besteht darin, der Reihe nach die einzelnen
benötigten Angaben über Eingabedialoge
abzufragen. der int-Parameter steuert hierbei über
eine switch-case-Verzweigung welcher Wert erfragt wird.
Wird außer beim optionalen Passwort kein Wert
angegeben, so wird über eine Rekursion mit
identischem Parameter eine erneute Abfrage gestartet.
Ansonsten wird die Abfrage forgesetzt.
import java.sql.*;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JOptionPane;
public class DBQuery {
private Connection connection;
private Statement statement;
private ResultSet resultSet;
ArrayList<String[]> result = new ArrayList<String[]>();
private String host = "";
private String dbName = "";
private String dbTable = "";
private String user = "";
private String pass = "";
public DBQuery() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.out.println("Fehler bei MySQL-JDBC-Bridge" + e);
return;
}
readDBData(0);
printDBData(result);
System.out.println("Anzahl Tupel: " + result.size());
}
private void readDBData(int i) {
switch (i) {
case 0:
host = JOptionPane.showInputDialog("Datenbankhost:");
if (host.equals("")) {
System.err.println("Bitte einen Datenbankhost angeben!");
readDBData(i);
}
i++;
case 1:
dbName = JOptionPane.showInputDialog("Datenbankname:");
if (dbName.equals("")) {
System.err.println("Bitte einen Datenbanknamen angeben!");
readDBData(i);
}
i++;
case 2:
dbTable = JOptionPane.showInputDialog("Tabelle:");
if (dbTable.equals("")) {
System.err.println("Bitte eine Tabelle angeben!");
readDBData(i);
}
i++;
case 3:
user = JOptionPane.showInputDialog("Benutzername:");
if (user.equals("")) {
System.err.println("Bitte einen Benutzernamen angeben!");
readDBData(i);
}
i++;
case 4:
pass = JOptionPane.showInputDialog("Passwort:");
break;
}
try {
String url = "jdbc:mysql://" + host + "/" + dbName;
connection = DriverManager.getConnection(url, user, pass);
statement = connection.createStatement();
String sqlQuery = "SELECT * FROM " + dbTable;
resultSet = statement.executeQuery(sqlQuery);
int spalten = resultSet.getMetaData().getColumnCount();
System.out.println("Anzahl Spalten: " + spalten);
while (resultSet.next()) {
String[] str = new String[8];
for (int k = 1; k <=spalten; k++) {
str[k - 1] = resultSet.getString(k);
}
result.add(str);
}
statement.close();
connection.close();
} catch (SQLException e) {
System.out.println("Fehler bei Tabellenabfrage: " + e);
return;
}
}
private void printDBData(ArrayList<String[]> list) {
for (Iterator<String[]> iter = list.iterator(); iter.hasNext();) {
String[] str = (String[]) iter.next();
for (int i = 0; i < str.length; i++) {
System.out.print(str[i] + "\t");
}
System.out.print(System.getProperty("line.separator"));
}
}
public static void main(String args[]) {
SwingUtilities.invokeLater(() -> new DBQuery());
}
}
In der Folge wird der URL in einer Variablen gespeichert. Die Syntax
String url = "jdbc:mysql://" + host + "/" + dbName;
muss genau beachtet werden. Hier lauert eine
häufige Fehlerquelle.
Es folgt der
Verbindungsaufbau zur Datenbank.
Connection.createStatement()
erzeugt ein Statement
-Objekt, das
SQL-Statements zur Datenbank senden kann. Dies geschieht
in der Folge in Form einer einfachen SELECT
-Abfrage.
Sie kann natürlich prinzipiell durch jede andere
SQL-Abfrage ersetzt werden. Die Abfrage liefert ein ResultSet
-Objekt,
das einen Zeiger vor das erste Tupel (= abgefragte
Tabellenreihe) platziert, sodass der Reihe nach alle
Tupel mit Hilfe einer Schleife durchlaufen werden
können.
Über die Methode getMetaData()
kann eine Reihe von Eigenschaften des Abfrageergebnisses
- hier die Spaltenzahl - ermittelt werden.
Innerhalb
zweier verschachtelter Schleifen werden dann die
Feldwerte jedes Tupels in ein String-Array
geladen, das dann einem ArrayList
-Objekt
hinzugefügt wird. Zum Schluss gilt es noch, das Statement
und die Datenbankverbindung korrekt zu schließen.
Die Methode printDBData(ArrayList list)
nimmt die ArrayList
mit den Datenbankwerten
als Parameter entgegen. Über diese wird iteriert
und Array für Array mit den hier gespeicherten
Werten ausgelesen.
1) Database Management System
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.