Solucionado (ver solución)
Solucionado
(ver solución)
3
respuestas

Conexión del DAO - Cierre

Dentro de la clase ProductoDAO, tengo el atributo "final Connection con;", que el "final" esta para cuando hacemos los "try(con)/catch" se cierre la conexión. (eso es lo que entendí) Pero si por ejemplo, hago un "ProductoDAO.guardar()" y después "ProductoDAO.listar()", cuando guardo no cerró la conexión? No logro entender el cierre de la conexión. Si llamo a guardar(), que adentro tiene el try(con) no se cierra la conexión?

public class ProductoDAO {

    final private Connection con;

    public ProductoDAO(Connection con) {
        this.con = con;
    }

    public void guardar(Producto producto) {
        try (con) {

            final PreparedStatement statement = con.prepareStatement(
                    "INSERT INTO PRODUCTO (nombre, descripcion, cantidad) " + " VALUES(?, ?, ?)",
                    Statement.RETURN_GENERATED_KEYS);

            try (statement) {
                ejecutaResgistro(statement, producto);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }

    private void ejecutaResgistro(PreparedStatement statement, Producto producto) throws SQLException {
        statement.setString(1, producto.getNombre());
        statement.setString(2, producto.getDescripcion());
        statement.setInt(3, producto.getCantidad());

        statement.execute();

        final ResultSet resultSet = statement.getGeneratedKeys();
        try (resultSet) {

            while (resultSet.next()) {
                producto.setId(resultSet.getInt(1));
                System.out.println(String.format("Fue insertado el producto de ID %s", producto));
            }
        }

    }

    public List<Producto> listar() {

        List<Producto> resultado = new ArrayList<>();
        final Connection con = new ConnectionFactory().recuperaConexion();

        try (con) {
            PreparedStatement statement = con
                    .prepareStatement("SELECT ID, NOMBRE, DESCRIPCION, CANTIDAD FROM PRODUCTO");



            try (statement) {
                statement.execute();

                final ResultSet resulSet = statement.getResultSet();

                while (resulSet.next()) {
                    Producto fila = new Producto(resulSet.getInt("ID"),
                            resulSet.getString("NOMBRE"),
                            resulSet.getString("DESCRIPCION"),
                            resulSet.getInt("CANTIDAD"));

                    resultado.add(fila);

                }
                return resultado;
            }

        }catch(SQLException e) {
            throw new RuntimeException(e);
        }

    }

}
3 respuestas
solución!

Hola Julian, espero que estés bien! Si, acabara por la cierrar la conexión. ¡Para cualquier duda, estoy disponible! ¡Vamos juntos! ¡No desanimes! :)

Si este post te ayudó, por favor, marca como solucionado ✓.

Ok, entonces cual es el funcionamiento del DAO? porque acá, cuando realizo guardar() se cierra la conexion y no puedo utilizarlo mas esta instancia del productoDAO que cree.

Ok, ahi chequee en el siguiente video, y el instructor habia sacado el (con) del try, para que no cierre la conexión y poder reutilizar esa conexion abierta.