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);
}
}
}