Wat op te nemen in een databaseklasse
Geplaatst op februari 15, 2021 door admin Ik ben momenteel een Java-applicatie aan het ontwikkelen die zal communiceren met een SQL-server. Daarom heb ik de klasse Database
gemaakt die verantwoordelijk is voor open()
en close()
.
Ik wil gegevens aan de database kunnen toevoegen. In dit voorbeeld wordt de tafel job genoemd. Daarom heb ik een klasse Job
gemaakt. Naast deze jobs zullen er (veel) verschillende dingen zijn die in de database worden opgeslagen. Mijn vraag is: waar zet ik mijn methode addJob(Job j)
? Tot nu toe kan ik drie mogelijke oplossingen bedenken:
-
Voeg de methode
addJob(Job j)
toe aan deDatabase
class die abstractie biedt voor de rest van het programma. De rest van het programma hoeft zich geen zorgen te maken over hoe dit wordt geïmplementeerd. Het nadeel hiervan is dat deDatabase
uiteindelijk erg groot zal worden. -
Maak een aparte klasse
JobHandler
met de constructorpublic JobHandler(Database d)
die een database accepteert. In dezeJobHandler
ben ik van plan om deaddJob(Job j)
te leveren. Mijn probleem is hier: op welk niveau moet ik communiceren met deDatabase
aangezien er momenteel geen openbare methoden zijn behalveopen()
enclose()
. Moet ik een methode maken die pure SQL-instructies accepteert? Dit ziet er niet erg goed uit. -
Maak de klasse
Database
abstract en breid deze uit zodat ik de ontbrekende methoden hier implementeer . Het nadeel is dat ik de database niet kan doorgeven en dezelfde verbinding niet kan gebruiken voor verschillende soorten queries.
Wat zou iemand doen om dit probleem op te lossen? Hoe moet ik mijn klassen zo structureren dat ze niet te groot worden en dat niet te veel van de databaseklasse wordt blootgesteld aan de klassen die de methoden implementeren om met de gegevens om te gaan?
Bewerken Merk op dat deze job een willekeurige klasse is, die alleen als voorbeeld zou moeten dienen voor de gegevens die in de database zijn opgeslagen.
Reacties
- " Wat zou iemand doen om dit probleem op te lossen? " Er zijn ongeveer 9001 volwassen bibliotheken die precies al deze dingen doen. Gebruik er een.
- Kunt u mij een voorbeeld geven van zon bibliotheek. Ik zou er graag naar willen kijken.
- Wat bedoel je met Job als een voorbeeld voor gegevens?
- Ik heb de zin opnieuw geformuleerd.
- Zoek dan een beter voorbeeld, anders zullen mensen denken dat het probleem is over databasetaken (geplande taken), ongeacht het lezen van de verklarende bewerking.Ook de vraag is te br oad en / of niet duidelijk.
Antwoord
De vraag is erg verwarrend. Wat het nog verwarrender maakt, is het feit dat u besloot Job en Jobhandler als voorbeelden te gebruiken, waardoor men denkt dat de vraag over databasetaken (geplande taken) gaat. Maar na het lezen van de bewerking denk ik dat je probeert een DAO te schrijven en het hebt over banen als in “een baan”.
Schrijf geen databaseklasse. Maak gewoon een JDBC-verbinding en geef deze door aan de DAO.
U kunt ofwel proberen een generieke DAO te schrijven of individuele DAOs voor elke entiteit schrijven. DAOs hebben SQL zinnen erin.
Een ander patroon is Active Record Pattern .
DAOs hebben toegang tot databases, kapselen SQL in en stellen u in staat om de bedrijfsobjecten te vullen. DAOs kunnen ook methoden hebben die lijsten met gegevens retourneren.
Active Record wordt meestal gebruikt om bedrijfsobjecten te implementeren die hun gegevens uit de database zelf schrijven en lezen. Dit wordt als te veel beschouwd aangezien klassen hun eigen volharding niet zouden moeten hanteren. Actieve records vertegenwoordigen een enkele rij van een tabel.
Deze vraag over het herstructureren van een actief record in DAO-formulier zal u helpen omdat het een compleet voorbeeld van een object dat toegang heeft tot de databases en inserts of updates en zijn antwoorden leggen uit hoe DAO in plaats daarvan geïmplementeerd kan worden.
Opmerkingen
- Je zou ORM kunnen noemen frameworks ook.
- @COMEFROM OP is een beginner. Hij moet leren zwemmen voordat hij met een jetski gaat rijden. ORMs zijn ongelooflijk complex.
- Bedankt voor uw antwoord. Ik verwijs naar " maak gewoon een databaseverbinding ". Dit zou betekenen om een verbinding te maken in de hoofdklasse met alle foutafhandeling enz.? Zou dit ' t in strijd zijn met het beginsel van enkele verantwoordelijkheid?
- De hoofdklasse voldoet niet ' t typisch aan de SRP omdat het gewoonlijk de randvoorwaarden voorbereidt, configuratiebestanden leest enz., opent het hoofdvenster in het geval van GUI-apps, of roept in ieder geval de methoden op die dat doen, het doel is om een toegangspunt voor de app te zijn. U kunt een functie maken die aconnection retourneert en deze aanroept vanuit main of u kunt om een verbinding met een connection pool manager vragen als u een webcontainer gebruikt die verbindingspools enz. Ondersteunt.
Geef een reactie