Acceso a bases de datos relacionales en Java. Cheat Sheet

Cómo conectarse a una BD relacional soportada por jdbc

21,885 views 2,944 downloads 5 Jun 2017 History
3.7 avg · 0 ratings

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.

Badges

Nice Cheat Sheet Good Cheat Sheet Downloaded from Unusual Locations × 1

Comments

No comments yet.

Cheatography n. The art of mapping complex subjects into clear, instantly navigable reference guides.