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.
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).
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)
- Cada relación (o tabla) tiene un nombre distinto.
- Los valores de los atributos son atómicos (es decir no podemos
separarlo en partes).
- No hay dos atributos con el mismo nombre en una misma relación (en
ejemplo previo, no tendríamos dos atributos de nombre RUT) .
- El orden de los atributos no importa (el orden de las columnas no
importa, en otras palabras no lleva información).
- Cada tupla es distinta de las demás (no se repiten los elementos de un
conjunto).
- 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.
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.
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:
- Establecer la conexión con la base de datos.
- Crear un objeto sentencia para hacer las consultas SQL a la base de
datos.
- Ejecutar consultas (query) usando el objeto sentencia.
- Para cada consulta procesar el objeto
ResultSet
retornado por la consulta.
- 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.