Arquitectura JDBC

Tipos de drivers y el DriverManager

Capas de JDBC

JDBC es una API de Java para acceder a bases de datos relacionales. Está definida como interfaces en el paquete java.sql. Los fabricantes de bases de datos proporcionan implementaciones concretas (los drivers). La aplicación solo usa las interfaces — cambiando el driver se puede cambiar de base de datos sin modificar el código de acceso a datos.

// Capas de la arquitectura JDBC:
//
// Aplicación Java
//     ↓  usa interfaces de java.sql (Connection, Statement, ResultSet...)
// JDBC API (java.sql.*)
//     ↓  delega a la implementación concreta
// Driver JDBC (JAR del fabricante)
//     ↓  protocolo propietario de la BBDD
// Base de datos (MySQL, PostgreSQL, Oracle, H2...)
//
// El driver implementa las interfaces de java.sql para una BBDD concreta.
// La aplicación solo ve las interfaces — puede cambiar de BBDD cambiando el driver.

Tipos de drivers

// Tipos de drivers JDBC (clasificación histórica):
//
// Tipo 1 (JDBC-ODBC bridge): obsoleto, requería ODBC del SO
// Tipo 2 (Native API): parte en código nativo del SO
// Tipo 3 (Network protocol): proxy de red
// Tipo 4 (Pure Java): todo en Java, comunica directamente con la BBDD — el estándar hoy
//
// En la práctica siempre se usa un driver Tipo 4:
// MySQL:      com.mysql.cj.jdbc.Driver     (jar: mysql-connector-java)
// PostgreSQL: org.postgresql.Driver        (jar: postgresql)
// H2:         org.h2.Driver                (jar: h2 — base de datos en memoria para tests)
// Oracle:     oracle.jdbc.OracleDriver     (jar: ojdbc)
// SQL Server: com.microsoft.sqlserver.jdbc.SQLServerDriver

DriverManager

DriverManager.getConnection() es la forma más simple de obtener una conexión. En producción se usa un pool de conexiones (HikariCP, c3p0, DBCP) en lugar de DriverManager directo — crear una conexión es costoso y no se reutiliza.

import java.sql.*;

// DriverManager: registro y obtención de conexiones
// En Java 6+, los drivers se registran automáticamente via ServiceLoader (META-INF/services)
// No hace falta llamar a Class.forName() salvo en entornos sin ServiceLoader

// Obtener una conexión
String url = "jdbc:mysql://localhost:3306/mi_base_datos";
String usuario = "app_user";
String password = "secreto";

try (Connection con = DriverManager.getConnection(url, usuario, password)) {
    System.out.println("Conectado: " + con.getMetaData().getURL());
} catch (SQLException e) {
    System.err.println("Error al conectar: " + e.getMessage());
}

URLs de conexión

// Formato de URLs JDBC por base de datos:

// MySQL
String urlMySQL = "jdbc:mysql://localhost:3306/nombre_bd?useSSL=false&serverTimezone=UTC";

// PostgreSQL
String urlPG = "jdbc:postgresql://localhost:5432/nombre_bd";

// H2 (en memoria — para tests)
String urlH2mem = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1";

// H2 (fichero)
String urlH2file = "jdbc:h2:file:./datos/mi_bd";

// Oracle
String urlOracle = "jdbc:oracle:thin:@localhost:1521:ORCL";

// SQL Server
String urlSQLServer = "jdbc:sqlserver://localhost:1433;databaseName=mi_bd";
<!-- pom.xml: dependencias de drivers más comunes -->

<!-- MySQL -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.3.0</version>
</dependency>

<!-- PostgreSQL -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.7.1</version>
</dependency>

<!-- H2 (para tests) -->
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>2.2.224</version>
    <scope>test</scope>
</dependency>
H2 para tests: la base de datos H2 en memoria es ideal para tests de integración — arranca en milisegundos, no requiere servidor externo y se puede inicializar con un script SQL. Es la opción estándar para tests con Spring Boot (@DataJpaTest la usa automáticamente).

Siguiente apartado → Gestión de conexiones y try-with-resources

Índice de la sección

Índice del curso