Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: macshivi en 11 Marzo 2018, 00:19 am



Título: Como puedo mapear de forma generica objetos con JDBC?
Publicado por: macshivi en 11 Marzo 2018, 00:19 am
Generalmente, cuando uso JDBC, para mapear un objeto suelo utilizar la libreria de apache DbUtils. Pero ahora mismo, tengo que hacer un proyecto sin ella, y no puedo utilizar ningun ORM, solo puedo utilizar el JDBC. Por lo que cuando mapeo objetos tengo que hacer algo parecido ha esto:

Código
  1. Connection con =  getConection();
  2. String sql = "select * from tabla"
  3. Statement stmt = con.createStatemnet();
  4. ResultSet rs = stmt.executeQuery(sql);
  5.  
  6. while (rs.next) {
  7.  Bean bn = new Bean()
  8.   /// extraigo las variables de manera manual
  9. bn.setAttr(rs.getString());
  10. bn.setAttr1(rs.getInt());
  11. }
  12.  

Entonces, mi pregunta es la siguiente. ¿Como podria crear un metodo que pasandole un objeto me lo mapee desde la base de datos, y me devuelva una lista?

Gracias.


Título: Re: Como puedo mapear de forma generica objetos con JDBC?
Publicado por: ivancea96 en 11 Marzo 2018, 14:28 pm
Tendrías que usar reflection, que te permite conocer la estructura de una clase, y modificar campos o llamar métodos de objetos de esta.
Partiendo de la premisa de que le eches un ojo a la reflection (http://www.oracle.com/technetwork/articles/java/javareflection-1536171.html (http://www.oracle.com/technetwork/articles/java/javareflection-1536171.html)), tendrías que ver los campos del bean al que le quieras asignar los datos del SQL, y compararlos con los nombres de las columnas del SQL (también puedes usar anotaciones si los nombres no coinciden).
Cuando encuentras el campo en cuestión, tendrías que asegurarte de que los tipos son correctos (VARCHAR -> String, INT -> int/Integer)...

Lo cierto es que hacer estod e forma genérica no es difícil, pero requiere tiempo y conocimiento de Reflection.
No es algo que deberías hacer para un proyecto pequeño. Tú considerarás si lo ves <necesario> (Ten en cuenta que lo que haces actualmente, llamando a cada uno de los setters, no es algo raro ni algo malo. Es la forma de hacerlo, simplemente.