Foros del Web » Programación para mayores de 30 ;) » Programación General »

Comunicación con la base de datos ¿Siempre usar objetos?

Estas en el tema de Comunicación con la base de datos ¿Siempre usar objetos? en el foro de Programación General en Foros del Web. Anteriormente desarrollé un proyecto en Visual Basic 2013 y Oracle Database 11.2g. Mi capa de persistencia por llamarlo de alguna forma era una clase con ...
  #1 (permalink)  
Antiguo 29/09/2015, 13:35
Avatar de OctavioLinares  
Fecha de Ingreso: septiembre-2015
Mensajes: 1
Antigüedad: 9 años, 3 meses
Puntos: 0
Información Comunicación con la base de datos ¿Siempre usar objetos?

Anteriormente desarrollé un proyecto en Visual Basic 2013 y Oracle Database 11.2g. Mi capa de persistencia por llamarlo de alguna forma era una clase con 3 procedimientos:

Código:
Devuelve uno o mas registros según la instrucción sql
Public Function leerRegistros(ByVal instruccionSQL As String) As DataTable
'Codigo
End Function

'Devuelve un valor escalar según la intrucción sql
Public Function leerDato(ByVal instruccionSQL As String) As Object
'Código
End Funtion

'Ejecuta un insert o update según la instrucción SQL
Public Sub modificarBaseDatos(ByVal instruccionSQL As String) 
'Código
End Sub
Eso me resolvió la vida en aquel proyecto, si se dan cuenta es fácil de hacer operaciones con la base de datos.

Hoy en día estoy realizando un proyecto web con Java, tengo que usar procedimientos almacenados e implementar MVC. Me he encontrado con mucha información que no logro asimilar. He visto ejemplos donde usan frameworks como EJB y JPA y otros donde no los utilizan, pero en cuanto al tema de la persistencia la idea es la misma: utilizar clases de entidad que representen a las tablas en la base de datos.

Volviendo a mi proyecto en VB, con las dos primeras funciones podía seleccionar de forma precisa los datos que yo queria obtener, solo bastaba con formar adecuadamente la instrucción SQL. Ahora en el proyecto de Java me surguen varias dudas:

1) Suponiendo que tengo la clase Empresa que representa a una tabla con 10 campos y sólo necesito obtener los datos de 2 campos ¿Téngo que buscar la empresa en la base de datos y llenar los 10 atributos de la clase? Para mi esto supone un problema de trabajo extra para el RDBMS.

2) La tabla Empresas tiene una clave foránea que es el id del estado donde se ubica. Si en la aplicación lo que queiro es obtener el nombre del estado ¿Cómo realizo esto?

3) En base de datos existen lo que se llaman vistas que pueden ser el resultado de una consulta de unión de distintas tablas. ¿Si quiero obtener los datos de una vista tengo que crear una clase de entidad que respresente a la vista?

Última edición por OctavioLinares; 29/09/2015 a las 13:37 Razón: Error ortográfico
  #2 (permalink)  
Antiguo 29/09/2015, 13:55
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 9 años, 11 meses
Puntos: 52
Respuesta: Comunicación con la base de datos ¿Siempre usar objetos?

Desconozco como es en java, seguramente debe requerir escribir mucho código para cualquier cosa, como siempre.

Pero en .Net, en general se recomienda Entity Framework, que te resuelve no solo el problema de no tener que escribir el SQL manualmente (a menos que quieras hacerlo para cosas específicas o cuestiones de rendimiento en algunos casos), si no que también te mapea automáticamente todos los datos de la base a las entidades del modelo para que no tengas que hacerlo vos mismo.

Con respecto a tu pregunta (1): en C# usando proyecciones se puede lograr traer solamente los campos que se deseen de una tabla, si es que no se quieren todos.

Código C#:
Ver original
  1. var empleados = db.Empleados.Select(x => new { x.Id, x.Nombre, x.Apellido }).ToList();

usando esa instrucción, EF genera el SELECT Empleados.Id, Empleados.Nombre, Empleados.Apellido en lugar de SELECT *.

Tu pregunta (2): En general se recomienda que el modelo tenga lo que se llaman "navigation properties" que son propiedades que relacionan las entidades:

Código C#:
Ver original
  1. public class Estado { .... }
  2.  
  3. public class Empresa
  4. {
  5.      public Estado Estado { get; set; }
  6.      
  7.      //.....
  8. }

eso hace que EF mapee automaticamente las foreign keys y te permita usar la funcionalidad de Include para definir qué entidades querés traer:

Código C#:
Ver original
  1. var empresas = db.Empresas.Include(x => x.Estado).ToList();

Eso te genera el SQL con un join, y te trae las empresas, cada una con su respectivo estado asociado, presente en la propiedad Estado.

Tu pregunta (3): En general se recomienda trabajar con datos fuertemente tipados, es decir, que necesitás una clase, aunque también podés usar un tipo anónimo como te mostré arriba.

Todo esto que te mencioné aplica a .Net, por supuesto. En java desconozco como sea, pero viendo lo limitado que es el lenguaje java yo diría que seguramente requiere el triple de código hacer lo mismo.
  #3 (permalink)  
Antiguo 29/09/2015, 14:25
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 4 meses
Puntos: 182
Respuesta: Comunicación con la base de datos ¿Siempre usar objetos?

Cita:
Iniciado por OctavioLinares Ver Mensaje
1) Suponiendo que tengo la clase Empresa que representa a una tabla con 10 campos y sólo necesito obtener los datos de 2 campos ¿Téngo que buscar la empresa en la base de datos y llenar los 10 atributos de la clase? Para mi esto supone un problema de trabajo extra para el RDBMS.

2) La tabla Empresas tiene una clave foránea que es el id del estado donde se ubica. Si en la aplicación lo que queiro es obtener el nombre del estado ¿Cómo realizo esto?

3) En base de datos existen lo que se llaman vistas que pueden ser el resultado de una consulta de unión de distintas tablas. ¿Si quiero obtener los datos de una vista tengo que crear una clase de entidad que respresente a la vista?
1) O bien recuperas la empresa con un find a partir del id, o bien utilizas HQL para recuperar los campos especificos que necesitas. http://stackoverflow.com/questions/1...hat-is-the-equ

2) Bien a traves de objectos: empresa.getEstado().getNombre(); o bien directamente por HQL: empresa.estado.nombre.

3) La puedes mapear con @Table exactamente de la misma forma que haces con las tablas.


Cita:
¿Siempre usar objetos?
No es obligatorio en obligatorio. No se que framework utilizas, pero yo no conozco ninguno que obligue a utilizar una implementacion JPA.
Puedes perfectamente utilizar SQL del mismo modo que hacias con VB utilizando JDBC: http://www.oracle.com/technetwork/ja...ew-141217.html
Aqui tienes un tutorial: http://www.tutorialspoint.com/jdbc/

Tambien existen montones de librerias que permiten hacer las consultas mas facilmente. Yo te propongo JDBI, que presenta una api fluida muy practica: http://jdbi.org/


Un saludo
__________________
If to err is human, then programmers are the most human of us

Última edición por Profesor_Falken; 30/09/2015 a las 00:53

Etiquetas: classes, entity, framework, java, jpa, mvc
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:07.