Bueno decir que me esperé a terminar el curso para ver si este tema era abordado en otro punto del mismo pero no fue así, igualmente ya revisé las respuestas a posts similares al mío por lo que ver otras respuestas tampoco aclaró mi situación, es por eso que realizo esta consulta. Decir que mi consulta va más enfocada hacia una cuestión de buenas prácticas y no a solucionar el error del código.
Aclarando lo anterior comienzo con mí duda, al momento de llegar al punto donde se crea la clase ProductoDAO y se comienzan a migrar los métodos de ProductoController para esta nueva clase se llega a un punto donde se migra el código "listar" y se deja como desafio crear los úlitimos dos métodos restantes, adjunto el código para el método listar. Adjunto el código migrado a la clase ProductoDAO por el profesor:
public List<Producto> listar() {
List<Producto> resultado = new ArrayList<>();
try (con) {
final PreparedStatement statement = con
.prepareStatement("SELECT ID, NOMBRE, DESCRIPCION, CANTIDAD FROM producto");
try (statement) {
boolean result = statement.execute();
System.out.println(result);
final ResultSet resultSet = statement.getResultSet();
try (resultSet) {
while (resultSet.next()) {
Producto fila = new Producto(resultSet.getInt("ID"),
resultSet.getString("NOMBRE"),
resultSet.getString("DESCRIPCION"),
resultSet.getInt("CANTIDAD"));
resultado.add(fila);
}
}
return resultado;
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
Hasta ese punto todo bien pues en el video solo se ve que el instructor abre la aplicación pero no la utiliza lo que genera todo el conflicto, al migrar el código tal como lo hace el profesor el método listar rompe la aplicación ya que cada que carga la base de datos cierra la conexión abierta en productoDAO y los demás métodos no se pueden utilizar mandando error en la consola "no se puede operar sobre una conexión cerrada", esto se debe a que como podemos ver el instructor utiliza el try-with-resouces en la conexión al comienzo del codigo lo que cerrará la conexión automaticamente.
Aquí comienza el problema, desde el inicio del curso así como dentro del curso anterior de base de datos se ha dicho que siempre que una conexión se abre es necesario cerrarla, ya que no hacerlo claramente es un error grave considerado una mala práctica, así que retomando esto la solución parece ser obvia: crear una nueva conexión en cada método lo cual se reafirma con la respuesta de la instructura Génesys Rondón en el siguiente post https://app.aluracursos.com/forum/topico-duda-cierre-de-conexion-para-otras-consultas-175209 .Sin embargo en posteriores videos y hasta el final del curso se ve al instructor ocupar el siguiente código:
public List<Producto> listar(Integer categoriaId) {
List<Producto> resultado = new ArrayList<>();
try {
final PreparedStatement statement = con
.prepareStatement("SELECT ID, NOMBRE, DESCRIPCION, CANTIDAD FROM producto "
+ "WHERE categoria_id = ?");
try (statement) {
statement.setInt(1, categoriaId);
statement.execute();
final ResultSet resultSet = statement.getResultSet();
try (resultSet) {
while (resultSet.next()) {
Producto fila = new Producto(resultSet.getInt("ID"),
resultSet.getString("NOMBRE"),
resultSet.getString("DESCRIPCION"),
resultSet.getInt("CANTIDAD"));
resultado.add(fila);
}
}
return resultado;
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
Como se puede ver en lugar de optar por abrir una conexión en cada método decide sin explicar el por qué quitar el try-with-resouces lo cual se repite en la soluciones brindadas dentro del desafio, claro que sí soluciona el problema pero a costa de dejar la conexión abierta, y en ningun video explica el por qué de esta desición ni tampoco se ve que delegue el dato importante de cerrar la conexión a otra instancia de la aplicación lo que genera mis dudas:
Qué es lo mejor: Tal cual como en el curso ¿Abrir la conexión y dejarla abierta? lo que claramente se nos ha indicado que no hagamos.
¿Abrir una conexión nueva en cada método? lo cual evidentemente hace que se repita una linea de código en cada método ¿Esto se consideraría una mala práctica por el DRY?
¿Cuál es el enfoque correcto y por qué?
También aprovecho para sugerir que estaría bien que aclararan esto dentro del mismo curso, si no se quiere grabar un video para esto se puede poner a modo de texto, es una duda recurrente por lo que más de uno lo agradecerá en el futuro, como digo la duda no es por solucionar el código, el problema radica más en los enfoques que se toman sin explicar ya que generan una incongruencia con lo que nos explican al inicio del curso sin darnos el motivo.
De antemano muchas gracias por su tiempo.