Conectarse en JDBC

El primer paso para interactuar con una base de datos en JDBC es conectarse con una base de datos. En esta lección te explico cómo utilizar el método getConnection() para obtener una instancia de tipo Connection.

Una vez que tengas el driver de tu base de datos a tu proyecto Java, puedes crear una conexión para empezar a hablar con ella. Para ello usaremos el método getConnection() de la clase java.sql.DriverManager. Existen otras formas más sofisticadas de conectarse con una base de datos, pero esta es la más directa para que puedas empezar a programar.

Este método tiene varias formas de invocarlo:

  • public static Connection getConnection(String url) throws SQLException
  • public static Connection getConnection(String url, String user, String password) throws SQLException
  • public static Connection getConnection(String url, Properties info) throws SQLException

En todas sus formas, devuelve un objeto Connection si sale bien, o lanzará un java.sql.SQLException si sale mal la conexión. Mi consejo es que te familiarices con el uso de try-with-resources, porque este es un ejemplo de API donde se va a usar bastante.

Parámetro url

Este siempre hay que darlo y define la ruta de conexión a la base de datos. En JDBC, va a ser un poco especial este parámetro. Me explico: igual que la URL de una página web tiene que empezar por http:// y https:// para que sepas que es una página web, las URLs de JDBC deben empezar con el protocolo de base de datos, para que se sepa qué tipo de base de datos es la que se va a usar. Java, de hecho, usará ese prefijo para saber qué driver emplear. Cada driver reconocerá un tipo de protocolos, así que deberás consultar el manual de tu driver para saber el formato exacto con el que debes especificarlo, porque además cada base de datos puede usar una manera de escribirlo distinta.

Por ejemplo, si usase PostgreSQL, la conexión se establecería con un string que tiene alguno de los siguientes aspectos:

jdbc:postgresql://<host>
jdbc:postgresql://<host>:<port>
jdbc:postgresql://<host>/<database>
jdbc:postgresql://<host>:<port>/<database>

Donde host es el hostname de la base de datos: localhost si corre en tu ordenador, o la IP si estás usando una conexión remota (un container de Docker o un servidor de bases de datos ubicado en otra parte, como la URL que te entrega Amazon RDS o Azure Database). El port es el puerto de conexión, aunque puedes no ponerlo si va a ser el puerto por defecto de PostgreSQL, que es el 5432. Además, si queremos conectarnos ya con una base de datos concreta, pondremos también el nombre de la base de datos como <database>.

Si quisieses conectarte con la base de datos veterinario_prod, podrías hacerlo del siguiente modo:

// En este caso, la base de datos corre en tu ordenador.
var conn = DriverManager.getConnection("jdbc:postgresql://localhost/veterinario_prod")

// En este otro caso, corre en otra parte de tu red.
var conn2 = DriverManager.getConnection("jdbc:postgresql://192.168.1.140/veterinario_prod")

// O bien puede que sea una base de datos cloud.
var conn3 = DriverManager.getConnection("jdbc:postgresql://yoquese.rds.amazonaws.com/veterinario_prod")

Si usas MySQL, según su manual el funcionamiento es igual:

jdbc:mysql://<host>/<database>
jdbc:mysql://<host>:<port>/<database>

En este caso, el puerto por defecto de MySQL es el 3306, así que si te vas a conectar con ese, no hace falta que pongas ni el <port>, ni los dos puntos que van entre host y port. En este caso la conexión a una base de datos de MySQL llamada escuela_prod se haría de este modo:

// En este caso, la base de datos corre en tu ordenador.
var conn = DriverManager.getConnection("jdbc:mysql://localhost/escuela_prod")

// En este otro caso, corre en otra parte de tu red.
var conn2 = DriverManager.getConnection("jdbc:mysql://192.168.1.145/escuela_prod")

// O bien puede que sea una base de datos cloud.
var conn3 = DriverManager.getConnection("jdbc:mysql://yoquese.rds.amazonaws.com/escuela_prod")

Con Microsoft SQL Server, exactamente igual, pero usando jdbc:sqlserver. El resto ya lo puedes imaginar.

Usuario y contraseña

La mayoría de bases de datos te van a pedir que especifiques también el usuario y la contraseña. De modo que para un buen porcentaje de bases de datos a los que te trates de conectar, vas a tener que incorporar parámetros adicionales para declarar ese usuario y contraseña, e incluso puede que más parámetros.

La segunda forma de llamar a getConnection() es especificando como segundo y tercer argumento en la llamada, respectivamente el usuario y la contraseña:

String url = "jdbc:postgresql://localhost/veterinaria";
var conn = DriverManager.getConnection(url, "clinica_vet", "guau_guau");

Como alternativa, también puedes pasarle como parámetro un objeto Properties. No todas las bases de datos tienen por qué ser compatibles con este sistema, pero con un objeto Properties, que es casi como un HashMap especializado, puedes pasarle un mapa clave-valor con más formas de conectarte con una base de datos, e incluso de ajustar otros parámetros. Si quieres saber más sobre Properties, tengo una lección que lo cuenta.

Por ejemplo, PostgreSQL sí es compatible, y tienes en su manual documentadas todas las keys adicionales que le puedes pasar. El connector MySQL Connector/J también tiene soporte para properties.

Una desventaja de este sistema es que no está estandarizado el soporte, así que siempre tendrás que consultar qué puede hacer tu base de datos, y cómo se llaman las keys. Por ejemplo, para activar una conexión SSL en PostgreSQL la key que buscas es ssl, mientras que para hacer lo mismo en MySQL, la key que buscas es sslMode.

En este caso, voy a hacer la misma conexión a la base de datos pero usando properties:

String url = "jdbc:postgresql://localhost/veterinaria";
Properties props = new Properties();
props.setProperty("user", "clinica_vet");
props.setProperty("password", "guau_guau");
var conn = DriverManager.getConnection(url, props);

Recuerda cerrar la conexión a la base de datos

Conectarte a una base de datos supone mantener una conexión abierta que tiene que ser gestionada tanto por tu ordenador, como por el propio servidor de bases de datos. En aplicaciones reales, probablemente acabes manteniendo varias conexiones abiertas todo el tiempo.

De todos modos, si en algún momento dejas de necesitar la conexión con esa base de datos, recuerda llamar al método close() de Connection. Este método es el que se ocupa de cerrar la conexión y liberar cualquier recurso que se esté usando.

Entre esto, y que en JDBC, todo puede arrojar un SQLException como error si se ha producido un fallo durante su uso, salvo que vivas bajo una piedra, puedes usar un try-with-resources para declarar un scope dentro del cual estará disponible tu objeto Connection. Cuando ese scope termine, también se cerrará automáticamente la conexión con la base de datos.

String url = "jdbc:postgresql://localhost/escuela";
try (Connection conn = DriverManager.getConnection(url)) {
  // Usar la conexión para hacer cosas.
} catch (SQLException e) {
  // Por favor, haz algo de verdad aquí.
  e.printStackTrace();
}
Lista de reproducción
  1. 1
    ¿Qué es JDBC?
    5 minutos
  2. 2
    Configurar un driver
    7 minutos
  3. 3
    Deja de poner Class.forName
    8 minutos
  4. 4
    Conectarse en JDBC
    10 minutos
  5. 5
    Cómo ejecutar consultas
    10 minutos
  6. 6
    PreparedStatement, ¿por qué usarlo?
    11 minutos
  7. 7
    Cómo insertar, modificar y borrar datos
    10 minutos
  8. 8
    Transacciones
    12 minutos
  9. 9
    Cursores avanzados
    11 minutos
  10. 10
    ResultSets concurrentes
    10 minutos
  11. 11
    DataSource: así se usa JDBC en la vida real
    14 minutos
  12. 12
    ¿Se sigue usando JDBC?
    10 minutos