Java para programadores (10.5) – Ejecución de consultas y Resultsets

Una vez hecha la conexión, podemos empezar a lanzar órdenes sobre la base de datos; para hacerlo necesitamos un:

  • Statement – Nos permite lanzar consultas a la base de datos.
  • PreparedStatement – Nos permite guardar consultas con parámetros variables, que podremos modificar antes de ejecutarlas.

Cuando terminemos de utilizar uno de estos objetos, deberemos utilizar su método close() para liberar los recursos que haya podido reservar.

Trabajando con Statemen

Esta clase tiene tres métodos

  • executeQuery – Ejecuta la orden SQL dada y devuelve un objeto ResultSet con el conjunto de filas y columnas seleccionadas. Solo utilizaremos este método para las ordenes SELECT
  • executeUpdate – Ejecuta la orden SQL dada pero solo devuelve un int con el número de filas afectadas. Utilizaremos este método para cualquier orden, menos la SELECT
  • execute – Devuelve True si se ha conseguido un Resultset, si no, devuelve False. Deberemos utilizar este método cuando no conozcamos el contenido del SQL por lo que no podamos tomar la decisión de utilizar executeQuery o executeUpdate.

Si queremos realizar un Insert, podemos hacer:

Y nos devolverá en result el número de filas afectadas, 1 en este caso

Si queremos realizar un SELECT para obtener la lista de todas las provincias, haremos

Trabajando con PreparedStatemen

Esta clase tiene mucha semejanza con Statement, por lo que tiene sus mismos tres métodos para ejecutar querys (executeQuery, executeUpdate, y execute.

La diferencia reside en que podemos dejar preparada la query, pero dejando variables por resolver, que las cumplimentaremos con los valores que nos interés.

Por ejemplo, si necesitamos seleccionar una provincia en concreto, podríamos hacer:

Pero esto solo nos permitiría seleccionar la provincia 1. Con PreparedStatement  podemos hacer:

Y cuando lo necesitáramos, haríamos

Incorporando los parámetros que habíamos dejado con un ‘?’

Para ello disponemos de los métodos necesarios para los tipos de java (setInt, setFloat, setDouble, setString,…..) , que reciben dos parámetros el primero es un int que indica la posición que se va a sustituir, y el segundo es el valor a sustituir. En nuestro ejemplo, hemos sustituido el primer (1) interrogante, por el valor2

Manipulación de resultados con ResultSet

El objeto Resultset representa en nuestro programa, el resultado de un SELECT, por lo que tiene acceso a todas las filas y columnas seleccionadas

Realmente, este objeto, en un momento determinado, solo tiene acceso a todas las columnas de UNA fila de nuestra consulta, por lo que deberemos ir haciendo avanzar el ResutSet, para poder acceder a toda la información.

Cuando hemos terminado de crearlo con un SELECT, Resultset está apuntando a una fila inexistente, por lo que para poder leer la primera fila, deberemos avanzar una, y eso lo haremos con next(). Un objeto ResultSet, por defecto, solo se puede mover hacia adelante.

Después de cada orden, deberemos comprobar si se ha llegado al final de la selección, controlando que no de false. Luego, ya podemos leer su información, utilizando el método adecuado. Aquí tenemos un ejemplo de cómo podríamos leer nuestra tabla de Provincias y volcar la información en la consola.

Este objeto también dispone de métodos para recoger cualquier tipo java (getInt, getDouble, getString), y en cada caso, deberemos indicar el nombre de la columna que deseamos obtener.

Cuando el Resultset es “scrollable” (que se puede desplazar atrás y adelante), disponemos de métodos para hacer avanzar el puntero de resultset al primer registro, al ultimo, avanzar de uno en uno, adelante y atras… Naturalmente, esto hace mas lenta la operación, por lo que solo escogeremos esta posibilidad, cuando lo necesitemos.

Para que un resultset  sea  scrollable, deberemos usar un Statement creado para esa funcionalidad con

Y si es con PreparedStatement, deberemos hacer (en el ejemplo anterior)

Este tiene la posibilidad de poder cambiar su posición con

previous() Vuelve a la posición que estaba antes del ultimo next()
first() Va a la primera posición del actual conjunto
beforeFist() Deja el cursor en el mismo punto que estaba tras realizar el SELECT, esto es, apuntando a un punto justamente anterior al primer registro.
last() Se posiciona en el último registro de este conjunto
absolute(int fila) Se posiciona en el registro indicado por “fila” contando desde el principio del conjunto
relative(int fila) Se mueve tantas filas como indique “fila”, que puede ser positivo o negativo.
getRow() Devuelve el número de fila (registro) actual

 

Tambien podemos preguntar por la posición del cursor con

isFirst() Indica si el cursor está en la primera fila de resultados
isLast() Indica si el cursor está en la ultima fila de resultados
isBeforeFirst Indica se está antes de la primera fila , deberemos realizar un next() antes de poder leer las columnas
isAfterLast() Indica si ya se ejecutó el ultimo next(), ya no podemos acceder a información.

 

Hay más información del objeto ResultSet en https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html

 

Acerca de Miguel Garcia

Programador, Desarrollador web, Formador en distintas areas de informatica y director de equipos multidisciplinares.
Esta entrada fue publicada en Formacion, Java, SQL y etiquetada , . Guarda el enlace permanente.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.