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

[SOLUCIONADO] Mejor forma de devolver datos de consulta?

Estas en el tema de Mejor forma de devolver datos de consulta? en el foro de Java en Foros del Web. Tengo una interfaz desde la cual quiero hacer las consultas. Pongamos como ejemplo: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Java: Ver original Datos bd = new Datos ( ...
  #1 (permalink)  
Antiguo 04/04/2013, 02:24
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Mejor forma de devolver datos de consulta?

Tengo una interfaz desde la cual quiero hacer las consultas.

Pongamos como ejemplo:
Código Java:
Ver original
  1. Datos bd = new Datos();
  2. List resultado = bd.consulta("SELECT nombre FROM clientes");

Puse list por poner algo. Que tipo de dato debería usar si quiero que se adapte a cualquier consulta? Porque devolver el ResultSet directamente me parece poco adecuado.

Dicho de otra forma, no se qué devolver en el método consulta.

Hay algo como un array asociativo en php o algo similar? no se como solucionar esto.
  #2 (permalink)  
Antiguo 04/04/2013, 03:50
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Mejor forma de devolver datos de consulta?

Con el ResultSet lo que tienes que hacer es componer una lista de Objetos a los que mapeas los valores de los registros obtenidos.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #3 (permalink)  
Antiguo 04/04/2013, 03:55
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Respuesta: Mejor forma de devolver datos de consulta?

Lo que pasa es que no son siempre los mismos numeros de campos ni las mismas tablas. Tengo que hacer un método por cada consulta diferente? Quería hacer algo genérico.

Tengo hecho esto pero no me funciona (ya le di bastantes vueltas):
Código Java:
Ver original
  1. public List consulta(String consulta) {        
  2.         List l = null;
  3.         try {            
  4.             Statement stmt = this.conexion.createStatement() ;
  5.             ResultSet rs = stmt.executeQuery( "SELECT * FROM clientes" ) ;          
  6.             ResultSetMetaData md = rs.getMetaData();            
  7.             int columnas = md.getColumnCount();                          
  8.             while( rs.next() ) {                                    
  9.                 List fila = null;
  10.                 for (int i=1; i<=columnas; i++) {                    
  11.                     fila.add(rs.getString(i));                    
  12.                 }
  13.                 l.add(fila);                                
  14.             }            
  15.             rs.close() ;
  16.             stmt.close() ;            
  17.            } catch (SQLException ex) {
  18.                System.out.println(ex);                
  19.         }        
  20.         return l;
  21.     }

No veo el problema
Código Java:
Ver original
  1. Exception in thread "main" java.lang.NullPointerException
  2.     at conexiones.Dbase.consulta(Dbase.java:81)
  3.     at plataformas.Plataformas.main(Plataformas.java:21)
  4. Java Result: 1

Ahora me funciona. Pero no se si es correcto:
Código Java:
Ver original
  1. public List consulta(String consulta) {        
  2.         List l = new ArrayList();
  3.         try {            
  4.             Statement stmt = this.conexion.createStatement() ;
  5.             ResultSet rs = stmt.executeQuery(consulta) ;          
  6.             ResultSetMetaData md = rs.getMetaData();            
  7.             int columnas = md.getColumnCount();                    
  8.             while( rs.next() ) {                                                    
  9.                 List fila = new ArrayList();                
  10.                 for (int i=1; i<=columnas; i++) {                    
  11.                     fila.add(rs.getString(i));                    
  12.                 }
  13.                 l.add(fila);                                
  14.             }            
  15.             rs.close() ;
  16.             stmt.close() ;            
  17.            } catch (SQLException ex) {
  18.                System.out.println(ex);                
  19.         }        
  20.         return l;
  21.     }

Última edición por alyciashape; 04/04/2013 a las 04:12
  #4 (permalink)  
Antiguo 04/04/2013, 08:14
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Mejor forma de devolver datos de consulta?

at conexiones.Dbase.consulta(Dbase.java:81) te dice la linea donde está el nullpointer.

Será esta línea ¿?

int columnas = md.getColumnCount();

nunca vi lo de sacar el metadata de un resultset.

En cuanto a la consulta genérica

ResultSet rs = stmt.executeQuery( "SELECT * FROM clientes" ) ;

en todo caso sería

ResultSet rs = stmt.executeQuery(query) ;

donde query sería lo que le pasarías como parámetro al método consulta, es decir, un String con valor "SELECT * FROM clientes" o "SELECT * FROM productos" o lo que tú quieras.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 04/04/2013, 09:15
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Respuesta: Mejor forma de devolver datos de consulta?

Eso desde luego. En el primer tozo de código que puse se me había pasado, en el último si te fijas ya cambié el query por un string enviado como parámetro. El tema más bien es como almacenar los datos.

Es que vengo de PHP que es todo tan fácil y comodo como hacer un simple array y aquí eso me cuesta mogollón. Hashtable vendría a ser un array? Lo de List no me acaba de tirar bien.
  #6 (permalink)  
Antiguo 04/04/2013, 09:52
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Mejor forma de devolver datos de consulta?

El problema que tienes, y por el cual no hacemos métodos genéricos para recuperar datos, es que en un ArrayList lo que metes son Object. A la hora de recuperar la información debes saber la clase a la que pertenece ese Object para poder hacer un cast.

Desde java 5 y con el uso de generics se suelen usar ArrayList<RegistroX> donde añades objetos de la clase RegistroX donde X representaria a la tabla consultada. Al volcar los elementos del resultset en el RegistroX tienes que hacerlo indicando el tipo de dato (String, Integer, Long...) para que luego se pueda recuperar correctamente.

Algunos frameworks como Hibernate te permiten volcar directamente los resultados en un Objeto a partir del mapeo relacional (un archivo xml que relaciona las columnas en la tabla correspondiente con los objetos del POJO o clase contenedora).

Como ves en Java no es tan simple como en Php.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #7 (permalink)  
Antiguo 04/04/2013, 10:20
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Respuesta: Mejor forma de devolver datos de consulta?

Gracias FUzzylog,
creo que voy a hacer un modelo con una clase Java básica de todo para esa tabla al menos y paso un ArrayList<clase> y me ahorro dolores de cabeza.

Etiquetas: devolver, forma
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 18:20.