studyklar
IProg · Skript 9 · Abschnitt 6

JDBC: Datenbankzugriffe in Klassen kapseln

Wohin gehört das SQL in einer Anwendung? In eine eigene Klasse je Tabelle. Hier steht, wie diese Klasse aussieht und wie die Daten als DTO zwischen ihr und dem Rest reisen. Mit Weiter geht es Schritt für Schritt voran. Ein Klick auf einen Schritt springt direkt dorthin.

Worum es geht

Skript 09, Folien 20 und 21: Kapselung DB-Zugriffe, Datenkapselung.

Bisher stand der JDBC-Code für sich. In einer echten Web-Anwendung würde er sonst überall verstreut stehen: im Servlet, in der JSP, mehrfach. Die Frage dieses Abschnitts: Wie ordnet man die Datenbankzugriffe, und in welcher Form gibt man die Daten weiter?

Zum Ausprobieren nehmen wir eine Beispieltabelle Product mit den Spalten id, name und available (lieferbar, ja oder nein); sie steht nicht im Skript.

So gehen wir vor:

  1. Die Idee: Datenbankzugriffe in Klassen kapseln.
  2. Die Klasse ProductDB von Folie 20.
  3. Die Klasse Product als DTO von Folie 21.
  4. Eine Methode ausfüllen und aufrufen.
  5. Eine Klausurfrage dazu.

Ergänzung zum Skript: Die Folie lässt die Methodenrümpfe offen. In Schritt 6 füllen wir findById selbst aus.

DB-Zugriffe immer in Klassen kapseln

Teil der Anwendungkennt SQL?tauscht Daten als
Servlet, JSPneinProduct-Objekte
ProductDBja, alles SQL zu ProductProduct-Objekte
DatenbankjaZeilen der Tabelle Product

Kapseln heißt: Etwas steckt in einer Klasse, und der Rest des Programms benutzt nur ihre Methoden. Hier steckt alles SQL zur Tabelle Product in einer Klasse ProductDB.

Servlet und JSP rufen nur noch Methoden wie findById auf. Sie kennen kein SQL. Ändert sich die Tabelle, ändert man eine Klasse, nicht zehn Seiten.

Solche Klassen heißen oft DAO, Data Access Object (Objekt für den Datenzugriff). Das Skript nennt den Namen nicht.

Die Klasse ProductDB

public class ProductDB {  public static List<Product> findAll(Connection cn) { … }  public static Product findById(Connection cn, int id) { … }  public static int insert(Connection cn, Product dto) { … }  public static int update(Connection cn, Product dto) { … }  public static int delete(Connection cn, int id) { … }}

Folie 20 zeigt nur die Köpfe der Methoden. Es sind die fünf üblichen Zugriffe: alle lesen, eine lesen, einfügen, ändern, löschen.

Alle sind static: Man ruft sie über die Klasse auf, ohne Objekt (ProductDB.findById(cn, 2)). Jede bekommt als ersten Parameter die offene Connection. Wer aufruft, öffnet und schließt die Verbindung.

Die Rückgabe passt zum Zweck: eine Liste von Produkten, ein Produkt, oder bei Änderungen ein int, die Zahl der geänderten Zeilen von executeUpdate.

Noch 8 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

Teil der Anwendungkennt SQL?tauscht Daten als
Servlet, JSPneinProduct-Objekte
ProductDBja, alles SQL zu ProductProduct-Objekte
DatenbankjaZeilen der Tabelle Product
LegendeZeilen des SchrittsWer in der Anwendung SQL kennt und wer nur Objekte.