En este ejercicio, aprenderás cómo desarrollar una aplicación en Java que permita:
- Cargar un archivo CSV con información de empleados.
- Insertar esos datos en una base de datos MySQL.
- Configurar dinámicamente las credenciales de acceso a MySQL.
- Exportar datos desde la base de datos MySQL a un archivo CSV.
Al final del artículo, encontrarás la solución completa.
Enunciado del Ejercicio
Crea una aplicación Java con las siguientes funcionalidades:
- Interfaz gráfica:
- Incluye cuatro botones:
- Cargar Archivo CSV: Permite seleccionar un archivo CSV con datos de empleados.
- Enviar Datos a MySQL: Inserta los datos cargados desde el CSV en una tabla MySQL.
- Configurar Usuario y Contraseña: Solicita las credenciales de MySQL.
- Exportar MySQL a CSV: Exporta los datos de la tabla MySQL a un archivo CSV.
- Incluye cuatro botones:
- Estructura de la base de datos:
- Crea una base de datos llamada
empresa
. - La tabla debe llamarse
empleados
y tener las columnas:id
,nombre
,edad
,departamento
.
- Crea una base de datos llamada
- Requisitos técnicos:
- Utiliza
JDBC
para la conexión con MySQL. - Maneja los archivos CSV usando las clases estándar de Java (
BufferedReader
yFileWriter
). - Agrega un
JFileChooser
para seleccionar y guardar archivos.
- Utiliza
- Comportamiento:
- Si no se selecciona un archivo antes de presionar «Enviar Datos a MySQL», muestra un mensaje de advertencia.
- Los datos exportados deben incluir encabezados en el archivo CSV generado.
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 empresa;
USE empresa;
CREATE TABLE empleados (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100),
edad INT,
departamento VARCHAR(100)
);
2. Código Java
El siguiente código implementa la solución completa:
package Ejemplo.Ejercicio;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.sql.*;
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 CSV y MySQL");
frame.setSize(500, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JButton btnCargarCSV = new JButton("Cargar Archivo CSV");
JButton btnEnviarDatos = new JButton("Enviar Datos a MySQL");
JButton btnConfigurarBD = new JButton("Configurar Usuario y Contraseña");
JButton btnExportarCSV = new JButton("Exportar MySQL a CSV");
JLabel lblMensaje = new JLabel("");
frame.add(btnCargarCSV);
frame.add(btnEnviarDatos);
frame.add(btnConfigurarBD);
frame.add(btnExportarCSV);
frame.add(lblMensaje);
final File[] archivoSeleccionado = new File[1];
// Botón: Cargar Archivo CSV
btnCargarCSV.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 (BufferedReader br = new BufferedReader(new FileReader(archivoSeleccionado[0]))) {
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/empresa", dbUser, dbPassword);
String line;
br.readLine(); // Omitir encabezado
while ((line = br.readLine()) != null) {
String[] data = line.split(",");
String nombre = data[0];
int edad = Integer.parseInt(data[1]);
String departamento = data[2];
String sql = "INSERT INTO empleados (nombre, edad, departamento) VALUES (?, ?, ?)";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, nombre);
stmt.setInt(2, edad);
stmt.setString(3, departamento);
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 CSV
btnExportarCSV.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/empresa", dbUser, dbPassword);
String sql = "SELECT * FROM empleados";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Guardar Archivo CSV");
if (fileChooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
String filePath = file.getAbsolutePath();
if (!filePath.endsWith(".csv")) {
filePath += ".csv";
}
BufferedWriter bw = new BufferedWriter(new FileWriter(filePath));
bw.write("ID,Nombre,Edad,Departamento");
bw.newLine();
while (rs.next()) {
bw.write(rs.getInt("id") + "," + rs.getString("nombre") + "," +
rs.getInt("edad") + "," + rs.getString("departamento"));
bw.newLine();
}
bw.close();
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);
}
}
Consejos para Resolver el Ejercicio
- Comprender los Requisitos:
- Antes de escribir código, asegúrate de entender lo que se pide.
- Divide el problema en partes más pequeñas.
- Manejo de Errores:
- Usa
try-catch
para prevenir que errores inesperados rompan la aplicación. - Muestra mensajes claros al usuario.
- Usa
- Uso de Herramientas:
- Aprovecha bibliotecas estándar y recursos como
JFileChooser
para mejorar la experiencia del usuario.
- Aprovecha bibliotecas estándar y recursos como
- Pruebas:
- Prueba cada funcionalidad por separado antes de integrarlas.
Con este enfoque, puedes resolver ejercicios similares con éxito. ¡Buena suerte!