Datenbankzugriff mit Java

Grundlagen und erste Schritte

  • Bislang: Datenbankzugriff technisch über phpmyadmin
  • Jetzt: Wir wollen ein (anwenderfreundliches) Programm schreiben, das ein Datenbankmangementsystem zur Datenhaltung verwendet

"Datenbanktreiber" als Bibliotheken

  • Programmiersprachen bieten häufig Bibliotheken an, mit denen man auf verschiedene RDBMS zugreifen kann
  • Java: JDBC (Java Database Connectivity)
  • Zugriff wird damit vom konkreten System abstrahiert

Grundlagen am Beispiel "Schülerliste"

  • Programm ohne GUI ↝ Konzentration auf DB-Zugriff
  • SQLite3-Datenbank: Lokale Datei, keine Netzwerkinstallation, kein Benutzer/Passwort
  • Die nötigen Bibliotheken kommen nicht mit Java mit. Bei der Arbeit mit BlueJ können sie z.B. in das Unterverzeichnis +libs gespeichert werden
  • Wie bei anderen Bibliotheken müssen die nötigen Methoden zu Beginn der Java-Quelldateien mit import eingebunden werden

Prinzip

  • Daten werden letztlich per SQL abgefragt
  • Der Weg dort hin ist mehrschrittig:
    • Es wird eine Verbindung zur Datenbank hergestellt
    • Auf dieser Verbindung wird ein (Prepared)Statement instanziiert
    • Mit Hilfe des Statements kann die eigentliche Abfrage ausgeführt werden
    • Das Ergebnis ist vom Typ ResultSet

Praxis

Alle Datenbankoperationen müssen aus Gründen der Fehlerbehandlung in try-catch-Blöcken ausgeführt werden.

public void connect(String DBUri) {
  try {
    DBConnection = DriverManager.getConnection(DBUri);
    System.out.println("Verbindung hergestellt");
  } 
  catch (SQLException e) {
    System.out.println(e.getMessage());
  }
}
  • Im try-Block wir die gewünschte Operation programmiert
  • tritt im try-Block ein Fehler auf, wird eine Exception ausgelöst, die im catch-Block "aufgefangen" wird

Wichtig: Die Fehlerbehandlung ist vor allem deswegen nötig weil ein Teil der Funktionalität außerhalb der Kontrolle des Java Compilers ist.

  • Falsche Anmeldedaten für eine mysql-Datenbank
  • Fehler in SQL Statements
  • Netzwerkprobleme (Rechner offline?)
  • ...

Beispiel

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
public class Adressen {

  Connection DBConnection;
  
  public Adressen() {
    System.out.print('\u000C');
    String uri = "jdbc:sqlite:schueler.db";
    connect(uri);
 
    try {
      Statement statement = DBConnection.createStatement();
      String query = "SELECT * FROM schuler";
      ResultSet result = statement.executeQuery(query);

      while(result.next()) {
        String nachname = result.getString("SNachname");
        String vorname = result.getString("SVorname");
        System.out.print(String.format("%-12s", nachname) + "\t");
        System.out.print(String.format("%-12s", vorname) + "\t");
        System.out.println();
      }
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
  }
 
  public void connect(String DBUri) {
    try {
      DBConnection = DriverManager.getConnection(DBUri);
      System.out.println("Verbindung mit " + DBUri + " erfolgreich hergestellt");
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
  }
}

Anmerkungen 1 - Das ResultSet

  • Das Abfrageergebnis liegt als ResultSet vor. Standardmäßig ist es vom Typ "FORWARD_ONLY" und kann wie ein Iterator der Reihe nach durchlaufen werden:
    while(result.next()) {
       // [... TU WAS ...]
    }
  • Jedes Element des ResultSet's kann man sich als eine Zeile des Abfrageergebnisses vorstellen.
  • Auf die Werte der Attribute (Spalten) muss man dann gesondert zugreifen, und diese z.B. in Java-Variablen oder anderen Java Datenstrukturen speichern.

Anmerkungen 2 - Zugriff auf Attribute

  • Die Datenbankfelder haben einen Datentyp in der Datenbank
  • Die Java-Datenstrukturen haben Datentypen
  • Das ResultSet hat typabhängige Methoden, um die Attributwerte auszulesen
  • Der Compiler weiß von nichts 😱

Selbst probieren!

https://info-bw.de/faecher:informatik:oberstufe:datenbanken:projekt:java_db:java_db_schuelerliste:start