Qué incluir en una clase de base de datos
On febrero 15, 2021 by admin Actualmente estoy desarrollando una aplicación Java, que se comunicará con un servidor SQL. Por lo tanto, creé la clase Database
que es responsable de open()
y close()
.
Quiero poder agregar datos a la base de datos. En este ejemplo, la tabla se llama trabajo. Por lo tanto, creé una clase Job
. Además de estos trabajos, habrá (muchas) cosas diferentes, que se almacenarán en la base de datos. Mi pregunta es: ¿Dónde pongo mi método addJob(Job j)
? Hasta ahora, puedo pensar en tres posibles soluciones:
-
Agregue el método
addJob(Job j)
alDatabase
clase que proporciona abstracción para el resto del programa. El resto del programa no tiene que preocuparse de cómo se implementa. La desventaja de esto es que elDatabase
se volverá muy grande eventualmente. -
Cree una clase separada
JobHandler
con el constructorpublic JobHandler(Database d)
que acepta una base de datos. En esteJobHandler
planeo proporcionar eladdJob(Job j)
. Mi problema está aquí, en qué nivel debería interactuar conDatabase
ya que actualmente no hay métodos públicos exceptoopen()
yclose()
. ¿Debo crear un método que acepte declaraciones SQL puras? Esto no me parece muy bien. -
Haga que la clase
Database
sea abstracta y amplíela para que implemente los métodos que faltan aquí. . La desventaja es que no puedo pasar la base de datos y usar la misma conexión para múltiples consultas de diferentes tipos.
¿Qué haría uno para resolver este problema? ¿Cómo debería estructurar mis clases para que no sean demasiado grandes y tampoco demasiado de la clase de la base de datos tenga que estar expuesta a las clases que implementan los métodos para manejar los datos?
Editar Tenga en cuenta que ese trabajo es una clase aleatoria, que debería servir como ejemplo para los datos almacenados en la base de datos.
Comentarios
- " ¿Qué haría uno para resolver este problema? " Hay aproximadamente 9001 bibliotecas maduras que hacen exactamente todas estas cosas. Utilice una de ellas.
- ¿Puede darme un ejemplo de una biblioteca de este tipo? Me gustaría investigarlo.
- ¿Qué quiere decir con que Job es solo un ejemplo de datos?
- Reformulé la oración.
- Luego busque un mejor ejemplo, de lo contrario la gente pensará que El problema es sobre trabajos de base de datos (tareas programadas), independientemente de leer la edición explicativa. También la pregunta es demasiado br oad y / o no está claro.
Respuesta
La pregunta es muy confusa. Lo que lo hace más confuso es el hecho de que decidió usar Job y Jobhandler como ejemplos, lo que le hace pensar que la pregunta es sobre trabajos de base de datos (tareas programadas). Pero después de leer la edición, supongo que estás intentando escribir un DAO y estabas hablando de trabajos como en «una posición de empleo».
No escriba una clase de base de datos. Simplemente cree una conexión JDBC y pásela al DAO.
Puede intentar escribir un DAO genérico o escribir DAO individuales para cada entidad. Los DAO tendrán SQL oraciones dentro de él.
Otro patrón es Active Record Pattern .
Los DAO acceden a bases de datos, encapsulan SQL y le permiten para completar los objetos de negocio. Los DAO también pueden tener métodos que devuelven listas de datos.
El registro activo se utiliza generalmente para implementar objetos de negocio que gestionan la escritura y la lectura de sus datos desde la base de datos. Esto se considera demasiado ya que las clases no deberían manejar su propia persistencia. Los registros activos representan una sola fila de una tabla.
Esta pregunta sobre la refactorización de un registro activo en forma DAO le ayudará porque tiene una ejemplo completo de un objeto que accede a las bases de datos e inserta o actualiza y sus respuestas explican cómo implementar DAO en su lugar.
Comentarios
- Podría mencionar ORM frameworks también.
- @COMEFROM OP es un principiante. Debe aprender a nadar antes de conducir una moto de agua. Los ORM son increíblemente complejos.
- Gracias por tu respuesta. Me refiero a " simplemente crea una conexión de base de datos ". ¿Esto significaría crear una conexión en la clase principal con todo el manejo de errores, etc.? ¿No ' esto entraría en conflicto con el principio de responsabilidad única?
- La clase principal no ' t normalmente cumple con el SRP porque normalmente prepara las condiciones previas, lee archivos de configuración, etc., abre la ventana principal en el caso de las aplicaciones GUI, o al menos llama a los métodos que lo hacen, su propósito es ser un punto de entrada para la aplicación. Puede crear una función que devuelva una conexión y llamarla desde main o puede solicitar una conexión a un administrador de grupo de conexiones si está utilizando un contenedor web que admita grupos de conexiones, etc.
Deja una respuesta