Saltar a contenido

Operaciones CRUD sobre la BD

Preparando las operaciones

En JDBC (Java Database Connectivity), las operaciones sobre la base de datos se realizan utilizando los siguientes objetos y métodos:

  • Connection, establece el canal de comunicación con el SGBD (PostgreSQL, MySQL, etc.)
  • Los objetos PreparedStatement y CreateStatement se utlizan para enviar consultas SQL desde el programa a la base de datos. A continuación se muestra una tabla con el uso de cada uno:
Si necesitas... Usa...
Consultas sin parámetros CreateStatement
Consultas con datos del usuario PreparedStatement
Seguridad frente a inyecciones SQL PreparedStatement
Ejecutar muchas veces con distintos valores PreparedStatement
Crear tablas o sentencias SQL complejas que no cambian CreateStatement
  • Los métodos executeQuery(), executeUpdate() y execute() se utilizan para ejecutar sentencias SQL, pero se usan en contextos diferentes. A continuación se muestra una tabla con el uso de cada uno:
Método Uso principal Tipo de sentencia SQL Resultado que devuelve
executeQuery() Realizar consultas SELECT Objeto ResultSet con el resultado de la consulta SQL. Permite recorrer fila a fila el conjunto de resultados, accediendo a cada campo por nombre o por posición
executeUpdate() Realizar modificaciones INSERT, UPDATE, DELETE, DDL (CREATE, DROP, etc.) Entero con el número de filas afectadas
execute() No se sabe de antemano qué tipo de sentencia SQL se va a ejecutar (consulta o modificación) Sentencias SQL que pueden devolver varios resultados Booleano true si el resultado es un ResultSet (SELECT) y false si el resultado es un entero (INSERT, UPDATE, DELETE,CREATE, ALTER)

Buenas Prácticas: PreparedStatement y Gestión de Recursos

  • Seguridad con PreparedStatement: Se debe utilizar siempre PreparedStatement para ejecutar consultas con datos variables. A diferencia de Statement, precompila la sentencia SQL y trata los parámetros como datos, no como código ejecutable, previniendo así ataques de Inyección SQL.
  • Gestión de Recursos con .use: Es imprescindible cerrar los recursos JDBC (Connection, Statement, ResultSet). La función de extensión .use de Kotlin es la forma recomendada, ya que asegura el cierre automático del recurso.

🔍 Ejecutar y Analizar

Ejecutar y Analizar: Gestión de Recursos con y sin .use

Compara las dos siguientes funciones. Ambas hacen lo mismo, pero la versión con .use es más concisa y segura.

// 1. Cierre automático con .use (Recomendado)
fun listarConUse() {
    ConexionBD.getConnection()?.use { conn ->
        conn.prepareStatement("SELECT * FROM plantas").use { stmt ->
            val rs = stmt.executeQuery()
            while (rs.next()) {
                println("- ${rs.getString("nombre_comun")}")
            }
        }
    }
}

// 2. Cierre manual con try-catch-finally
fun listarConFinally() {
    var conn: Connection? = null
    var stmt: java.sql.PreparedStatement? = null
    var rs: java.sql.ResultSet? = null
    try {
        conn = ConexionBD.getConnection()
        stmt = conn?.prepareStatement("SELECT * FROM plantas")
        rs = stmt?.executeQuery()
        while (rs?.next() == true) {
            println("- ${rs.getString("nombre_comun")}")
        }
    } catch (e: SQLException) {
        e.printStackTrace()
    } finally {
        rs?.close()
        stmt?.close()
        conn?.close()
    }
}