Repository navigation
Backend Neue Happy Hour speichern
← zurück zur Backend-Logik Übersicht
Autor: Maren Reuter
Der Anwendungsfall "Happy Hour hinzufügen" wurde in der Use Case Beschreibung genau definiert. Es handelt sich hierbei um einen Use Case aus Administratorsicht und wird daher durch den Login Filter blockiert, wenn der Anwender nicht berechtigt ist dadrauf zuzugreifen. Die Schnittstelle zwischen Frontend und Backend ist unter diesem Link zu sehen.
Definition: Durch diese Funktion wird eine bestimmte Happy Hour aus der H2 Datenbank hinzugefügt
Modul: HappyHour
Dateiname: HappyHour.java
HTTP: POST
Pfad: /bars/{barId}/hour
Folgende Klassen wurden erstellt, um das Hinzufügen einer Happy Hour in der Datenbank zu ermöglichen:
Als erster Schritt wird eine Models-Klasse HappyHour.javaangelegt. Dies ist die Datenklasse in der die Variablen: id, barID, description, start, end, monday, tuesday, wednesday, thursday, friday , saturday, sunday gespeichert werden. Diese Variablen beschreiben eine Happy Hour, wie sie in der Datenbank abgelegt ist.
private int id = 0;
private String barID = "";
private String description = "";
private Time start = new Time(0);
private Time end = new Time(0);
private boolean monday = false;
private boolean tuesday = false;
private boolean wednesday = false;
private boolean thursday = false;
private boolean friday = false;
private boolean saturday = false;
private boolean sunday = false; Des Weiteren sind in dieser Klasse die Getter- und Setter-Methoden sowie eine toString Methode abgebildet.
Um ein Datenobjekt der Klasse HappyHour.java mit den Daten aus der Datenbank zu befüllen, wurde das Interface HappyHourDAO.java in dem Package de.dhbw.hh.dao erstellt. Dieses Interface enthält alle Methoden, durch die die Daten einer Happy Hour bearbeitet oder abgefragt werden können. Für das Hinzufügen einer Happy Hour ist folgende Methode relevant:
/**
* Diese Funktion fügt eine HappyHour in die H2 Datenbank hinzu.
*
* @param happyHour Der einzufügende HappyHour.
* @return True bei Erfolg, andernfalls false.
*/
public boolean insertHappyHour(HappyHour happyHour);Die HappyHourDAO.java-Klasse kann in der DAOFactory.java-Klasse zurückgegeben werden, dafür ist folgende Funktion zuständig:
public abstract HappyHourDAO getHappyHourDAO();Die Funktion der DAOFactory.java-Klasse ist unter Standardablauf beschrieben.
Als nächstes wird eine H2HappyHourDAO.java-Klasse im de.dhbw.hh.dao.h2 Package hinzugefügt. Diese Klasse soll direkt mit der H2-Datenbank kommunizieren und die im HappyHourDAO.java Interface definierten Funktionen bereitstellen, daher implementiert diese Klasse das Interface HappyHourDAO.java:
public class H2HappyHourDAO implements HappyHourDAO {
...
}Zuerst werden wie für den Standardablauf üblich ein Logger für die Fehlerausgabe initialisiert, eine Variable zum Connectionpool der Datenbank und ein Konstruktor erstellt. Dieser Konstruktor erstellt ein Objekt der H2HappyHourDAO.java-Klasse. Als Parameter wird die Variable des Connectionpools mit übergeben.
/**
* Diese Funktion erstellt ein Objekt der Klasse H2HappyHourDAO.
*
* @param cpds Der Connectionpool
*/
public H2HappyHourDAO(ComboPooledDataSource cpds) {
this.cpds = cpds;
}Nachfolgend kommen die einzelnen Methoden zum Bearbeiten eines Datenbankeintrags für die HappyHour.java-Datenklasse. Für das Hinzufügen einer Happy Hour wird die folgende Methode des Interface überschrieben: public boolean insertHappyHour(HappyHour happyHour);.
Zunächst beginnt die Erstellung eines SQL-Strings.
Der SQL-String für das Hinzufügen einer Happy Hour in die H2 Datenbank:
String sql = "INSERT INTO happyHour " + "(barID, description, start, end, monday, tuesday, wednesday, thursday, friday, saturday, sunday)" + " VALUES (?,?,?,?,?,?,?,?,?,?,?)";
Nun wird innerhalb eines try-catch-Blocks versucht aus dem Connectionpool eine Connection zur H2 Datenbank zu holen. Dabei wird, wie in den festgesetzten verwendeten Frameworks beschrieben, das automatische Commiten zur Datenbank verboten. Mit einem weiteren try-catch-Block wird ein Prepared Statement zur Datenbankansteuerung erstellt (Prepared Statements sind ebenfalls in den festgesetzten verwendeten Frameworks beschrieben). In dem Prepared Statement wird der SQL-String ausgeführt und bei erfolgreicher Ausführung wird ein true zurück gegeben:
try (Connection connection = cpds.getConnection()) {
// Immer ohne Autocommits arbeiten
connection.setAutoCommit(false);
// Immer mit PreparedStatements arbeiten
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setInt(1, id);
// Füge das Statement der Ausführungsschlange hinzu
preparedStatement.addBatch();
// Führe alle Statements aus
preparedStatement.executeBatch();
}
// Schreibe die Änderungen in die Datenbank
connection.commit();
return true;In der Klasse HappyHourREST im package de.dhbw.hh.rest werden verschiedene Methoden für Happy Hours zur Verfügung gestellt. Zum Hinzufügen einer Happy Hour stellt diese Klasse die Methoden für die REST-Schnittstelle zum Frontend über den Pfad ´/bars/{barId}/hour´ bereit.
Zuerst wird ein Gson-Objekt erstellt für die Rückgabe, um dieses später in Json umzuwandeln und ans Frontend zurückzugeben.
Im Konstruktor werden die REST-Schnittstellen definiert, dem Konstruktor wird als Parameter dabei die daoFactory übergeben:
public HappyHourREST(DAOFactory daoFactory) {
...
}In diesem Konstruktor wird die Spark-Funktion post() für einen HTTP-POST Aufruf auf den Pfad ´/bars/{barId}/hour´ definiert. Hierbei wird zunächst ein Log-Eintrag erstellt, dass auf den entsprechenden Pfad zugegriffen wurde. Anschließend wird ein HappyHour Objekt erstellt, das nun mit den jeweiligen Daten der Happy Hour befüllt wird.
Nun kann über die DAOFactory die Funktion insertHappyHour(HappyHour happyHour) aufgerufen und das Happy Hour - Objekt in die H2 Datenbank hinzugefügt werden.
In einem neuen ´RESTResponse´-Rückgabeobjekt wird sowohl der angefragte Pfad als Name als auch der aktuelle Zeitpunkt der Rückgabe gesetzt. Anschließend folgt eine if-Abfrage, in der überprüft werden, ob das Hinzufügen erfolgreich durchgeführt wurde oder nicht. Je nachdem werden die Parameter des Rückgabeobjekts befüllt, wobei die Datenvariable leer (null) bleibt:
if (successfull) {
restResponse.setDescription("HappyHour erfolgreich aus DB gelöscht");
restResponse.setSuccess();
} else {
restResponse.setDescription("Es gab einen Fehler beim Löschen der HappyHour aus der DB");
restResponse.setError();
}
restResponse.setData(null);Als Ergebnis wird das Rückgabeobjekt umgewandelt und als Json zurückgegeben: return gson.toJson(restResponse);
Die REST-Schnittstelle HappyHourREST.java ist außerdem als REST-Modul in die Spark-Klasse eingebunden, sodass sie für den Server zur Verfügung steht und aufgerufen werden kann.
Allerdings ist dieser Pfad noch nicht für die aktuelle Produktivumgebung vorgesehen, sondern steht bereit für Weiterentwicklungen der Anwendung.