Co należy zawrzeć w klasie bazy danych
On 15 lutego, 2021 by admin Obecnie pracuję nad aplikacją Java, która będzie komunikować się z serwerem SQL. Dlatego utworzyłem klasę Database
, która jest odpowiedzialna za open()
i close()
.
Chcę móc dodawać dane do bazy danych. W tym przykładzie tabela nazywa się job. Dlatego utworzyłem klasę Job
. Oprócz tych prac w bazie danych będzie (wiele) różnych rzeczy. Moje pytanie brzmi: gdzie mam umieścić moją metodę addJob(Job j)
? Jak dotąd przychodzą mi do głowy trzy możliwe rozwiązania:
-
Dodaj metodę
addJob(Job j)
doDatabase
, która dostarcza abstrakcji dla reszty programu. Reszta programu nie musi się martwić, jak to zostanie zaimplementowane. Wadą tego jest to, żeDatabase
w końcu stanie się bardzo duży. -
Utwórz oddzielną klasę
JobHandler
z konstruktorempublic JobHandler(Database d)
, który akceptuje bazę danych. W tymJobHandler
planuję udostępnićaddJob(Job j)
. Mój problem polega na tym, na którym poziomie powinienem wejść w interakcję zDatabase
, ponieważ obecnie nie ma żadnych publicznych metod z wyjątkiemopen()
iclose()
. Czy powinienem utworzyć metodę, która akceptuje czyste instrukcje sql? Nie wygląda to dla mnie zbyt dobrze. -
Uczyń klasę
Database
abstrakcyjną i rozszerz ją tak, aby zaimplementować tutaj brakujące metody . Wadą jest to, że nie mogę przepuścić bazy danych i używać tego samego połączenia dla wielu zapytań różnego rodzaju.
Co można zrobić, aby rozwiązać ten problem? Jak powinienem ustrukturyzować moje klasy, aby nie były zbyt duże, a także aby klasa bazy danych nie była zbyt duża dla klas, które implementują metody do obsługi danych?
Edytuj Należy pamiętać, że to zadanie jest klasą losową, która powinna służyć jako przykład dla danych przechowywanych w bazie danych.
Komentarze
- " Co należałoby zrobić, aby rozwiązać ten problem? " Istnieje około 9001 dojrzałych bibliotek, które robią dokładnie to wszystko. Użyj jednej z nich.
- Czy możesz mi podać przykład takiej biblioteki. Chciałbym się temu przyjrzeć.
- Co masz na myśli, mówiąc, że Job jest tylko przykładem danych?
- Przeformułowałem zdanie.
- Następnie znajdź lepszy przykład, w przeciwnym razie ludzie pomyślą, że Problem dotyczy zadań bazodanowych (zaplanowanych zadań), niezależnie od przeczytania edycji objaśniającej oad i / lub niejasne.
Odpowiedź
Pytanie jest bardzo zagmatwane. Bardziej zagmatwany jest fakt, że zdecydowałeś się użyć Job i Jobhandler jako przykładów, co sprawia, że myślisz, że pytanie dotyczy zadań w bazie danych (zaplanowanych zadań). Ale po przeczytaniu edycji wydaje mi się, że próbujesz napisać DAO i mówisz o pracy jako o „stanowisku zatrudnienia”.
Nie pisz klasy bazy danych. Po prostu utwórz połączenie JDBC i przekaż je do DAO.
Możesz spróbować napisać ogólny DAO lub napisać osobne DAO dla każdej jednostki. DAO będą miały SQL zdań wewnątrz niego.
Innym wzorcem jest wzorzec aktywnego rekordu .
DAOsą dostęp do baz danych, hermetyzują SQL i pozwalają do zapełniania obiektów biznesowych. DAO mogą również mieć metody zwracające listy danych.
Moduł Active Record jest zwykle używany do implementacji obiektów biznesowych, które same zarządzają zapisem i odczytem danych z bazy danych. Uważa się to za zbyt duże ponieważ klasy nie powinny kierować własną wytrwałością. Rekordy aktywne reprezentują pojedynczy wiersz tabeli.
To pytanie dotyczące refaktoryzacji rekordu aktywnego do formularza DAO pomoże, ponieważ ma pełny przykład obiektu, który uzyskuje dostęp do baz danych i wstawia lub aktualizuje, a jego odpowiedzi wyjaśniają, jak zamiast tego zaimplementować DAO.
Komentarze
- Możesz wspomnieć o ORM frameworki również.
- @COMEFROM OP jest początkującym. Przed jazdą na skuterze wodnym musi nauczyć się pływać. ORMy są niezwykle złożone.
- Dziękuję za odpowiedź. Mam na myśli " po prostu utwórz połączenie z bazą danych ". Oznaczałoby to utworzenie połączenia w głównej klasie z obsługą wszystkich błędów itp.? Czy nie ' nie byłoby sprzeczne z zasadą pojedynczej odpowiedzialności?
- Klasa główna nie ' nie jest zazwyczaj zgodna z SRP, ponieważ zwykle przygotowuje warunki wstępne, czyta pliki konfiguracyjne itp., otwiera główne okno w przypadku aplikacji GUI lub przynajmniej wywołuje metody, które to robią, jego celem jest bycie punktem wejścia dla aplikacji. Możesz utworzyć funkcję, która zwraca połączenie i wywołać ją z głównego lub możesz poprosić o połączenie z menedżerem puli połączeń, jeśli używasz kontenera internetowego obsługującego pule połączeń itp.
Dodaj komentarz