Ce să includ într-o clasă de baze de date
On februarie 15, 2021 by admin În prezent dezvolt o aplicație Java, care va comunica cu un server SQL. Prin urmare, am creat clasa Database
care este responsabilă pentru open()
și close()
.
Vreau să pot adăuga date la baza de date. În acest exemplu, tabelul se numește job. Prin urmare, am creat o clasă Job
. Pe lângă aceste joburi, vor exista (multe) lucruri diferite, care vor fi stocate în baza de date. Întrebarea mea este: Unde îmi pun metoda addJob(Job j)
? Până în prezent, mă pot gândi la trei soluții posibile:
-
Adăugați metoda
addJob(Job j)
laDatabase
class care oferă abstractizare pentru restul programului. Restul programului nu trebuie să-și facă griji cum este implementat acest lucru. Dezavantajul este căDatabase
va deveni foarte mare în cele din urmă. -
Creați o clasă separată
JobHandler
cu constructorulpublic JobHandler(Database d)
care acceptă o bază de date. În acestJobHandler
intenționez să furnizezaddJob(Job j)
. Problema mea este aici, la ce nivel ar trebui să interacționez cuDatabase
, deoarece în prezent nu există metode publice, cu excepțiaopen()
șiclose()
. Ar trebui să creez o metodă care acceptă instrucțiuni sql pure? Acest lucru nu mi se pare foarte bun. -
Faceți clasa
Database
abstractă și extindeți-o astfel încât să implementez metodele lipsă aici . Dezavantajul este că nu pot trece baza de date și nu folosesc aceeași conexiune pentru mai multe interogări de diferite tipuri.
Ce s-ar face pentru a rezolva această problemă? Cum ar trebui să-mi structurez clasele astfel încât acestea să nu devină prea mari și, de asemenea, să nu fie expuse prea mult din clasa bazei de date claselor care implementează metodele de tratare a datelor?
Editați Vă rugăm să rețineți că jobul este o clasă aleatorie, care ar trebui să servească doar ca exemplu pentru datele stocate în baza de date.
Comentarii
- " Ce s-ar face pentru a rezolva această problemă? " Există aproximativ 9001 de biblioteci mature care fac exact toate aceste lucruri. Utilizați una dintre ele.
- Vă rog să-mi dați un exemplu pentru o astfel de bibliotecă. Aș dori să o analizez.
- Ce vrei să spui prin faptul că Job este doar un exemplu pentru date?
- Am reformulat propoziția.
- Apoi găsește un exemplu mai bun, altfel oamenii vor crede că problema este legată de joburile bazei de date (sarcini programate), indiferent de citirea editării explicative. De asemenea, întrebarea este prea br oad și / sau nu este clar.
Răspuns
Întrebarea este foarte confuză. Ceea ce îl face mai confuz este faptul că ați decis să utilizați Job și Jobhandler ca exemple, ceea ce face să credeți că întrebarea este despre joburile bazei de date (sarcini programate). Dar, după ce ați citit editarea, cred că încercați să scrieți un DAO și ați vorbit despre locuri de muncă ca în „o poziție de angajare”.
Nu scrieți o clasă de bază de date. Creați o conexiune JDBC și treceți-o către DAO.
Puteți încerca fie să scrieți un DAO generic, fie să scrieți DAO individuale pentru fiecare entitate. DAO-urile vor avea SQL propoziții în interiorul său.
Un alt model este Model de înregistrare activă .
DAO-urile accesează bazele de date, încapsulând SQL și vă permit pentru a popula obiecte comerciale. DAO-urile pot avea, de asemenea, metode care returnează liste de date.
Înregistrarea activă este de obicei folosită pentru a implementa obiecte comerciale care gestionează scrierea și citirea propriilor date din baza de date. Acest lucru este considerat prea mult deoarece clasele nu trebuie să-și gestioneze propria persistență. Înregistrările active reprezintă un singur rând al unui tabel.
Această întrebare despre refactorizarea unei înregistrări active în formularul DAO vă va ajuta deoarece are un exemplu complet al unui obiect care accesează bazele de date și inserțiile sau actualizările și răspunsurile sale explică cum să implementați DAO în schimb.
Comentarii
- Ați putea menționa ORM de asemenea, cadre.
- @COMEFROM OP este un începător. El trebuie să învețe să înoate înainte de a conduce un jet ski. ORM-urile sunt incredibil de complexe.
- Vă mulțumim pentru răspuns. Mă refer la " trebuie doar să creați o conexiune la bază de date ". Acest lucru ar însemna să creați o conexiune în clasa principală cu toate gestionarea erorilor etc.? ' nu ar fi acest conflict cu principiul responsabilității unice?
- Clasa principală nu ' nu respectă în mod tipic SRP deoarece pregătește de obicei condițiile prealabile, citește fișiere de configurare etc., deschide fereastra principală în cazul aplicațiilor GUI sau cel puțin apelează metodele care fac acest lucru, scopul său este de a fi un punct de intrare pentru aplicație. Puteți crea o funcție care returnează conexiunea și o puteți apela de la main sau puteți solicita o conexiune la un manager de pool de conexiuni dacă utilizați un container web care acceptă pool-uri de conexiuni etc.
Lasă un răspuns