Antes de agregar código, recordemos lo que ya resolvimos
La aplicación de la tienda de cómics tiene una organización que no existía al comenzar el curso. No vamos a abandonarla: vamos a ampliar sus capacidades.
Presenta los datos y recoge la interacción
Coordina lo que sucede cuando pulsamos un botón
Trabaja con productos y comprueba reglas de negocio
Almacenamiento que estamos utilizando
Cuando el usuario pulsa Agregar, la Vista proporciona los datos escritos en los campos, el Controller coordina la acción y el Service comprueba las condiciones del negocio. Si todo está correcto, el nuevo Producto se incorpora a una colección.
Producto producto = new Producto(
101,
"Batman: Año Uno",
790.00,
8
);
En nuestro modelo, el código es de tipo long, el nombre es un String, el precio es double y el stock es int.
Producto representa un producto de la tienda en nuestro programa. Su existencia en memoria no garantiza que sus datos queden guardados después de cerrar la aplicación.Hagamos una prueba muy sencilla
Imagina que ejecutamos la aplicación y agregamos los siguientes productos:
| Código | Nombre | Precio ($) | Stock |
|---|---|---|---|
| 101 | Batman: Año Uno | 790 | 8 |
| 102 | Watchmen | 1250 | 5 |
| 103 | Mafalda, tomo 1 | 650 | 12 |
Los productos aparecen en nuestra JTable. Podemos seleccionarlos y trabajar con ellos. Hasta aquí, todo parece correcto.
El programa crea los componentes y la lista inicial.
La lista comienza a contener objetos Producto.
Los productos agregados ya no aparecen.
JTable dejó de mostrarlos o porque los datos ya no se conservan en la colección?Antes de seguir, piensa qué hace realmente la JTable
La tabla presenta información al usuario. No es, por sí misma, un sistema de almacenamiento permanente. Aunque mostrara los datos perfectamente, cerrarla no conservaría los objetos que estaban únicamente en la memoria del programa.
Un ArrayList no es una base de datos
Observemos una instrucción parecida a la que utilizamos en el servicio:
private ArrayList<Producto> listaProductos;
public ProductoService() {
listaProductos = new ArrayList<Producto>();
}
La primera línea declara una variable que puede referirse a una colección de productos. En el constructor se crea el ArrayList al iniciar ese objeto ProductoService.
Mientras la aplicación se ejecuta, podemos agregar, eliminar y consultar los elementos de la lista. Pero si los datos solo están en esa colección, cuando finaliza el programa no tenemos una copia persistente para recuperarlos.
Durante la ejecución
La aplicación mantiene objetos en memoria y podemos acceder a ellos mediante la colección.
listaProductos.add(producto);
En una nueva ejecución
Se crea un nuevo estado de la aplicación. No reaparece automáticamente la colección de la ejecución anterior.
new ArrayList<Producto>();
Dos palabras que necesitamos distinguir
Permite mantener y manipular objetos durante la ejecución. Por sí sola, nuestra lista no conserva datos entre ejecuciones.
Consiste en guardar datos para recuperarlos en otro momento, incluso después de que el programa haya terminado.
¿Dónde podríamos guardar los datos?
Una posibilidad sería escribirlos en un archivo. Es una alternativa válida para ciertos problemas. Pero cuando una aplicación necesita consultar, modificar, relacionar y organizar registros de distintas entidades, una base de datos relacional ofrece herramientas específicas.
En nuestro proyecto utilizaremos MySQL, un sistema gestor de bases de datos relacionales, para conservar los productos de la tienda.
Para conseguirlo, nuestra aplicación necesitará enviar y recibir información de un sistema distinto al propio programa Java.
Java y MySQL tienen responsabilidades diferentes
La aplicación Java
Ejecuta nuestra interfaz Swing, recibe acciones, aplica las reglas de negocio y crea objetos como Producto.
La organización que ya construimos pertenece a esta aplicación.
El servidor MySQL
Gestiona bases de datos, tablas, registros, consultas SQL, conexiones y permisos de acceso.
Puede ejecutarse en nuestra computadora o en otro equipo.
¿Qué significa localhost?
Si instalamos MySQL en la misma computadora que ejecuta nuestra aplicación, podemos acceder a ese servidor mediante localhost, una dirección que representa al propio equipo.
Si MySQL está en otra máquina, necesitaremos la dirección de ese servidor y los permisos correspondientes.
¿Qué es entonces una base de datos?
Podemos organizar los datos de nuestros productos en una tabla. Cada fila representa un registro y cada columna contiene un tipo de dato.
| codigo | nombre | precio | stock |
|---|---|---|---|
| 101 | Batman: Año Uno | 790.00 | 8 |
| 102 | Watchmen | 1250.00 | 5 |
El servidor administra esa información; nuestra aplicación necesita una forma de solicitar operaciones sobre ella.
¿Qué relación existe entre un objeto y una fila?
En Java escribimos:
Producto producto = new Producto(
101, "Batman: Año Uno", 790.00, 8
);
En una tabla podríamos almacenar los valores correspondientes a ese producto:
| codigo | nombre | precio | stock |
|---|---|---|---|
| 101 | Batman: Año Uno | 790.00 | 8 |
No son la misma cosa. El objeto existe dentro de la aplicación Java y puede tener métodos y comportamiento. La fila contiene datos organizados y administrados por MySQL.
De Java a MySQL
Tomaremos los valores de un objeto Producto y realizaremos una operación para guardarlos como registro.
De MySQL a Java
Leeremos los valores de un registro y, con ellos, podremos construir un nuevo objeto Producto.
Esta traducción entre los datos del programa y los registros almacenados será una de las responsabilidades de los componentes DAO que incorporaremos más adelante. Todavía no necesitamos programarlos.
Aparece JDBC
Si Java y MySQL son sistemas diferentes, tenemos que disponer de una forma de pedir una conexión, enviar consultas y recibir resultados.
JDBC significa Java Database Connectivity. Es una API que Java proporciona para trabajar con sistemas de bases de datos relacionales.
Recuerda que una API reúne clases, interfaces y otros elementos que permiten utilizar funcionalidades desde nuestro código.
Solicitar una conexión con la base de datos.
Enviar instrucciones SQL al servidor.
Leer los resultados y trabajar con ellos desde Java.
¿JDBC es un programa que instalamos?
No exactamente. Java incluye la API JDBC, cuyos elementos principales están en el paquete java.sql.
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;
En esta primera lectura no vamos a utilizar todavía estas clases e interfaces. Solo necesitamos reconocer que forman parte de la API y que cada una tendrá una función concreta cuando comencemos a programar la conexión y las consultas.
Si JDBC ya está en Java, ¿para qué necesitamos un driver?
JDBC establece una API común, pero los diferentes sistemas gestores de bases de datos necesitan implementaciones que sepan comunicarse con ellos.
El driver JDBC es una biblioteca que proporciona esa implementación para un sistema concreto.
Operaciones comunes
Implementación para comunicarse con MySQL
No confundamos API con driver
JDBC
Es la API que utilizamos desde Java. Define operaciones y tipos comunes para trabajar con bases de datos.
Driver MySQL
Es la biblioteca que implementa lo necesario para comunicar esas operaciones con MySQL. La incorporaremos como dependencia de Maven.
Si nuestra aplicación utilizara PostgreSQL, necesitaríamos el driver JDBC correspondiente a PostgreSQL. Aunque cambiaría el driver, gran parte de la manera de programar con JDBC seguiría siendo similar.
DriverManager y Connection paso a paso.Piensa qué está ocurriendo, no memorices definiciones
Responde y observa la devolución. Puedes volver a leer cualquier apartado.
1. Cerramos la tienda y, al abrirla otra vez, no aparecen los productos que agregamos. ¿Cuál es la explicación más adecuada?
2. ¿Qué queremos conseguir al incorporar persistencia?
3. ¿Qué componente administra las tablas y sus registros?
4. ¿Cuál es la diferencia principal entre JDBC y el driver MySQL?
5. Si la base de datos está instalada en el mismo equipo, ¿qué suele indicar localhost?
Ya sabemos qué problema tenemos que resolver
La tienda no necesita que volvamos a escribir la interfaz ni que abandonemos el Controller y el Service. Necesita una forma de conservar los datos que hoy solo están en memoria.
Micro-entrega de documentación
En tu cuaderno o documento del proyecto, registra:
- una explicación de por qué se pierden los productos almacenados solo en un
ArrayList; - la diferencia entre objeto Java y registro de una tabla, usando uno de los cómics de este material;
- un esquema con Aplicación Java → JDBC → driver → MySQL y una frase sobre la función de cada pieza;
- una pregunta que todavía tengas sobre la comunicación con la base de datos.
Próximo material: vamos a solicitar nuestra primera conexión a MySQL. Allí estudiaremos DriverManager, getConnection(), la dirección JDBC, Connection y los errores que pueden ocurrir.

