Cuando utilizamos el try-with-resources en Java, los recursos que se declaran dentro del bloque de código del try automáticamente implementan la interfaz AutoCloseable. La interfaz AutoCloseable define un único método llamado close(), que se utiliza para cerrar el recurso cuando ya no es necesario.
Al utilizar el try-with-resources, el compilador se encarga de generar el código necesario para cerrar los recursos de manera automática al finalizar el bloque try, incluso si ocurre una excepción. Esto se logra llamando al método close() de los recursos declarados.
En el caso de los objetos PreparedStatement, Connection y ResultSet, todos ellos implementan la interfaz AutoCloseable, por lo que al utilizar el try-with-resources, no es necesario explicitar el comando close() para cerrarlos. El cierre se realizará automáticamente al finalizar el bloque try.