En este ejercicio, desarrollaremos una aplicación Java que permita:
- Cargar un archivo JSON con datos de productos.
- Insertar esos datos en una base de datos MySQL.
- Configurar dinámicamente las credenciales de acceso a MySQL.
- Exportar los datos de la base de datos MySQL a un archivo JSON.
Al final del artículo, encontrarás la solución completa.
Enunciado del Ejercicio
Crea una aplicación Java que permita:
- Interfaz gráfica:
- Incluye cuatro botones:
- Cargar Archivo JSON: Permite seleccionar un archivo JSON con datos de productos.
- Enviar Datos a MySQL: Inserta los datos cargados desde el archivo en una tabla MySQL.
- Configurar Usuario y Contraseña: Solicita credenciales de MySQL.
- Exportar MySQL a JSON: Recupera datos de la base de datos y los guarda en un archivo JSON.
- Incluye cuatro botones:
- Formato del archivo JSON:
- El archivo debe contener un array de objetos, donde cada objeto represente un producto con los campos
nombre
,precio
ycategoria
. - Ejemplo:
[ {"nombre": "Laptop", "precio": 1500, "categoria": "Electrónica"}, {"nombre": "Silla", "precio": 100, "categoria": "Muebles"} ]
- El archivo debe contener un array de objetos, donde cada objeto represente un producto con los campos
- Estructura de la base de datos:
- Crea una base de datos llamada
tienda
. - Crea una tabla llamada
productos
con las columnasid
,nombre
,precio
ycategoria
.
- Crea una base de datos llamada
- Comportamiento:
- Si no se selecciona un archivo antes de presionar «Enviar Datos a MySQL», muestra un mensaje de advertencia.
- Los datos exportados deben seguir el formato JSON.
Solución del Ejercicio
1. Configuración de la Base de Datos
Antes de ejecutar el programa, configura la base de datos en MySQL:
CREATE DATABASE tienda;
USE tienda;
CREATE TABLE productos (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100),
precio DECIMAL(10, 2),
categoria VARCHAR(100)
);
2. Código Java
Aquí está el código completo de la aplicación:
package Ejemplo.Ejercicio;
import com.google.gson.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class App {
private static String dbUser = "root"; // Usuario predeterminado
private static String dbPassword = ""; // Contraseña predeterminada
public static void main(String[] args) {
JFrame frame = new JFrame("Gestión de Datos JSON y MySQL");
frame.setSize(500, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JButton btnCargarJSON = new JButton("Cargar Archivo JSON");
JButton btnEnviarDatos = new JButton("Enviar Datos a MySQL");
JButton btnConfigurarBD = new JButton("Configurar Usuario y Contraseña");
JButton btnExportarJSON = new JButton("Exportar MySQL a JSON");
JLabel lblMensaje = new JLabel("");
frame.add(btnCargarJSON);
frame.add(btnEnviarDatos);
frame.add(btnConfigurarBD);
frame.add(btnExportarJSON);
frame.add(lblMensaje);
final File[] archivoSeleccionado = new File[1];
// Botón: Cargar Archivo JSON
btnCargarJSON.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
int seleccion = fileChooser.showOpenDialog(frame);
if (seleccion == JFileChooser.APPROVE_OPTION) {
archivoSeleccionado[0] = fileChooser.getSelectedFile();
lblMensaje.setText("Archivo seleccionado: " + archivoSeleccionado[0].getName());
}
}
});
// Botón: Enviar Datos a MySQL
btnEnviarDatos.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (archivoSeleccionado[0] != null) {
try (FileReader reader = new FileReader(archivoSeleccionado[0])) {
Gson gson = new Gson();
JsonArray productos = gson.fromJson(reader, JsonArray.class);
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/tienda", dbUser, dbPassword);
for (JsonElement element : productos) {
JsonObject producto = element.getAsJsonObject();
String nombre = producto.get("nombre").getAsString();
double precio = producto.get("precio").getAsDouble();
String categoria = producto.get("categoria").getAsString();
String sql = "INSERT INTO productos (nombre, precio, categoria) VALUES (?, ?, ?)";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, nombre);
stmt.setDouble(2, precio);
stmt.setString(3, categoria);
stmt.executeUpdate();
}
JOptionPane.showMessageDialog(frame, "Datos enviados a MySQL exitosamente.", "Éxito", JOptionPane.INFORMATION_MESSAGE);
conn.close();
} catch (Exception ex) {
JOptionPane.showMessageDialog(frame, "Error: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(frame, "Por favor, selecciona un archivo primero.", "Advertencia", JOptionPane.WARNING_MESSAGE);
}
}
});
// Botón: Configurar Usuario y Contraseña
btnConfigurarBD.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dbUser = JOptionPane.showInputDialog(frame, "Introduce el usuario de la base de datos:");
dbPassword = JOptionPane.showInputDialog(frame, "Introduce la contraseña de la base de datos:");
JOptionPane.showMessageDialog(frame, "Configuración actualizada correctamente.", "Configuración", JOptionPane.INFORMATION_MESSAGE);
}
});
// Botón: Exportar MySQL a JSON
btnExportarJSON.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/tienda", dbUser, dbPassword);
String sql = "SELECT * FROM productos";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
List<JsonObject> productos = new ArrayList<>();
while (rs.next()) {
JsonObject producto = new JsonObject();
producto.addProperty("id", rs.getInt("id"));
producto.addProperty("nombre", rs.getString("nombre"));
producto.addProperty("precio", rs.getDouble("precio"));
producto.addProperty("categoria", rs.getString("categoria"));
productos.add(producto);
}
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Guardar Archivo JSON");
if (fileChooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
String filePath = file.getAbsolutePath();
if (!filePath.endsWith(".json")) {
filePath += ".json";
}
Gson gson = new GsonBuilder().setPrettyPrinting().create();
try (FileWriter writer = new FileWriter(filePath)) {
gson.toJson(productos, writer);
}
JOptionPane.showMessageDialog(frame, "Datos exportados a " + filePath, "Éxito", JOptionPane.INFORMATION_MESSAGE);
}
conn.close();
} catch (Exception ex) {
JOptionPane.showMessageDialog(frame, "Error: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
}
});
frame.setVisible(true);
}
}
3. Dependencias en Maven
Asegúrate de agregar las dependencias necesarias en tu archivo pom.xml
:
<dependencies>
<!-- Gson para manejo de JSON -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10</version>
</dependency>
<!-- Conector de MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
Consejos para Resolver el Ejercicio
- Revisar el archivo JSON:
- Asegúrate de que el archivo tenga un formato válido antes de cargarlo.
- Pruebas por Funcionalidad:
- Primero, verifica la conexión con MySQL.
- Luego, prueba cada botón de forma independiente.
- Validación:
- Maneja errores como formatos JSON incorrectos o credenciales inválidas de MySQL.
- Exportación:
- Asegúrate de que el archivo exportado siga el formato esperado.
Con esta solución, puedes construir una aplicación robusta que gestione datos entre archivos JSON y MySQL. ¡Buena suerte!