Hva skal jeg ta med i en databaseklasse
On februar 15, 2021 by admin Jeg utvikler for tiden et Java-program som vil kommunisere med en SQL-server. Derfor opprettet jeg klassen Database
som er ansvarlig for open()
og close()
.
Jeg vil kunne legge til data i databasen. I dette eksemplet kalles tabellen jobb. Derfor opprettet jeg en klasse Job
. Foruten disse jobbene, vil det være (mange) forskjellige ting som vil bli lagret i databasen. Spørsmålet mitt er: Hvor legger jeg metoden min addJob(Job j)
? Så langt kan jeg tenke meg tre mulige løsninger:
-
Legg til metoden
addJob(Job j)
tilDatabase
klasse som gir abstraksjon for resten av programmet. Resten av programmet trenger ikke å bekymre seg for hvordan dette blir implementert. Ulempen med dette er atDatabase
etter hvert blir veldig stor. -
Lag en egen klasse
JobHandler
med konstruktørenpublic JobHandler(Database d)
som godtar en database. I denneJobHandler
planlegger jeg å giaddJob(Job j)
. Problemet mitt er her, på hvilket nivå skal jeg samhandle medDatabase
siden det for øyeblikket ikke er noen offentlige metoder bortsett fraopen()
ogclose()
. Skal jeg lage en metode som godtar rene SQL-setninger? Dette ser ikke veldig bra ut for meg. -
Gjør klassen
Database
abstrakt og utvid den slik at jeg implementerer de manglende metodene her . Ulempen er at jeg ikke kan sende databasen og bruke den samme tilkoblingen for flere spørsmål av forskjellige slag.
Hva ville man gjort for å løse dette problemet? Hvordan skal jeg strukturere klassene mine slik at de ikke blir for store, og at ikke for mye av databaseklassen må utsettes for klassene som implementerer metodene for å håndtere dataene?
Rediger Vær oppmerksom på at jobben er en tilfeldig klasse, som bare skal tjene som et eksempel for dataene som er lagret i databasen.
Kommentarer
- " Hva ville man gjort for å løse dette problemet? " Det er omtrent 9001 modne biblioteker som gjør akkurat disse tingene. Bruk et av dem.
- Kan du gi meg et eksempel på et slikt bibliotek. Jeg vil se nærmere på det.
- Hva mener du med at Job bare er et eksempel på data?
- Jeg omformulerer setningen.
- Finn så et bedre eksempel, ellers vil folk tro at problemet handler om databasejobber (planlagte oppgaver), uavhengig av å lese den forklarende redigeringen. Også spørsmålet er for br oad og / eller ikke klar.
Svar
Spørsmålet er veldig forvirrende. Det som gjør det mer forvirrende er det faktum at du bestemte deg for å bruke Job og Jobhandler som eksempler som får en til å tenke at spørsmålet handler om databasejobber (planlagte oppgaver). Men etter å ha lest redigeringen antar jeg at du prøver å skrive en DAO og snakket om jobber som i «en stilling».
Ikke skriv en databaseklasse. Bare opprett en JDBC-tilkobling og send den til DAO.
Du kan enten prøve å skrive en generisk DAO eller skrive individuelle DAOer for hver enhet. DAO-er vil ha SQL setninger inni den.
Et annet mønster er Active Record Pattern .
DAOs får tilgang til databaser, innkapsler SQL og lar deg for å fylle ut forretningsobjektene. DAO kan også ha metoder som returnerer lister med data.
Active Record brukes vanligvis til å implementere forretningsobjekter som administrerer å skrive og lese dataene sine fra databasen selv. Dette anses for mye siden klassene ikke skal styre sin egen utholdenhet. Active Records representerer en enkelt rad i en tabell.
Dette spørsmålet om å omorganisere en Active Record til DAO-form vil hjelpe deg fordi den har en komplett eksempel på et objekt som får tilgang til databasene og setter inn eller oppdaterer og svarene på det forklarer hvordan man implementerer DAO i stedet.
Kommentarer
- Du kan nevne ORM rammer også.
- @COMEFROM OP er en nybegynner. Han må lære å svømme før han kjører jetski. ORM er utrolig komplekse.
- Takk for svaret ditt. Jeg refererer til " bare opprett en databaseforbindelse ". Dette vil bety å opprette en forbindelse i hovedklassen med all feilhåndtering etc.? Ville ' ikke denne konflikten med prinsippet om enkeltansvar?
- Hovedklassen overholder ikke ' tisk SRP fordi det vanligvis forbereder forutsetningene, leser konfigurasjonsfiler etc., åpner hovedvinduet når det gjelder GUI-apper, eller i det minste kaller metodene som gjør det, formålet er å være et inngangspunkt for appen. Du kan opprette en funksjon som returnerer tilkobling og ringe den fra main, eller du kan be om en forbindelse til en tilkoblingsbassengbehandling hvis du bruker en webcontainer som støtter tilkoblingsbassenger, etc.
Legg igjen en kommentar