Arquitectura de Acceso a Datos

La Arquitectura en Capas de JDBC

Tu código nunca habla con un motor de base de datos en particular: programa contra las interfaces de java.sql, y cada fabricante entrega el Driver que las implementa en binario.

Aplicación — DAOs ProductoDAO · ClienteDAO java.sql — API JDBC estándar Connection · Statement · ResultSet PostgreSQL :5432 Driver JDBC MySQL :3306 Driver JDBC H2 / SQLite memoria local Driver JDBC
Selector de motor Cambiá de base de datos sin tocar una sola línea de ProductoDAO
jdbc:postgresql://localhost:5432/tienda 0 líneas cambiadas en la capa de aplicación
Seguridad de la Capa de Datos

Inyección SQL vs PreparedStatement: La Separación Estructural

Concatenar la entrada del usuario en el SQL confunde datos con código ejecutable. PreparedStatement compila la consulta como un árbol fijo antes de que el dato exista.

Statement Inseguro
String sql = "SELECT * FROM usuarios "
    + "WHERE email = '" + entrada + "'";
rs = statement.executeQuery(sql);
Consulta enviada al motor:
SELECT * FROM usuarios WHERE email = 'facundo@mail.com'
1 fila
PreparedStatement Seguro
String sql = "SELECT * FROM usuarios "
    + "WHERE email = ?";
ps = conn.prepareStatement(sql);
ps.setString(1, entrada);
Plantilla precompilada + parámetro:
SELECT * FROM usuarios WHERE email = ? → "facundo@mail.com"
1 fila
Consola: probá un payload Elegí una entrada y mirá qué recibe cada consulta
Lectura de Datos

El Cursor de ResultSet: Recorriendo Registros en Memoria

ResultSet no es una lista cargada en memoria: es un cursor que apunta a un buffer y dialoga con la base fila por fila mediante rs.next().

idnombreprecio
1Teclado45.0
2Mouse20.0
3Monitor220.0
[ANTES DE LA PRIMERA FILA]
// todavía no se llamó a rs.next()
Consistencia y Atomicidad

Transacciones ACID: El Protocolo Atómico de Transferencia

Si una transferencia de $100 entre dos cuentas se interrumpe a mitad de camino, el dinero no puede evaporarse: o se confirman todos los cambios con commit, o no se aplica ninguno con rollback.

conn.setAutoCommit(false);
Rendimiento y Arquitectura de Acceso a Datos

Pools de Conexiones (HikariCP) y el Patrón DAO

Abrir una conexión TCP/TLS con autenticación cuesta cientos de milisegundos. Un pool como HikariCP mantiene conexiones ya abiertas listas para prestarse.

Latencia por request:
Conexión tomada del pool 2 ms

conn.close() no destruye la conexión: la devuelve al pool para el próximo request.

ProductoDAO buscarPorId(id) buscarPorCategoria(c) insertar(p) actualizarStock(id, d) eliminar(id) el SQL vive solo acá Producto id, nombre precio, stock