Was in eine Datenbankklasse aufgenommen werden soll
On Februar 15, 2021 by admin Ich entwickle derzeit eine Java-Anwendung, die mit einem SQL Server kommuniziert. Deshalb habe ich die Klasse Database
erstellt, die für open()
und close()
verantwortlich ist. P. >
Ich möchte der Datenbank Daten hinzufügen können. In diesem Beispiel heißt die Tabelle job. Deshalb habe ich eine Klasse Job
erstellt. Neben diesen Jobs gibt es (viele) verschiedene Dinge, die in der Datenbank gespeichert werden. Meine Frage ist: Wo lege ich meine Methode addJob(Job j)
ab? Bisher kann ich mir drei mögliche Lösungen vorstellen:
-
Fügen Sie die Methode
addJob(Job j)
zurDatabase
Klasse, die die Abstraktion für den Rest des Programms bereitstellt. Der Rest des Programms muss sich keine Sorgen machen, wie dies implementiert wird. Der Nachteil dabei ist, dass dieDatabase
irgendwann sehr groß wird. -
Erstellen Sie eine separate Klasse
JobHandler
mit dem Konstruktorpublic JobHandler(Database d)
, der eine Datenbank akzeptiert. In diesemJobHandler
habe ich vor, dasaddJob(Job j)
bereitzustellen. Mein Problem ist hier, auf welcher Ebene ich mitDatabase
interagieren soll, da es derzeit keine öffentlichen Methoden außeropen()
undclose()
. Sollte ich eine Methode erstellen, die reine SQL-Anweisungen akzeptiert? Das sieht für mich nicht sehr gut aus. -
Machen Sie die Klasse
Database
abstrakt und erweitern Sie sie so, dass ich die fehlenden Methoden hier implementiere . Nachteil ist, dass ich die Datenbank nicht weitergeben und dieselbe Verbindung für mehrere Abfragen unterschiedlicher Art verwenden kann.
Was würde man tun, um dieses Problem zu lösen? Wie soll ich meine Klassen so strukturieren, dass sie nicht zu groß werden und auch nicht zu viel von der Datenbankklasse den Klassen ausgesetzt wird, die die Methoden zum Umgang mit den Daten implementieren?
Bearbeiten Bitte beachten Sie, dass der Job eine zufällige Klasse ist, die nur als Beispiel für die in der Datenbank gespeicherten Daten dienen soll.
Kommentare
- " Was würde man tun, um dieses Problem zu lösen? " Es gibt ungefähr 9001 ausgereifte Bibliotheken, die genau all diese Dinge erledigen. Verwenden Sie eine davon.
- Können Sie mir bitte ein Beispiel für eine solche Bibliothek geben. Ich würde es gerne untersuchen.
- Was meinst du damit, dass Job nur ein Beispiel für Daten ist?
- Ich habe den Satz umformuliert.
- Dann finde ein besseres Beispiel, sonst denken die Leute das Das Problem betrifft Datenbankjobs (geplante Aufgaben), unabhängig vom Lesen der erklärenden Bearbeitung. Auch die Frage ist zu br oad und / oder nicht klar.
Antwort
Die Frage ist sehr verwirrend. Was es verwirrender macht, ist die Tatsache, dass Sie sich für Job und Jobhandler als Beispiele entschieden haben, was den Eindruck erweckt, dass es sich bei der Frage um Datenbankjobs (geplante Aufgaben) handelt. Aber nachdem Sie die Bearbeitung gelesen haben, versuchen Sie vermutlich, ein DAO zu schreiben, und haben über Jobs wie in „einer Beschäftigungsposition“ gesprochen.
Schreiben Sie keine Datenbankklasse. Erstellen Sie einfach eine JDBC-Verbindung und übergeben Sie sie an das DAO.
Sie können entweder versuchen, ein generisches DAO zu schreiben oder einzelne DAOs für jede Entität zu schreiben. DAOs verfügen über SQL Sätze darin.
Ein anderes Muster ist Active Record Pattern .
DAOs greifen auf Datenbanken zu, kapseln SQL und ermöglichen es Ihnen DAOs können auch Methoden haben, die Datenlisten zurückgeben.
Active Record wird normalerweise zum Implementieren von Geschäftsobjekten verwendet, die das Schreiben und Lesen ihrer Daten aus der Datenbank selbst verwalten. Dies wird als zu viel angesehen da Klassen ihre eigene Beharrlichkeit nicht verwalten sollten. Aktive Datensätze stellen eine einzelne Zeile einer Tabelle dar.
Diese Frage zum Umgestalten eines aktiven Datensatzes in ein DAO-Formular hilft Ihnen, da es eine hat Ein vollständiges Beispiel für ein Objekt, das auf die Datenbanken zugreift und Einfügungen oder Aktualisierungen einfügt, und seine Antworten erläutern, wie stattdessen DAO implementiert wird.
Kommentare
- Sie können ORM erwähnen Frameworks auch.
- @COMEFROM OP ist ein Anfänger. Er muss schwimmen lernen, bevor er Jetski fährt. ORMs sind unglaublich komplex.
- Vielen Dank für Ihre Antwort. Ich beziehe mich auf " erstelle einfach eine Datenbankverbindung ". Dies würde bedeuten, eine Verbindung in der Hauptklasse mit der gesamten Fehlerbehandlung usw. herzustellen. Würde ' dieser Konflikt nicht mit dem Prinzip der Einzelverantwortung?
- Die Hauptklasse ' entspricht nicht in der Regel dem SRP, weil es normalerweise die Voraussetzungen vorbereitet, Konfigurationsdateien liest usw., öffnet das Hauptfenster bei GUI-Apps oder ruft zumindest die Methoden auf, die dies tun. Sein Zweck ist es, ein Einstiegspunkt für die App zu sein. Sie können eine Funktion erstellen, die eine Verbindung zurückgibt und von main aufruft, oder Sie können eine Verbindung zu einem Verbindungspoolmanager anfordern, wenn Sie einen Webcontainer verwenden, der Verbindungspools usw. unterstützt.
Schreibe einen Kommentar