Co zahrnout do třídy databáze
On 15 února, 2021 by admin V současné době vyvíjím aplikaci Java, která bude komunikovat se serverem SQL. Proto jsem vytvořil třídu Database
zodpovědnou za open()
a close()
.
Chci mít možnost přidávat data do databáze. V tomto příkladu se tabulka nazývá job. Proto jsem vytvořil třídu Job
. Kromě těchto úloh bude v databázi uloženo (mnoho) různých věcí. Moje otázka zní: Kam umístím svoji metodu addJob(Job j)
? Zatím mě napadají tři možná řešení:
-
Přidejte metodu
addJob(Job j)
doDatabase
třída, která poskytuje abstrakci pro zbytek programu. Zbytek programu se nemusí starat o to, jak je to implementováno. Nevýhodou je, žeDatabase
se nakonec velmi zvětší. -
Vytvořte samostatnou třídu
JobHandler
s konstruktorempublic JobHandler(Database d)
, který přijímá databázi. V tomtoJobHandler
plánuji poskytnoutaddJob(Job j)
. Můj problém je tady, na které úrovni bych měl interagovat sDatabase
, protože v současné době neexistují žádné veřejné metody kroměopen()
aclose()
. Mám vytvořit metodu, která přijímá čisté příkazy sql? To pro mě nevypadá moc dobře. -
Vytvořte abstrakt třídy
Database
a rozšířte ji tak, abych zde implementoval chybějící metody . Nevýhodou je, že nemohu předat databázi a použít stejné připojení pro více dotazů různých druhů.
Co by člověk udělal pro vyřešení tohoto problému? Jak mám strukturovat své třídy tak, aby nebyly příliš velké a aby příliš mnoho databázové třídy nemělo být vystaveno třídám, které implementují metody pro zacházení s daty?
Upravit Upozorňujeme, že úloha je náhodná třída, která by měla sloužit pouze jako příklad pro data uložená v databázi.
Komentáře
- " Co by člověk udělal pro vyřešení tohoto problému? " Existuje zhruba 9001 vyspělých knihoven, které dělají přesně tohle všechno. Použijte jednu z nich.
- Můžete mi prosím uvést příklad takové knihovny. Rád bych se do ní podíval.
- Co myslíte tím, že Job je jen příkladem dat?
- Přeformuloval jsem větu.
- Pak najděte lepší příklad, jinak si lidé budou myslet, že problém se týká databázových úloh (naplánovaných úkolů), bez ohledu na čtení vysvětlující úpravy. Také otázka je příliš br oad a / nebo není jasné.
Odpověď
Otázka je velmi matoucí. To, co je ještě více matoucí, je skutečnost, že jste se rozhodli použít jako příklady Job a Jobhandler, díky čemuž si člověk myslí, že jde o databázové úlohy (naplánované úlohy). Ale po přečtení úpravy se hádám pokoušíte napsat DAO a mluvili jste o pracovních místech jako o „pracovní pozici“.
Nepište třídu databáze. Stačí vytvořit připojení JDBC a předat jej DAO.
Můžete zkusit napsat obecný DAO nebo napsat jednotlivé DAO pro každou entitu. DAO budou mít SQL věty uvnitř.
Dalším vzorem je Vzor aktivního záznamu .
DAO přistupují k databázím, zapouzdřují SQL a umožňují vám k naplnění obchodních objektů. DAO mohou mít také metody, které vracejí seznamy dat.
Aktivní záznam se obvykle používá k implementaci obchodních objektů, které samy spravují zápis a čtení dat z databáze. To je považováno za příliš mnoho protože třídy by neměly spravovat svou vlastní vytrvalost. Aktivní záznamy představují jeden řádek tabulky.
Tato otázka ohledně refaktorování aktivního záznamu do formuláře DAO vám pomůže, protože má kompletní příklad objektu, který přistupuje k databázím a vkládá nebo aktualizuje, a jeho odpovědi vysvětlují, jak místo toho implementovat DAO.
Komentáře
- Můžete zmínit ORM frameworks also.
- @COMEFROM OP je začátečník. Před jízdou na vodním skútru se musí naučit plavat. ORM jsou neuvěřitelně složité.
- Děkujeme za vaši odpověď. Mám na mysli " stačí vytvořit databázové připojení ". To by znamenalo vytvořit spojení v hlavní třídě se všemi zpracováním chyb atd.? Nebyl by to ' v rozporu s principem jediné odpovědnosti?
- Hlavní třída by nevyhovovala ' tomu SRP, protože obvykle připravuje předpoklady, čte konfigurační soubory atd., otevře hlavní okno v případě aplikací s grafickým uživatelským rozhraním nebo alespoň zavolá metody, které to dělají, jeho účelem je být vstupním bodem pro aplikaci. Můžete vytvořit funkci, která vrací aconnection a zavolá ji z main, nebo můžete požádat o připojení ke správci fondu připojení, pokud používáte webový kontejner, který podporuje fondy připojení atd.
Napsat komentář