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>