JDBC (Java DataBase Connectivity) es la API de Java que permite interactuar a una aplicación Java con diversas fuentes de datos (desde bases de datos relacionales a hojas de cálculo o archivos de texto).

JDBC hace posible que una aplicación Java pueda acceder a los datos almacenados en cualquiera de las bases de datos relacionales. De esta forma la aplicación Java (según los permisos que tenga) puede insertar, modificar, eliminar y recuperar los datos de la base de datos.

En la interacción de una aplicación Java con un Sistema Gestor de Base de Datos relacional (SGBD), JDBC se encarga de gestionar:

  • la conexión de la aplicación con el SGBD
  • la emisión de consultas y comandos desde la aplicación hacia el SGBD
  • el manejo de los resultados que devuelve el SGBD a la aplicación

Arquitectura de JDBC

Podríamos representar a JDBC como un asistente virtual que ha sido programado (mediante muchas clases, interfaces, métodos y datos) para actuar como intérprete y permitir la comunicación e interacción entre una aplicación Java y una aplicación SGBD.

Este asistente virtual, este intérprete, tiene que poder entender «el idioma» de ambas aplicaciones. Por eso su arquitectura tiene 2 capas:

  • una JDBC API (entiende el idioma de la aplicación Java) y
  • un JDBC driver (entiende el idioma de la aplicación Java y el de un SGBD específico)

JDBC API

La JDBC API define un conjunto de interfaces Java que encapsulan las funcionalidades y los datos necesarios para interactuar con una fuente de datos (por ejemplo, un SGBD).

JDBC API es parte de las librerías estándar de Java SE (Java Standard Edition) y está compuesta por 2 paquetes:

  • java.sql y
  • javax.sql

La JDBC API entiende el idioma de la aplicación Java pero no entiende el idioma del SGBD (es fabricante-agnóstica).

Por eso, para poder interactuar con un SGBD en particular (Oracle, MySQL, PostgreSQL, etc.), la API utiliza un JDBC driver, que es la parte que entiende el idioma de ese SGBD específico.

JDBC Driver

El JDBC driver es la parte que entiende tanto el lenguaje de la aplicación Java como el lenguaje del SGBD.

Hay tantos JDBC Drivers como fuentes de datos a las que se puede acceder mediante la JDBC API. Pero sólo es necesario instalar en nuestra aplicación el driver de la fuente de datos a la que queremos que nuestra aplicación acceda.

Para el caso del acceso a una base de datos relacional, cada fabricante de un SGBD proporciona su propio JDBC driver.

Un JDBC driver consiste en un conjunto de clases que implementan las interfaces de la JDBC API.

A través del driver el SGBD puede recibir y procesar las declaraciones SQL que le envía la aplicación Java y retornar los resultados solicitados.

Los resultados que entrega el SGBD no los entrega directamente a la aplicación Java porque la aplicación Java no entiende el idioma del SGBD.

El SGBD entrega los resultados a la JDBC API (a través del driver), y es la API quien los procesa y los entrega a la aplicación Java.

Pasos para Consultar una Base de Datos mediante JDBC

El proceso de interacción de una aplicación Java con un SGBD puede resumirse en 4 etapas:

Etapa 1 – Conectar

Lo primero que debemos hacer es verificar (mediante el método forName() de la clase Class) que nuestra aplicación Java cuenta con el intérprete, con el JDBC driver que necesita para comunicarse con el SGBD.

Una vez confirmamos que nuestra aplicación cuenta con el intérprete adecuado, ésta puede intentar comunicarse con el SGBD. Para ello JDBC pone a nuestra disposición un objeto especial: el objeto Connection.

El objeto Connection es el recipiente donde nuestra aplicación Java debe colocar los datos de que dispone para solicitarle al SGBD que le permita operar sobre la base de datos.

Entonces JDBC toma el objeto Connection (que ahora contiene la cadena de conexión, el nombre y la contraseña de un usuario de la base de datos) y con esos datos solicita al SGBD que le permita acceder a la base de datos.

Si el SGBD verifica que las credenciales presentadas por la aplicación Java son correctas, abre una conexión a través de la cual recibirá las instrucciones que la aplicación le envíe (mediante el JDBC driver).

Etapa 2 – Consultar

Una vez establecida la conexión, JDBC utiliza el objeto Connection para fabricar otro objeto especial: el objeto Statement (mediante el método createStatement()).

Este objeto Statement es el recipiente especializado donde nuestra aplicación puede guardar las declaraciones SQL que quiere que el SGBD aplique sobre la base de datos.

JDBC utiliza el objeto Statement para transmitir las instrucciones de la aplicación Java al SGBD a través de algunos de sus métodos, como por ejemplo:

  • executeUpdate()  para insert, delete, update
  • executeQuery() para consultas

Etapa 3 – Procesar resultados

Una vez que el SGBD cumplió con las instrucciones sobre la base de datos, hará una devolución a la JDBC API (mediante el JDBC driver) y ésta entregará esta información a la aplicación Java.

Qué es lo que entrega la JDBC API depende del método que invocó la aplicación Java para pasarle las instrucciones SQL.

Por ejemplo, cuando pasamos una consulta mediante el método executeQuery(), la JDBC API devolverá un objeto ResultSet a la aplicación Java.

Pero, además de entregar los resultados de la operación, la JDBC API también ofrece métodos para procesar dichos resultados (de ser necesario).

Así, por ejemplo, un objeto ResultSet cuenta con varios métodos para recorrer la información que contiene y extraer toda esa información (o parte de ella) para que la aplicación Java pueda utilizarla, por ejemplo almacenándola en variables.

Etapa 4 – Cerrar

Una conexión a la base de datos consume recursos dentro de la aplicación Java, y especialmente en el servidor de la base de datos.

Por lo tanto, mantener abiertas las conexiones de base de datos que no se utilizan requerirá que la base de datos mantenga asignados recursos para la conexión innecesariamente.

Cuando usamos JDBC debemos asegurarnos de que se cierran todos los recursos que usamos. Todos los recursos, incluidos ResultSet, Statement y Connection, deben cerrarse.

A partir de Java 7 podemos usar la instrucción try-with-resources para administrar automáticamente los recursos que usamos. Esta instrucción try cierra los recursos utilizados cuando el bloque finaliza su ejecución (ya sea de forma normal o abrupta).

Ejemplo de uso

Este artículo es una presentación conceptual del funcionamiento de la JDBC API.

En un próximo artículo compartiré un ejemplo de uso de esta API para establecer una conexión de una aplicación Java con una base de datos de Oracle.🤓

Etiquetado en: