Ejercicio completo desde 0 (III)

Vamos a crear algunas funciones de la capa de datos. Recordemos que para hacer un mantenimiento necesitamos como mímino cinco funciones en nuestra lista de la compra.

Empecemos por las funciones de recuperar objetos. Crearemos los métodos siguientes:

Prestamos getPrestamo(int id) ->Nos devuelve el préstamo que tenga ese id

List getPrestamos() -> Nos devuelve todos los préstamos de la base de datos

Probamos estos métodos en nuestro Test para ver si funcionan.


package com.prestamos.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class PrestamosDAO {

	// En esta variable almacenamos la conexión a la base de datos
	private Connection con;

	public PrestamosDAO() {
		try {
			// Esta línea registra el driver
			Class.forName("com.mysql.cj.jdbc.Driver");
			// Aquí creamos la conexión con:
			// driver: jdbc:mysql
			// url del servidor: localhost
			// Puerto del servidor: 3306
			// Base de datos: prestamos
			// Usuario: root
			// Contraseña: ""
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/prestamos", "root", "");

		} catch (Exception ex) {
			System.out.println(ex);
		}
	}

	/**
	 * Paso al método el id del préstamo que quiero obtener Me devuelve un POJO que
	 * almacena los datos del registro de la base de datos
	 * 
	 * @param id del registro de la base de datos
	 * @return Prestamos (pojo con los datos)
	 */
	public Prestamos getPrestamo(int id) {
		try {

			// Ir a la base de datos, recuperar el registro que tenga el id
			// Meterlo dentro de un POJO y devolverlo

			// Me creo la sentencia sql que recupera un préstamo con un id
			// Y le pongo un parámetro que será el id. Se representa con un ?
			String sql = "select * from prestamos where idprestamos=?";

			// Una vez tengo el sql me creo la sentencia preparada
			PreparedStatement stmt = con.prepareStatement(sql);

			// Poniendo en el primer parámetro el valor que me están pasando del id
			stmt.setInt(1, id);

			// Recuperamos los resultados dentro de un ResultSet
			ResultSet rs = stmt.executeQuery();

			// El resultset NO COGE todos los registros del select y los tiene como en un
			// array
			// El resultset es como si fuera un puntero, una flecha que nos apunta al primer
			// Registro del select. Para recuperar hay que usar next
			if (rs.next()) {
				// Si hemos podido obtener un registro en rs tenemos todos los datos
				// del registro de la base de datos. ¿Cómo? con rs.get del tipo y nombre
				// de la columna. Ej. rs.getInt(1) o rs.getInt("idprestamos")

				// ¿Qué hago con estos datos? Empaquetarlos dentro de un POJO para poder
				// devolverlos
				Prestamos resultado = new Prestamos(rs.getInt("idprestamos"), rs.getString("nombre"),
						rs.getString("titulo"), rs.getDate("fecha"));

				return resultado;

			} else {
				return null;
			}

		} catch (Exception ex) {
			System.out.println(ex);
			return null;
		}
	}

	public List<Prestamos> getPrestamos() {
		try {

			String sql="select * from prestamos";
			
			PreparedStatement stmt=con.prepareStatement(sql);
			
			ResultSet rs=stmt.executeQuery();
			
			// Para almacenar todos los registros tengo que crear un arraylist
			List<Prestamos> resultado=new ArrayList<Prestamos>();
			
			// En esta ocasión no tengo un if porque son varios registros.
			// Tengo que hacer un bucle hasta que no haya registros o lo que es lo mismo
			// MIENTRAS tengamos registros vamos recorriendo
			while(rs.next()) {
				Prestamos elemento = new Prestamos(rs.getInt("idprestamos"), rs.getString("nombre"),
						rs.getString("titulo"), rs.getDate("fecha"));
				resultado.add(elemento);
			}
			return resultado;
			
		} catch (Exception ex) {
			System.out.println(ex);
			return null;
		}

	}
}

package com.prestamos.dao;

import java.sql.Date;
import java.util.List;

public class TestDAO {

	public static void main(String[] args) {
		
		//Creo un POJO con el constructor a ver si va bien
		Prestamos pepe=new Prestamos(1,"hola","adios",Date.valueOf("2021-01-01"));
		
		// Al imprimir el POJO compruebo que el método toString funciona
		System.out.println(pepe);
		
		// También puedo probar los getters
		System.out.println(pepe.getNombre());
		
		// Probamos el objeto DAO. No hace nada, pero si hay error saltará
		PrestamosDAO modelo=new PrestamosDAO();
		
		Prestamos ana = modelo.getPrestamo(1);
		System.out.println(ana);
		
		Prestamos foo=modelo.getPrestamo(100);
		System.out.println(foo);
		
		List<Prestamos> lista=modelo.getPrestamos();
		
		System.out.println(lista);

	}

}