0Pricing
Java Academy · Lección

Fundamentos de JDBC

Conexiones, sentencias y conjuntos de resultados

Fundamentos de JDBC es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

¿Qué es JDBC?

JDBC (Java Database Connectivity) es la API estándar para comunicarse con bases de datos relacionales desde Java.

  • Se encuentra en el paquete java.sql.
  • Cada base de datos incluye un driver que implementa las interfaces de JDBC.
  • El código se escribe contra interfaces como Connection, Statement y ResultSet, nunca directamente contra las clases del proveedor.

Esta abstracción permite que el mismo código funcione con PostgreSQL, MySQL, H2 u Oracle.

Las interfaces principales

Tres interfaces realizan la mayor parte del trabajo:

  • Connection: una sesión abierta con la base de datos.
  • Statement / PreparedStatement: envía SQL.
  • ResultSet: un cursor sobre las filas devueltas por una consulta.

Se obtiene una Connection de DriverManager o de un DataSource.

Abrir una conexión

DriverManager.getConnection(url, user, password) devuelve una Connection activa.

La URL de JDBC identifica la base de datos, por ejemplo jdbc:postgresql://localhost:5432/shop. Los drivers modernos se registran automáticamente, por lo que ya no es necesario llamar a Class.forName(...).

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret")) {
            System.out.println("Connected: " + !conn.isClosed());
        } catch (SQLException e) {
            System.out.println("Connection failed: " + e.getMessage());
        }
    }
}

try-with-resources

Connection, Statement y ResultSet implementan AutoCloseable.

Siempre ábralos dentro de un bloque try-with-resources para que se cierren automáticamente, incluso cuando se produzca una excepción. Las conexiones no cerradas agotan rápidamente la base de datos.

  • Los recursos se cierran en orden inverso.
  • No se necesita un bloque finally.

Ejecutar una consulta

Para un SELECT sencillo, cree un Statement y llame a executeQuery, que devuelve un ResultSet.

El ejemplo utiliza una simulación en memoria para que pueda ver el flujo sin una base de datos real. En producción, el SQL se ejecutaría contra la conexión.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Simulated result of: SELECT name FROM users
        List<String> names = List.of("Ada", "Linus", "Grace");
        System.out.println("Query returned " + names.size() + " rows:");
        for (String name : names) {
            System.out.println(" - " + name);
        }
    }
}

Leer un ResultSet

Un ResultSet comienza antes de la primera fila. Llame a rs.next() en un bucle; devuelve false cuando no quedan más filas.

Lea las columnas por nombre o mediante un índice que comienza en 1 usando getters tipados:

  • rs.getInt("id")
  • rs.getString("name")
  • rs.getDouble("price")
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret");
             Statement st = conn.createStatement();
             ResultSet rs = st.executeQuery("SELECT id, name FROM users")) {
            while (rs.next()) {
                System.out.println(rs.getInt("id") + ": " + rs.getString("name"));
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

executeUpdate para operaciones de escritura

Para INSERT, UPDATE y DELETE, use executeUpdate. Devuelve un int: el número de filas afectadas.

Use execute únicamente cuando no sepa de antemano si la sentencia devuelve un conjunto de resultados.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret");
             Statement st = conn.createStatement()) {
            int rows = st.executeUpdate("DELETE FROM sessions WHERE expired = true");
            System.out.println("Deleted " + rows + " rows");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

Asignar filas a objetos

La mayoría de las aplicaciones convierten cada fila en un objeto de dominio. Recorra el ResultSet y cree instancias.

Este es el patrón, simulado para que se ejecute de forma independiente. Un record hace que la asignación sea concisa.

import java.util.ArrayList;
import java.util.List;

public class Main {
    record User(int id, String name) {}

    public static void main(String[] args) {
        // Stand-in for iterating a ResultSet
        String[][] rows = {{"1", "Ada"}, {"2", "Linus"}};
        List<User> users = new ArrayList<>();
        for (String[] row : rows) {
            users.add(new User(Integer.parseInt(row[0]), row[1]));
        }
        users.forEach(System.out::println);
    }
}

Gestionar SQLException

Casi todos los métodos de JDBC lanzan la excepción comprobada SQLException.

Contiene información de diagnóstico útil:

  • getMessage(): texto legible para las personas.
  • getSQLState(): código de estado estándar de 5 caracteres.
  • getErrorCode(): código específico del proveedor.

Registre esta información en lugar de ignorarla.

import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        SQLException e = new SQLException("duplicate key", "23505", 7);
        System.out.println("Message: " + e.getMessage());
        System.out.println("SQLState: " + e.getSQLState());
        System.out.println("ErrorCode: " + e.getErrorCode());
    }
}

DatabaseMetaData

conn.getMetaData() devuelve un objeto DatabaseMetaData que describe la propia base de datos.

Puede indicar el nombre y la versión del producto, las funciones compatibles e incluso enumerar tablas y columnas. Así funcionan herramientas como los exploradores de esquemas, sin tener que codificar detalles específicos de cada proveedor.

Integrarlo todo

Un flujo típico de lectura:

  • Abra una Connection en un bloque try-with-resources.
  • Cree un Statement (o, mejor, un PreparedStatement).
  • Llame a executeQuery y recorra los resultados con rs.next().
  • Asigne las columnas a objetos.
  • Deje que try-with-resources cierre todo.

En la próxima lección haremos que las consultas sean seguras frente a la inyección.

Comprobación rápida

¿Qué devuelve Statement.executeUpdate?

Resumen

Ahora conoce el flujo central de JDBC:

  • DriverManager.getConnection abre una Connection.
  • Statement envía SQL; executeQuery devuelve un ResultSet y executeUpdate devuelve el número de filas afectadas.
  • Itere con rs.next() y utilice getters tipados.
  • Utilice siempre try-with-resources y gestione SQLException con sus códigos de estado y de error.

Preguntas frecuentes

¿La lección «Fundamentos de JDBC» es gratis?

Sí — el texto completo de «Fundamentos de JDBC» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Fundamentos de JDBC»?

Conexiones, sentencias y conjuntos de resultados Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Fundamentos de JDBC»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Fundamentos de JDBC
  2. PreparedStatement
  3. Transacciones
  4. Agrupación de conexiones con HikariCP
← Volver a Java Academy