Show Menu
Cheatography

Acceso a bases de datos relacionales en Java. Cheat Sheet by

Cómo conectarse a una BD relacional soportada por jdbc

Drivers

En estos ejemplos se utiliza el SGBD h2 database engine, aunque se puede utilizar el mismo mecanismo para cualquier otro sgbd, siempre que se disponga del driver.

Interfaces y clases

Connection (Inter­face)
Representa a una conexión desde la app hasta una base de datos. La conexión se obtiene solici­tándola a la clase Driver­Manager
Prepar­edS­tat­ement (Inter­face)
Un objeto que acepta una sentencia SQL escrita en una cadena y la precompila para ser ejecutada de manera eficiente múltiples veces, cambiando sus paráme­tros. Permite tener placeh­olders (con la marca ?) para parame­trizar la ejecución de la sentencia. También es muy útil para librarse de la mayor parte de intentos de ataque por inyección de código SQL. Se obtiene solici­tándolo a una conexión.
Statement (Inter­face)
No recome­ndado por ser más suscep­tible a inyección de código que Prepar­edS­tat­ement. Es un objeto que permite la ejecución de una sentencia SQL.
ResultSet
Un objeto que representa a los datos devueltos por una sentencia SELECT o similar. En realidad, es un cursor a los result­ados. Sólo puede haber un ResultSet activo por cada Statement.
Driver­Manager
Gestiona los drivers jdbc cargados en la app. Permite obtener conexiones a una BD.
SQLExc­eption
Las excepc­iones lanzadas por los métodos de los objetos de jdbc.
Todas las interfaces y clases mencio­nadas están en el paquete java.sql.*

Cadenas de conexión en h2

jdbc:h­2:t­cp:­//n­omb­re_­maq­uin­a-o­-ip­/~/­nom­bre_bd
Conexión en modo servidor a una bd en la carpeta del usuario
jdbc:h­2:t­cp:­//n­omb­re_­maq­uin­a-o­-ip­/./­nom­bre_bd
Conexión en modo servidor a una bd en la carpeta del servidor
jdbc:h­2:t­cp:­//n­omb­re_­maq­uin­a-o­-ip­/d:­\pr­ogr­ama­cio­n\n­omb­re_bd
Conexión en modo servidor a una bd en una ruta absoluta en la máquina del servidor
jdbc:h­2:/­~/n­omb­re_bd
Conexión en modo embebido a una bd en la carpeta del usuario
jdbc:h­2:/./n­omb­re_bd
Conexión en modo embebido a una bd en la carpeta del proyecto
jdbc:h­2:d­:\p­rog­ram­aci­on­\nom­bre_bd
Conexión en modo embebido a una bd en una ruta absoluta
Cada SGBD tiene sus drivers. La sintaxis de las cadenas de conexión es depend­iente del driver. Es decir, las cadenas de conexión a una BD en Oracle no tienen la misma estructura que en h2

Secuencia simple para enviar una select

/ EJEMPLO de conexión y envío de una sentencia SELECT/

        // Paso 0: Cargar el driver. Sólo hay que hacerlo una vez
        // Ojo: puede lanzar ClassNotFoundException
        Class.forName("org.h2.Driver");
        
        // Declaramos referencias a las interfaces que usaremos.
        Connection conn = null; // Representa a la conexión
        PreparedStatement stmt = null; // Representa a la sentencia
        ResultSet rs = null; // Solo para Select
        try {
            // PASO 1: Obtener conexion
            conn = DriverManager.getConnection(
                    "jdbc:h2:tcp://localhost/~/test", // Cadena de conexión
                     "sa", "" // Usuario y contraseña
            );
            
            // Paso 2: Preparamos la sentencia. Podemos poner placeholders 
            //     para ejecutar la sentencia parametrizada.
            // Supongamos que queremos que la ciudad contenga una determinada
            //     cadena y la nota sea superior a un cierto número
            
            String buscaCiudad = "la"; // Ej: Que la ciudad contenga 'la'
            double notaMinima = 6.0; // y la nota sea mayor o igual a 6
            
            String sql = "SELECT nombre, apellido, nota"
                    + " from alumno where ciudad like ? and nota >= ?";
            stmt = conn.prepareStatement(sql);
            
            // Paso 2a: Sustituir los placeholders por valores
            stmt.setString(1, "%" + buscaCiudad + "%");
            stmt.setDouble(2, notaMinima);

            // Paso 3: Ejecución  de la query y obtención de los datos
            rs = stmt.executeQuery();
            
            // Paso 4 (Solo para select). Recorrer Los datos obtenidos.
            while (rs.next()) {
                String nombre = rs.getString("nombre"); // Se puede obtener el dato de
                String ape = rs.getString("apellido"); // una fila por nombre de columna
                Double nota = rs.getDouble(3); // o por posición
                System.out.format(Locale.ROOT, "%-15s %-15s %.2f", 
                        nombre, ape, nota);
            }
        } catch (SQLException ex) {
            // Tomar las acciones necesarias para que el caso de uso continúe
            ex.printStackTrace();
        } finally {
            try {rs.close();} catch (Exception ex) {};
            try {stmt.close();} catch (Exception ex) {};
            try {conn.close();} catch (Exception ex) {};
        }

Otro ejemplo: Un insert

        / EJEMPLO de conexión y envío de una sentencia INSERT /

        // Paso 0: Cargar el driver. Sólo hay que hacerlo una vez
        // Ojo: puede lanzar ClassNotFoundException
        Class.forName("org.h2.Driver");

       
        
        // Declaramos referencias a las interfaces que usaremos.
        Connection conn = null; // Representa a la conexión
        PreparedStatement stmt = null; // Representa a la sentencia
        try {
            // PASO 1: Obtener conexion
            conn = DriverManager.getConnection(
                    "jdbc:h2:tcp://localhost/~/test", // Cadena de conexión
                     "sa", "" // Usuario y contraseña
            );
            
            // Paso 2: Preparamos la sentencia. Ponemos placeholders para
            //   los valores.
 
            
            String nombre = "Pepe"; 
            String apellido = "Pérez";
            double nota = 8.0;
            
            String sql = "INSERT INTO alumno(nombre, apellido, nota)"
                    + " VALUES(?, ?, ?)";
            stmt = conn.prepareStatement(sql);
            
            // Paso 2a: Sustituir los placeholders por valores
            stmt.setString(1, nombre);
            stmt.setString(2, apellido);
            stmt.setDouble(3, nota);

            // Paso 3: Ejecución de la sentencia.
            int filas = stmt.executeUpdate();
            // devuelve el numero de filas afectadas

        } catch (SQLException ex) {
            // Tomar las acciones necesarias para que el caso de uso continúe
            ex.printStackTrace();
        } finally {
            try {stmt.close();} catch (Exception ex) {};
            try {conn.close();} catch (Exception ex) {};
        }
    }

Consid­era­ciones

La conexión puede dejarse abierta y lanzar varias sentencias en la misma conexión.
La sentencia preparada puede reutil­izarse, cambiando el valor de los placeh­olders con los setters y reejec­utá­ndola.
Una sentencia sólo puede tener un resultset abierto. Es decir, si una sentencia se reejecuta, cualquier resultset previa­mente abierto y asociado a ella queda en un estado no definido.
Al cerrar una sentencia se cierran los resultsets asociados, pero se recomienda cerrar los resultsets explíc­ita­mente con close() siempre que se pueda para liberar los recursos de la manera lo más eficiente posible.
Igualm­ente, al cerrar una conexión se cierran las sentencias asociadas, pero se recomienda cerrarlas explíc­ita­mente.
La apertura y cierre de la conexión suele ser una operación costosa. En algunos contextos no se recomienda abrir y cerrar las conexiones en cada operación.
Para optimizar el uso de conexiones perman­ent­emente abiertas, por ejemplo en el contexto de las aplica­ciones web, se suelen utilizar pools de conexiones

SGBD-R

h2
Un sgbd pequeño, ligero y muy fiable y portable comple­tamente construido en Java.
Apache Derby
Otro sgbd-r de la fundación apache. Escrito en Java.
Oracle
Grande entre los grandes
MySQL
Popular durante mucho tiempo por ser bastante eficiente y económica. Muy utilizada en la web. Hoy es un producto de Oracle. Va cayendo en decadencia en favor de MariaDB
MariaBD
SGBD de funcio­nam­iento similar a MySQL
SQL Server
De Microsoft. Otro grande entre los grandes. Se integra facilmente con los productos de desarrollo de Microsoft (Visual Studio IDE, C#, Visual Basic.NET, etc)
Access
De Microsoft. Prácti­camente el único SGBD orientado a la ofimática con éxito comercial.
IBM DB2
La solución SGBD-R de IBM
PostgreSQL
Solución de código abierto. Muy popular en la web. Tiene fama de avanzado y fiable.
SQLite
El más popular de los peques. Pensado para ser embebido. Está escrito en C, por lo que va compilado a código nativo.
                       
 

Comments

No comments yet. Add yours below!

Add a Comment

Your Comment

Please enter your name.

    Please enter your email address

      Please enter your Comment.

          Related Cheat Sheets

          Selenium WebDriver Cheat Sheet Cheat Sheet
          Cypressio Cheat Sheet
          ISTQB Test Automation Engineering Cheat Sheet

          More Cheat Sheets by victorjfg