studyklar
IProg · Klausur 1 · Aufgabe 7

JDBC: Termine einer Rubrik ab einem Datum lesen

Dieselbe Suche wie in der PHP-Klasse, jetzt in Java mit JDBC (Java Database Connectivity, die Datenbank-Schnittstelle von Java). Rechts steht der Code so weit, wie der aktuelle Schritt ihn gefüllt hat. Mit Weiter geht es Lücke für Lücke voran.

Die Aufgabe

Aufgabe 7: JDBC

Implementieren Sie die Modellklasse TerminDB nun in Java auf der Basis von JDBC. Eine einfache Bean-Klasse TerminDTO mit den notwendigen Attributen und Methoden sei bereits vorhanden, mit dem Konstruktor TerminDTO(int tid, Date datum, String txt, int rid). Ebenso vorhanden ist etwas Code der Klasse TerminDB.

Nur die Methode getTerminFromRubrikDatum ist zu implementieren! Sie liefert alle Termine der Rubrik rid ab dem Datum datum.

class TerminDB {  private static final Logger log = LogManager.getLogger(TerminDB.class);   // Alle Termine der Rubrik rid ab dem Datum datum  public static List<TerminDTO> getTerminFromRubrikDatum                                  (Connection cn, int rid, Date datum) {     String sql =     try       } catch (SQLException e) {     }   }}

Die Aufgabe ist aus dem Gedächtnisprotokoll nachgebaut. Das Protokoll sagt nur: Die vorherige Aufgabe ist mit Java und JDBC zu wiederholen, und nur die Methode getTerminFromRubrikDatum ist umzusetzen. Aufgabentext und Rahmencode haben wir nach Klausur 2, Aufgabe 7 gebaut. Punkte nennt das Protokoll nicht.

In eigenen Worten: Die Methode bekommt eine offene Verbindung, eine Rubrik-Nummer und ein Datum. Sie liefert alle Termine dieser Rubrik ab diesem Datum als Liste. Ein DTO (Data Transfer Object) ist eine einfache Klasse, die nur Daten trägt: hier einen Termin mit seinen vier Werten.

Aus Aufgabe 6 („PHP-Klasse TerminDB: Termine suchen und anlegen“): Dort steht dieselbe Suche in PHP: SQL mit zwei Fragezeichen für Rubrik und Datum, Werte binden, Zeile für Zeile ein Objekt ins Ergebnis.
Merke: Alles, was man in JDBC öffnet (Statement, ResultSet), muss wieder geschlossen werden, auch im Fehlerfall. Am sichersten geht das mit try-with-resources: try (…) { … } schließt die Ressource in der Klammer am Ende selbst.
  1. Den Kopf der Methode lesen.
  2. Die Ergebnisliste anlegen.
  3. SQL schreiben, Statement öffnen, Parameter setzen.
  4. Das Ergebnis Zeile für Zeile lesen.
  5. Den Fehler abfangen und die Liste zurückgeben.

Den Kopf der Methode lesen

static: Man ruft die Methode ohne Objekt auf, über den Klassennamen. Sie bekommt die Verbindung cn; geöffnet wird sie woanders, etwa im Controller.

Zurück kommt eine List<TerminDTO>, eine Liste von Terminen. Date ist hier java.sql.Date, der JDBC-Typ für ein Datum ohne Uhrzeit.

log ist ein Logger: Er schreibt Meldungen in eine Log-Datei. Er steht schon im Rahmen, Schritt 7 benutzt ihn.

Aus Skript 09, Folie 20: DB-Zugriffe immer in Klassen kapseln, etwa public static List<Product> findAll(Connection cn); Daten gehen als DTOs hin und her.

Die Ergebnisliste anlegen

    List<TerminDTO> erg = new ArrayList<>();

Die Liste entsteht als Erstes und leer, mit new ArrayList<>(). Sie steht vor dem try. So ist sie auch am Ende der Methode sichtbar, beim return.

Findet die Suche nichts, kommt diese leere Liste zurück, nicht null.

Noch 7 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Abbildung 1

class TerminDB {  private static final Logger log = LogManager.getLogger(TerminDB.class);   // Alle Termine der Rubrik rid ab dem Datum datum  public static List<TerminDTO> getTerminFromRubrikDatum                                  (Connection cn, int rid, Date datum) {     String sql =     try       } catch (SQLException e) {     }   }}
LegendeDer Rahmencode: die Lücken sind noch leer.