Crear una conexión JDBC

Para acompañar al viejo post sobre PL-SQL Oracle desde Java (en algunos comentarios y mensajes) voy a explicar a continuación como establecer una conexión contra la base de datos sin usar un pool de conexiones.

1 Lo primero que necesitaremos son los drivers JDBC en formato jar, incluir este archivo jar en el CLASSPATH de nuestro proyecto y cargarlos en memoria:

Oracle: JDBC Download page Oracle

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();

MySql: MySQL Connector J

Class.forName("com.mysql.jdbc.Driver").newInstance();

2 Para crear la conexión, necesitamos una url JDBC, la cual contiene toda la información necesaria para conectarse:

Oracle: necesitaremos saber el host (el nombre de la máquina o su IP), el puerto de escucha del listener de Oracle (1521 por ejemplo), el servicio o sid, el usuario y la clave. Diferentes formatos de la url JDBC pueden ser:

jdbc:oracle:thin:@host:puerto:sid
jdbc:oracle:thin:usuario/clave@host:puerto:sid
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=puerto)))(CONNECT_DATA=(SERVICE_NAME=servicio)(SERVER=SHARED)))
jdbc:oracle:thin:usuario/clave@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=puerto)))(CONNECT_DATA=(SERVICE_NAME=servicio)(SERVER=SHARED)))

Más información en FAQ JDBC Oracle: Connections

MySql: host (nombre de la máquina o su IP), puerto de escucha (3306 por defecto), nombre de la base de datos, usuario y clave. El formato de la url es:

jdbc:mysql://host:puerto/database
jdbc:mysql://host:puerto/database?user=usuario&password=clave

(Más información en MySql JDBC Reference)

Una vez tengamos la url JDBC, podemos crear la conexión contra la base de datos:

Connection connection = DriverManager.getConnection(ulr, usuario, clave);

Si la url ya contiene el usuario y la clave (hay formatos que ya la llevan):

Connection connection = DriverManager.getConnection(ulr);

Con el objeto connection ya podemos trabajar, sin olvidarnos de que una vez hemos acabado, hay que cerrar la conexión. Esto es muy importante hacerlo, ya que si se queda abierta, estamos desaprovechando recursos, creando lo que se llama connection leaks (conexiones perdidas) con la base de datos.
La mejor forma de hacerlo es englobar todo el código en una estructura try/catch/finally y efectuando el cierre de la conexión en el finally. De esta manera nos aseguramos de que falle o no falle el código, se cerrará la conexión.

Connection connection;
try {
    // ...
    connection = DriverManager.getConnection(ulr);	
    // ...
} finally {
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException e) {
			      e.printStackTrace();
        }
    }
}	

Veamos ahora un par de ejemplos completo. Para Oracle definimos una url que incluye el usuario y la clave, por lo que no necesitaremos pasarle esta información en el método getConnection():

import java.sql.*;

public class OracleConnection {
    public static void main(String args[]) {

        String usuario = "vil";
        String password = "secreta";

        String host = "localhost"; // tambien puede ser una ip como "192.168.1.14"
        String puerto = "1521";
        String sid = "prueba";

        String driver = "oracle.jdbc.driver.OracleDriver";

        String ulrjdbc = "jdbc:oracle:thin:" + usuario + "/" + password + "@" + host + ":" + puerto + ":" + sid;

        Connection connection = null;
        try {
            Class.forName(driver).newInstance();
            connection = DriverManager.getConnection(ulrjdbc);

            // Ya tenemos el objeto connection creado

            ResultSet result = connection.createStatement().executeQuery("SELECT 'hola mundo' FROM DUAL");
            result.next();
            System.out.println(result.getString(1));

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                }
            }
        }
    }
}

Y para MySQL (usaremos una url sin usuario y clave, por lo que pasaremos esta información al método getConnection):

import java.sql.*;

public class MySQLConnection {
    public static void main(String args[]) {

        String usuario = "vil";
        String password = "secreta";

        String host = "localhost"; // tambien puede ser una ip como "192.168.1.14"
        String puerto = "3306";
        String database = "prueba";

        String driver = "com.mysql.jdbc.Driver";

        String ulrjdbc = "jdbc:mysql://" + host + ":" + puerto + "/" + database;

        Connection connection = null;
        try {
            Class.forName(driver).newInstance();
            connection = DriverManager.getConnection(ulrjdbc, usuario, password);

            // Ya tenemos el objeto connection creado

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                }
            }
        }
    }
}

Resumen para crear una conexión con cualquier base de datos:

  • Insertar en el CLASSPATH el jar con los drivers de nuestra base de datos (drivers Oracle, drivers MySQL o buscar en Google “drivers jdbc basededatos”)
  • Cargar los drivers con Class.forName(sdriver).newInstance();, siendo sdriver un String con la clase del driver.
  • Crear la conexión con DriverManager.getConnection(ulrjdbc, usuario, password);, siend urljdbc una url con el formato que define la propia base de datos (Oracle: jdbc:oracle:thin:@host:puerto:sid, MySQL: jdbc:mysql://host:puerto/database o buscar en Google “jdbc url basededatos”)
  • Cerrar siempre la conexión dentro del finally