9.d.1 - Recuperación y mostrado de Información

Objetivo

Crear programas para recuperar y mostrar información almacenada en bases de datos.

1. Contenidos

1.1 El concepto de ResultSet

Cuando ejecutamos una consulta de selección (SELECT), la base de datos nos devuelve un conjunto de filas que cumplen nuestros criterios. En JDBC, este conjunto de resultados se gestiona mediante la interfaz ResultSet.

Podemos imaginar el ResultSet como una tabla virtual con un cursor. Al principio, el cursor apunta justo antes de la primera fila. Cada vez que llamamos al método .next(), el cursor avanza a la siguiente fila. Si existe una fila, devuelve true; si no hay más filas, devuelve false.

IMPORTANTE: Al igual que la conexión y la sentencia, el ResultSet consume recursos del sistema. Es fundamental cerrarlo tras su uso, preferiblemente utilizando un try-con-recursos.

1.2 Ejemplo de Consulta

Vamos a leer todos los autores que tenemos en nuestra base de datos autores.sqlite.

Escribe el código


		import java.sql.Connection;
		import java.sql.DriverManager;
		import java.sql.PreparedStatement;
		import java.sql.ResultSet;
		import java.sql.SQLException;

		public class ListarAutores {

			public static void main(String[] args) {
				String url = "jdbc:sqlite:autores.sqlite";
				String sql = "SELECT id, nombre, nacionalidad FROM Autor";

				try (Connection con = DriverManager.getConnection(url);
					 PreparedStatement ps = con.prepareStatement(sql);
					 ResultSet rs = ps.executeQuery()) {

					System.out.println("ID | NOMBRE | NACIONALIDAD");
					System.out.println("---------------------------------");

					// Recorremos el ResultSet fila a fila
					while (rs.next()) {
						int id = rs.getInt(id);
						String nombre = rs.getString(nombre);
						String nac = rs.getString(nacionalidad);

						System.out.printf("%d | %s | %s%n", id, nombre, nac);
					}

				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}				

1.3 Obtención de datos por columna

Para extraer los datos de la fila actual, ResultSet proporciona métodos getter específicos para cada tipo de dato:

  • getInt(columna): para números enteros.
  • getString(columna): para texto.
  • getDouble(columna): para números reales.
  • getBoolean(columna): para valores lógicos.

El parámetro columna puede ser el nombre de la columna (recomendado por claridad) o su índice numérico (empezando en 1).

2. Ejercicios

2.1 El buscador de Autores

Crea un programa llamado BuscarAutor.java que pida al usuario una nacionalidad por teclado.

El programa debe mostrar todos los autores de esa nacionalidad. Utiliza una sentencia preparada (PreparedStatement) para pasar el parámetro de búsqueda de forma segura.

2.2 Lectura del Popurrí

Recupera la base de datos tipos_datos.sqlite que creaste en el ejercicio anterior. Escribe un programa que lea la tabla Popurri y muestre cada valor indicando el tipo de dato que estás recuperando (por ejemplo: Valor entero leído: 42).

Reto: Relación 1:N

Utilizando la tabla Obra y Autor de la unidad 9.b.1, realiza una consulta con un JOIN que muestre el título de la obra y el nombre de su autor al lado. ¿Eres capaz de mostrar solo las obras publicadas después del año 1900?

Bibliografía