Cosa includere in una classe Database
Su Febbraio 15, 2021 da admin Attualmente sto sviluppando unapplicazione Java, che comunicherà con un server SQL. Pertanto ho creato la classe Database
responsabile di open()
e close()
.
Voglio essere in grado di aggiungere dati al database. In questo esempio, la tabella si chiama lavoro. Pertanto ho creato una classe Job
. Oltre a questi lavori, ci saranno (molte) cose diverse, che verranno memorizzate nel database. La mia domanda è: dove metto il mio metodo addJob(Job j)
? Finora, posso pensare a tre possibili soluzioni:
-
Aggiungi il metodo
addJob(Job j)
aDatabase
classe che fornisce lastrazione per il resto del programma. Il resto del programma non deve preoccuparsi di come viene implementato. Lo svantaggio di questo è cheDatabase
alla fine diventerà molto grande. -
Crea una classe separata
JobHandler
con il costruttorepublic JobHandler(Database d)
che accetta un database. In questoJobHandler
ho intenzione di fornire iladdJob(Job j)
. Il mio problema è qui, a quale livello devo interagire conDatabase
poiché attualmente non esistono metodi pubblici eccettoopen()
eclose()
. Devo creare un metodo che accetti istruzioni SQL pure? Questo non mi sembra molto buono. -
Rendi la classe
Database
astratta ed estendila in modo da implementare i metodi mancanti qui . Lo svantaggio è che non posso passare il database e utilizzare la stessa connessione per più query di diverso tipo.
Cosa si farebbe per risolvere questo problema? Come devo strutturare le mie classi in modo che non diventino troppo grandi e inoltre non deve essere esposta troppo della classe del database alle classi che implementano i metodi per trattare i dati?
Modifica Tieni presente che il lavoro è una classe casuale, che dovrebbe servire solo da esempio per i dati memorizzati nel database.
Commenti
- " Che cosa si farebbe per risolvere questo problema? " Ci sono circa 9001 librerie mature che fanno esattamente tutto questo. Usane una.
- Puoi darmi un esempio per una libreria del genere. Mi piacerebbe esaminarla.
- Cosa intendi quando Giobbe è solo un esempio di dati?
- Ho riformulato la frase.
- Quindi trova un esempio migliore, altrimenti la gente penserà che il problema riguarda i lavori del database (attività pianificate), indipendentemente dalla lettura della modifica esplicativa, inoltre la domanda è troppo br oad e / o non chiaro.
Risposta
La domanda è molto confusa. Ciò che lo rende più confuso è il fatto che hai deciso di utilizzare Job e Jobhandler come esempi, il che fa pensare che la domanda riguardi i lavori del database (attività pianificate). Ma dopo aver letto la modifica, immagino che tu stia cercando di scrivere un DAO e stavi parlando di lavori come in “una posizione di lavoro”.
Non scrivere una classe Database. Basta creare una connessione JDBC e passarla al DAO.
Puoi provare a scrivere un DAO generico o o scrivere DAO individuali per ciascuna entità. DAO avranno SQL frasi al suo interno.
Un altro pattern è Active Record Pattern .
I DAO accedono ai database, incapsulano SQL e consentono per popolare gli oggetti di business. I DAO possono anche avere metodi che restituiscono elenchi di dati.
Active Record viene solitamente utilizzato per implementare oggetti di business che gestiscono la scrittura e la lettura dei propri dati dal database stesso. Questo è considerato troppo poiché le classi non dovrebbero gestire la propria persistenza. I record attivi rappresentano una singola riga di una tabella.
Questa domanda sul refactoring di un record attivo nel formato DAO ti aiuterà perché ha un esempio completo di un oggetto che accede ai database e inserisce o aggiorna e le sue risposte spiegano invece come implementare DAO.
Commenti
- Potresti menzionare ORM frameworks anche.
- @COMEFROM OP è un principiante. Deve imparare a nuotare prima di guidare una moto dacqua. Gli ORM sono incredibilmente complessi.
- Grazie per la tua risposta. Mi riferisco a " crea una connessione al database ". Ciò significherebbe creare una connessione nella classe principale con tutta la gestione degli errori, ecc.? ' non sarebbe in conflitto con il principio di responsabilità unica?
- La classe principale ' tipicamente non è conforme al SRP perché di solito prepara le precondizioni, legge i file di configurazione ecc., apre la finestra principale nel caso delle app GUI, o almeno chiama i metodi che lo fanno, il suo scopo è quello di essere un punto di ingresso per lapp. Puoi creare una funzione che restituisca una connessione e chiamarla da main oppure puoi chiedere una connessione a un gestore di pool di connessioni se stai utilizzando un contenitore web che supporta pool di connessioni, ecc.
Lascia un commento