JDBC API (Java Database Connectivity API)

La API de JDBC provee acceso a datos desde Java. Usando esta API podemos acceder a variadas fuentes de datos: bases de datos relacionales, hojas de cálculo (spreadsheets) y archivos planos. Demos una mirada a qué son las bases de datos antes de revisar cómo las manejamos desde Java.

Introducción a Bases de Datos

Una base de datos es una colección integrada de registros o archivos lógicamente relacionados consolidados en una unidad que provee datos para usos múltiples.
Para conseguir este objetivo se han propuesto varias estructuras o formatos de base de datos. A esto se le llama el modelo de la bases de datos. Entre ellos están el modelo plano, modelo jerárquico, modelo de red, modelo relacional, ver Figura 1. En adelante nos concentraremos sólo en las bases de datos con estructura relacional. 
Modelos de bases de datos
Figura 1: Modelos de Bases de Datos (tomado de wikipedia)

Las bases de datos relacionales están compuestas por relaciones (en el sentido una relación matemática, del álgebra o del cálculo relacional). Cada relación es representada y almacenada en una tablas. Los datos son representados como n-tupas, que pertenecen al Producto Cartesiano de n conjuntos.

Por ejemplo, considere los conjuntos: RUT, nombre, fecha de nacimiento y peso. Ejemplos de datos son:
(111111-1, Juan, 01.01.2020, 75)
(222222-2, Pedro, 02.02.2019, 70)

La tabla almacena estas n-tuplas, también llamados registros, las cuales corresponden a las filas de la tabla. Las columnas de la tabla son referidas como los atributos. Todos los valores de una columna son del mismo tipo, por ejemplo entero, string, fecha. Cada tupla, o fila, tiene así un valor de un tipo definido para cada atributo, o columna.

La base de datos es el conjunto de datos organizados en algún medio. Otra cosa es el programa que nos permite su creación, control y acceso. Este conjunto de programas se conoce como Sistema Administrador de la  Base de Datos (DBMS, Database Management System). Cuando este sistema maneja una base de datos relacional se habla de un RDBMS por Sistema Administrador de Base de Datos Relacional. Uno de tales sistemas es MySQL (licencia GPL, General Public License). Otro RDBMS es PostgreSQL (licencia BSD).

Con licencia GPL podemos usar y/o alterar el código original con la condición que el resultado sea hecho disponible en los mismos términos. Esto se resume bajo el término copyleft (dejar copiar), en contraste con copyright. Con licencia BSD impone restricciones mínimas sobre el uso y distribución de software. Código con licencia BSD puede ser distribuido en formato binario.

La manipulación de la base de datos relacional, a través del Sistema Administrador de la Base de Datos, es hecha por medio de consultas o peticiones formuladas en un lenguaje de consultas. Un lenguajes común para manejar bases de datos relacionales es SQL (Structured Query Language).

Relación entre SQL, DBMS y la DB

Figura 2: Relación entre SQL, RDBMS y DB

Propiedades de las Relaciones (las podemos recordar si pensamos una relación como subconjunto el producto Cartesiano)

  1. Cada relación (o tabla) tiene un nombre distinto.
  2. Los valores de los atributos son atómicos (es decir no podemos separarlo en partes).
  3. No hay dos atributos con el mismo nombre en una misma relación (en ejemplo previo, no tendríamos dos atributos de nombre RUT) .
  4. El orden de los atributos no importa (el orden de las columnas no importa, en otras palabras no lleva información).
  5. Cada tupla es distinta de las demás (no se repiten los elementos de un conjunto).
  6. El orden de las tuplas no importa (el orden de las filas de la tabla no es relevante, no lleva información).
Para manipular relaciones, es necesario identificar el conjunto de atributos que consiguen identificar en forma unívoca una tupla.
Definiciones:
Clave Candidata es el conjunto de atributos de una tabla tales que: permiten identificar en forma unívoca a una tupla y no podemos eliminar un atributo y seguir cumpliendo unicidad. 
Clave Primaria es una clave candidata que ha sido seleccionada para identificar unívocamente los registros de una tabla.
Clave Foránea: es un atributo o conjunto de éstos que es clave primaria en otra tabla.
Estos conceptos son ilustrados en la figura 3. 
 Definiciones
Figura 3: Ejemplo de términos usados en Bases de datos Relacionales: Aquí tenemos dos tablas (Mediciones y Sensores), ambas forman la base de datos.

 De la Figura 2 se desprende la necesidad de conocer el lenguaje SQL para generar soluciones de software que requieran almacenar datos de forma organizada. Ciertamente no es lo único, para decidir qué relaciones (tablas) crear y con qué atributos, es necesario hacer un análisis de los datos que participan en una aplicación y cómo estos datos están relacionados. Para esto existen técnicas de modelado de datos que conducen al modelo de datos. Uno de tales modelos es el modelo de entidad y relación el cual es usado para generar la base de datos relacional.

Para focalizarnos en el acceso a las bases de datos desde Java, este material no cubre SQL ni las técnicas que conducen a bases de datos normalizadas. La normalización de una base de datos es la manera sistemática para asegurar que la estructura de una base de datos permita consultas de propósito general y esté libre de posibles pérdidas de integridad de los datos.

JDBC API (Java Database Connectivity API)

Este paquete de software permite conectarse a una base de datos, consultarla o actualizarla usando SQL. Su manejo es de importancia debido a la frecuencia con que las bases de datos son usadas hoy.
Así como con Java se logra independencia de la plataforma, al trabajar con JDBC se logra además independencia del proveedor de la base de datos.
Una dificultad enfrentada por los desarrolladores de JDBC fue que existen muchos proveedores de bases de datos cada uno usando su protocolo propio. Es así como se acordó el desarrollo de una API Java para SQL, la cual accede la base de datos vía un administrador de drivers de terceros los cuales se conectan a bases de datos específicas.  Cada proveedor de bases de datos debía generar su propio driver conectable al administrador de drivers.
JDBC sigue un modelo similar al de ODBC (Open Database Connectivity) de Microsoft.  ODBC es una API estándar para conectarse a bases de datos. Por esto una opción común es conectar JDBC a través de un driver que actúa como puente entre JDBC y ODBC, ver Figura 4. 
Driver Manager
Figura 4: Administrador de Drivers

Instalación de Base de Datos de Prueba

Usaremos MariaDB para probar la conectividad desde Java. Para acceder a otras bases de datos compatibles con SQL, basta cambiar el driver y el punto de conexión con la base de datos.
Un sistema de desarrollo simple es XAMPP (Apache+MariaDB +PHP+Perl). Luego de bajarlo y seguir sus instrucciones, es simple crear bases de datos para probar nuestros desarrollos. Con XAMPP tenemos una base de datos relacional MariaDB en nuestro computador y su DBMS.
Una vez instalada podemos iniciarla con:
agustin@agustin:~$ sudo /opt/lampp/lampp start
Starting XAMPP for Linux 7.2.27-0...
XAMPP: Starting Apache...already running.
XAMPP: Starting MySQL...ok.
XAMPP: Starting ProFTPD...ok.
agustin@agustin:~/tools$ 
Con su navegador dé una mirada a http://localhost/ y seleccione phpMyAdmin para crear una base de datos. Luego cree en ella alguna tabla con algunos registros.

Instalación del Driver JDBC

MariaDB ha desarrollado un driver compatible con el administrador de drivers de Java. Este driver permite la conexión de Java con bases de datos MySQL.
Para que Java tenga acceso al driver podemos incluir su directorio en la variable CLASSPATH, podemos usar la opción -cp al ejecutar el programa, o podemos instalarlo en un directorio de Java que ya sea revisado por la máquina virtual; por ejemplo, bajo directorio ...../jre/lib/ext/

Con MariaDB instalada y el driver JDBC instalado, podemos ejercitar la conexión de Java con su base de datos.

Aplicaciones Java con Base de Datos MySQL

Entendido lo anterior, todo programa Java que desea ser conectado a una base de datos necesita cargar el driver específico para la base de datos a usar.
Para esto se usa:
    try {  // Carga el driver JDBC
Class.forName("org.mariadb.jdbc.Driver");
} catch( Exception e ) {
System.out.println( "No se pudo cargar el Drive." );
return;
 }
Luego su programa puede conectarse con la base de datos específica, la cual debe estar previamente creada. Para esto se usa:
   Connection conexion; // Aloja una conexión o sesión con la base de datos para interactuar con ella.
 Statement sentencia; // A partir de la conexión podemos crear objetos sentencias que permiten hacer consultas SQL
try {
conexion = DriverManager.getConnection( "jdbc:mariadb://localhost/ELO330","root",""); // Aquí ELO330 es la Base de Datos que debe existir previamente
sentencia = conexion.createStatement();
:
} catch( SQLException e ) {
System.out.println("Error en la operacion" + e.getMessage());
 }
En general los pasos para hacer consultas SQL en JDBC son:
  1. Establecer la conexión con la base de datos.
  2. Crear un objeto sentencia para hacer las consultas SQL a la base de datos.
  3. Ejecutar consultas (query) usando el objeto sentencia.
  4. Para cada consulta procesar el objeto ResultSet retornado por la consulta.
  5. Cerrar la conexión.
Dar una mirada a las interfaces Connection y Statement en la documentación Java.

Ejemplos:
Creación y llenado de una tabla, para su compilación y ejecución revise el archivo Makefile.
Consultas de Clientes de Banco, para su compilación y ejecución revise el archivo Makefile.
Pacientes, para su compilación y ejecución revise el archivo Makefile.