Después de conseguir establecer una conexión y de crear una tabla, ya está hecho lo más dificil, y lo que supongo que interesará ahora, es la posibilidad de leer registro desde una tabla.
Por motivos didácticos, ésta clase repite el proceso de conexión, aunque en producción, deberíamos centralizarlo…
Para poder trabajar con las tablas, a los objetos Connection y Statement utilizados anteriormente, le tenemos que añadir un objeto Resulset que contendrá el cursor que utilizaremos para recorrer la tabla.
Podemos crear una nueva clase dentro de nuestro paquete, fijándonos que esta clase contiene un método static main, por lo que podrá (y tendrá que) ser llamada desde la linea de comando.
La clase quedará así:
package acceso; import java.sql.*; public class LeerTablaBaseDatos { public static void main (String args[]) { Connection conexion=null; Statement sql=null; ResultSet rs=null; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); try { conexion=DriverManager.getConnection("jdbc:odbc:pruebaCurso"); System.out.println("Conexión establecida"); sql=conexion.createStatement(); rs=sql.executeQuery("SELECT * FROM Libros"); System.out.println("CONSULTA EJECUTADA"); boolean r=rs.next(); while (r) { System.out.println(rs.getString("idLibro") + " - " + rs.getString("Titulo") + " " + rs.getString("Autor") + " " + rs.getString("Precio")); r=rs.next(); } conexion.close(); System.out.println("CERRADA LA CONEXION"); } catch (SQLException e) { System.out.println ("ERROR AL EJECUTAR LA SENTENCIA SQL"); } } catch (ClassNotFoundException e) { System.out.println("Error del controlador "); } } }
En esta clase, aparece como novedad:
rs=sql.executeQuery(«SELECT * FROM Libros»);
Utilizamos otro método del objeto Statement, éste nos permite lanzar una orden sql y recoger el resultado en un objeto perteneciente a la clase ResultSet,(rs).
Para procesar todas las filas que haya sido seleccionadas por la query, nos debemos meter en un bucle, utilizando rs como el cursor.
Para saber cuando alcanzamos el final, controlamos que el método next() de Resultset, nos devuelva false, y mientras tanto, vamos recorriendo la tabla con el while.
Para acceder a la información de cada columna, debemos utilizar el método correspondiente de Resultset; aquí tenéis toda la documentación de este objeto
rs.getString(«idLibro»)
rs.getString(«Titulo»)
rs.getString(«Autor»)
….
En este caso, todas nuestras columnas son Strings…
Para pasar al siguiente registro, realizamos un rs.next() y recogemos su retorno, ya qué será como nos enteraremos que hemos llegado al final.
Devolviendo toda la tabla en Array
Hay ocasiones en que nos interesara convertir la tabla en un array multidimensional, y trabajar después con el Array, Cuando hagamos eso, deberemos evaluar el impacto que puede tener ésta idea en la memoria de nuestro ordenador victima, pero si se necesita…..
private Object[][] ResultSetToArray(ResultSet rs) { Object obj[][] = null; int j = 0; try { rs.last(); ResultSetMetaData rsmd = rs.getMetaData(); int numCols = rsmd.getColumnCount(); int numFils = rs.getRow(); obj = new Object[numFils][numCols]; rs.beforeFirst(); while (rs.next()) { for (int i = 0; i < numCols; i++) { obj[j][i] = rs.getObject(i + 1); } j++; } } catch (Exception e) { } return obj; }
Os invito a que estudies el método propuesto , observad, p.ejem: que definimos el Array como Object, ya que no conocemos que tipo de datos recibirá, y, por eso mismo, debemos utiliza el método getObject para recuperar la información; antes o después deberemos hacer los cast correspondientes para utilizar la información, pero mientras tanto, es una buena forma de guardarla.
4 comentarios
Me hubiera gustado ver una tabla relaciona o dos talvez (autores y categorías con la tabla libros) y ver de qué forma haces la relación manejando clases y beans