Un ejemplo sencillo de ésto es el poder determinar la cantidad de filas que retorna una consulta SQL en un objeto ResultSet; en muchos foros de programación recomiendan el realizar nuevamente una consulta a la BD con un COUNT pero eso es algo que no me resulta muy funcional, especialmente en BD excesivamente grandes como las que manejo en la empresa (600Gb), piensen: "realizar otra consulta", como que no...
Después de un tiempo logré diseñar una solución que en realidad es muy simple; en Java existe una librería llamada java.util que contiene una clase List, la cual permite agregar objetos a la lista de forma dinámica (como ya saben en java los vectores son de longitud fíja y por esta razón no podemos utilizarla ya que no sabemos la cantidad de filas retornadas), utilizando ésta Clase podemos implementar un método que consulte por ejemplo todos los Empleados de un Departamento X y que este método nos retorne un vector de tipo Empleado con todos los datos extraidos de la BD.
Codigo Ejemplo:
/**
* Método que recibe el código del Departamento y retorna un vector de tipo Empleado con los datos de éstos.
* @param idDepart Id del departamento del cual se desea extraer la información.
* @return <code>Persona[]</code> Vector de Tipo Persona con los datos de los empleados pertenecientes al departamento.
* @throws java.lang.Exception En caso de cualquier error de ejecución.
*/
public static Emplado[] getEmpleadosX_Departamento( int idDepart ) throws Exception{
try{
/* Configuraciones de conexión. */
String DRIVER_SQL = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String DRIVER_ORACLE = "oracle.jdbc.driver.OracleDriver";
Class.forName( /* Alguno de los dos anteriores. */ );
Connection Cnx = DriverManager.getConnection( /* String de conexión aquí. */ );
Cnx.setAutoCommit( true );
/* Ejecusión de la consulta. */
String strSQL = "SELECT cedula, nombre FROM tbEmpleados WHERE idDept = " + idDepart;
Statement stmt = Cnx.createStatement();
ResultSet rsltEmpleados = stmt.executeQuery( strSQL );
/*
Instanciasión de la Lista.
Como pueden observar al crear la lista se le indica que c/ítem
de la lista es de tipo Empleado.
*/
java.util.List<Empleado> listaEmpleados = new ArrayList<Empleado>();
/*
Se recorre cada fila del ResultSet para instancia a cada empleado y agregarlo a la lista de empleados.
*/
while( rsltEmpleados.next() ){
/* Se instancia del nuevo Empleado. */
Empleado tempEmpleado = new Empleado(
rsltEmpleados.getString( "cedula" ) ),
rsltEmpleados.getString( "nombre" ) )
);
/* Se agrega el empleado a la lista. */
listaEmpleados.add( tempEmpleado );
}
/* Cierre de la conexión con la BD. */
Cnx.close();
/*
Se retorna el contenido de la Lista pero convirtiéndola en vector de tipo Empleado ingresando un nuevo vector de tipo Empleado y esta vez si sabemos el tamaño trayendo el tamaño de la lista.
*/
return listaEmpleados.toArray( new Empleado[ listaEmpleados.size() ] );
}
catch( Exception err ){
throw new Exception(
"Error en getEmpleadosX_Departamento( int ).\nDetalle:\n + " + err.getMessage()
);
}
}
Este es un ejemplo básico y me disculpo si existen errores de sintaxis ya que lo he digitado y programado directamente del Blog y no le he compilado.
Importante: En este ejemplo me he saltado una capa de programación y he agregado la capa de acceso a datos directamente a la capa de lógica de negocios, esto no es recomendable ya que deben de implementar una clase dedicada únicamente al acceso de los datos, conectar-desconectar-ejecutar-consultar, etc...
Buen articulo !!. Esta solución siempre se ha utilizado ,de hecho en los Frameworks que trabajan con java funcionan con este principio básico.
ResponderEliminarBuen post amigo, yo prefiero Java que .Net
ResponderEliminarBuen Blog!!
ResponderEliminarHola, me gustaría que pusieras el código que explico en la UTN del pacifico, que era la creación de una matriz en la que se agregaban usuarios
ResponderEliminarHola Alonso! Cuando di un charla en la UTN del Pacífico solo expliqué una versión reducida de una clase que se encargaba de la capa de acceso a datos en SQL, la verdad no recuerdo haber explicado algo relacionado con matrices, perdona no poder ayudarte, tal vez me confundiste con otro expositor.
EliminarSaludos y cualquier otra consulta con mucho gusto, si lo desea puedes enviarme correos a: anibalgh@msn.com
hola como estas??
ResponderEliminarpara saber cuantas filas tiene el resultset es facil
ResultSet.last() //esto te lleva a la ultima row del resultset
ResultSet.getRow() // esto te da el numero del row donde estas parad y como estmos eb la ultima row, este te trae el numero de filas que tienes en el resultset... para volver al primero hasces ResultSet.first()...
saludo
Hola! Muchas gracias por el aporte, de hecho ya tengo una entrada en mi blog con esa información: http://programacion-x.blogspot.com/2011/07/cuantas-filas-retorna-un-resultset.html
EliminarHola! es muy bueno el ejemplo y te has tomado un buen esfuerzo en hacerlo; pero no me gusta lo de implementar vectores en Java ya que los mismos son sincronizados y por lo tanto mucho más lentos que un arreglo por ejemplo.
ResponderEliminarBUEN APORTE AMIGO....
ResponderEliminarbuen aporte amigo
ResponderEliminarBuen aporte, pero como todos han dicho, en los framework ya se trabaja de esa manera, bueno almenos yo lo trabajo asi, donde tengo mis Beans, y las listas las creo de ese tipo, yo me he topado con un problema, y esque al realizar una consulta, y recuperar esos datos para agregarlos a mi List, el ResultSet me truena en sierta cantidad de iteraciones.....
ResponderEliminarHola, que tal, se que este hilo es viejo, pero queria saber si hay alguien que me pueda ayudar. Tengo dos tablas una que se llama estado que contiene dos campos, uno id (int) y otro estado (0 o 1) con 16.... si hay alguien para ayudar, termino de escribir mi problema, desde ya muchas gracias
ResponderEliminarHola Gabriel, indícame los detalles y así veo si puedo ayudarte, de ser así con mucho gusto.
EliminarSaludos,
Este comentario ha sido eliminado por un administrador del blog.
ResponderEliminar