17.02 Einbindung der Datenbank und erste Schritte
Nachdem Sie im Einführungskapitel gelernt haben, was Datenbanken sind, werden wir uns in diesem Kapitel konrekt mit der Datenbankeinbindung in Java beschäftigen. Sie werden erfahren, wie Sie eine Verbindung zu einer Datenbank aufbauen können, sowie Tabellen anlegen, Einträge hinzufügen und wieder herausfiltern können.
Eine Verbindung zur Datenbank aufbauen
Nachdem Sie die hsqldb.jar in Ihren Classpath eingefügt haben, können Sie eine Verbindung zu einer Datenbank aufbauen. Wenn die gewünschte Datenbank nicht existiert, wird sie automatisch erstellt. Alle Klassen, die mit der Datenbank zu tun haben, kommen aus dem Paket java.sql
. Diesen Import schreiben Sie sich am besten gleich in Ihre Quelldatei, denn in diesem Kapitel wird der Import dieses Pakets vorausgesetzt.
try { Class.forName("org.hsqldb.jdbcDriver"); Connection connection = DriverManager.getConnection("jdbc:hsqldb:file:C:/jbb/base.db;shutdown=true", "sa", ""); } catch (ClassNotFoundException e) { System.err.println("Keine Treiberklasse gefunden."); }
In Zeile 2 wir der Datenbanktreiber geladen und in Zeile 3 die eigentliche Verbindung zur Datenbank hergestellt. Dabei wird der Pfadname zur Datenbank und deren Dateiname selbst angegeben. Die Dateiendung ist egal, sie muss nur konsequent verwendet werden. In der URL wird außerdem angegeben, welcher Treiber verwendet werden soll und ob die Datenbank automatisch geschlossen werden soll. Die beiden nächsten Argumente geben den Benutzernamen und das Passwort an. Hier sollten sie zunächst die Standard-Angaben stehen lassen.
Wenn nichts schief ging, können Sie von nun an mit dem Connection
-Objekt auf die Datenbank lesend und schreibend zugreifen.
Das Herunterfahren zuerst
Wenn Sie mittels einens Programms auf eine HSQL-Datenbank zugreifen und Änderungen schreiben, werden diese zunächst nur im Speicher gehalten, nicht auf der Festplatte. Damit die Änderungen dauerhaft werden, muss eine Connection
geschlossen werden. Das passiert mit folgendem Aufruf:
try{ connection.commit(); }catch(SQLException ex) ex.printStackTrace(); }
Diesen Aufruf haben wir vorgeschoben, damit Sie produktiv mit der Datenbank auch über mehrere Programmneustarts arbeiten können. Rufen Sie diese Methode immer am Ende Ihres Programms auf. Wir werden sie nicht an jedes Listing dieses Kapitels anhängen.
Tabellen einfügen
Im Paket java.sql
finden sich die Klassen Statement
und PreparedStatement
. Beide generieren und führen SQL-Statements aus. Zum Unterschied der beiden kommen wir später. Wir werden in diesem Kapitel PreparedStatement
verwenden. Zunächst kann man sich über ein Connection
-Objekt eine Anweisung vorbereiten:
try{ PreparedStatement ps = connection.prepareStatement("CREATE TABLE user (id INT, name VARCHAR_IGNORECASE(30), pass VARCHAR(10))"); }catch(SQLException ex){ ex.printStackTrace(); }
Der Datentyp VARCHAR_IGNORECASE(30)
ist drückt aus, dass in SQL-Abfragen in dieser Spalte nicht auf die Groß/Kleinschreibung geachtet wird. Gespeichert wird sie trotzdem.
Der Query wird folgendermaßen ausgeführt:
try{ ps.executeUpdate(); }catch(SQLException ex){ ex.printStackTrace(); }
Auf die selbe Art und Weise werden alle SQL-Befehle behandelt, die die Daten der Datenbank verändern. Daher wird in diesem Kapitel nicht näher auf INSERT
, UPDATE
usw. eingegangen.
executeUpdate()
gibt zurück, wie viele Zeilen von der Änderung betroffen waren.
SQL-Abfragen
Neben dem Einfügen der Daten müssen diese auch wieder aus der Datenbank geholt werden. Dies passiert zwar ebenfalls mit einem (Prepared)Statement
, doch die Ergebnisse werden in einer anderen Form präsentiert. Angenommen, sie wollen aus der Datenbank alle Benutzer filtern, deren Namen gleich „Max Mustermann“ ist. Die dazugehörige SQL-Abfrage übergeben sie wie gewohnt der prepareStatement(...)
-Methode. Diesmal rufen Sie aber nicht executeUpdate()
auf, sondern executeQuery()
. Diese Methode gibt ein ResultSet
zurück, welches mit einer while
-Schleife durchlaufen werden muss:
try{ PreparedStatement ps = connection.prepareStatement("SELECT * FROM user WHERE name='Max Mustermann'"); ResultSet set = ps.executeQuery(); while(set.next()){ System.out.println("Name: "+ set.getString(1) + ", Passwort: "+ set.getString("pass")); } }catch(SQLException ex){ ex.printStackTrace(); }
ResultSet.next()
macht zwei Dinge: Erstens wird überprüft, ob noch ein Eintrag vorhanden ist und dementsprechend true
oder false
zurückgegeben. Zweitens wird der interne Zähler des ResultSet
s auf den nächsten Eintrag geschoben. Falls Sie, nachdem next()
false
zurückgegeben hat, noch auf die Daten zugreifen wollen, erfolgt eine Exeception.
Wie Sie sehen, bietet das ResultSet
zwei verschiedene Methoden zum Ermitteln eines Strings an. Zu einen können Sie über den Index der Spalte auf die Daten zugreifen, zum anderen über deren Namen. Bei ersterem müssen Sie beachten, dass die Zählung bei 1 beginnt. Bei letzterem wir der Name verwendet, den Sie in der SELECT
-Anweisung angegeben haben. Wenn Sie also SELECT pass AS password ...
festgelegt haben, wird die Spalte unter password
gefunden.
Neben der getString
-Methode gibt es auch Methoden für die primitiven Datentypen (z.B.: getInt()
) und Basisklassen (z.B.: getDate()
). Alle Methoden bieten beide Zugriffsmöglichkeiten.
Schließen der Statements und ResultSets
Vergessen Sie nicht, Ihre PreparedStatement
s und ResultSet
s zu schließen, bevor die Methode beendet wird, damit die JDBC-Ressourcen freigegeben werden.
Auch sei hier nochmal erwähnt, dass die Connection
-Objekte ebenfalls geschlossen (mit commit()
) werden müssen, bevor die Anwendung beendet wird, damit die Daten permanent in der Datei gespeichert werden.
Sicherheit?
Das ist das große Thema, welches das nächste Kapitel behandeln wird. Es geht unter anderem um Verschlüsselung und SQL-Injection.
Hallo,
Ich bin seit einiger Zeit zwar mit der Programmiersprache Java vertraut, allerdings stellen sich Mir immer wieder neue Probleme und nun traue ich mich erstmals mit meinem ‚Problem‘ an die Öffentlichkeit.
Also : Ich will ein Projekt starten bei dem sich die Java – Dateien in einer Datenbank (in meinem Fall Mysql) speichern und wieder aufgerufen werden.
Ich werde direkt nicht schlau aus den viele Kommentaren die hier im Internet herum irren nun wollte ich mal nach einer Lösung fragen ?!
Für eine Antwort wäre ich sehr dankbar.
Vielen Dank 🙂
Hallo Nico,
bevor ich eine Antwort geben kann, muss erst einmal das Problem genau definiert werden. Generell ist ein Blog, zu welchem beitragsspezifisch kommentiert wird, evtl. nicht der ideale Ort für eine allgemeine Frage. Hier wäre unser Java-Forum auf byte-welt.net treffender.
Grüße
Stefan