En este ejercicio, desarrollaremos una aplicación Java que permita:
- Cargar un archivo de texto (
.txt
) con datos de clientes. - Insertar esos datos en una base de datos PostgreSQL.
- Configurar dinámicamente las credenciales de acceso a la base de datos.
- Exportar los datos de la base de datos PostgreSQL a un archivo de texto (
.txt
).
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 TXT: Permite seleccionar un archivo
.txt
con datos de clientes. - Enviar Datos a PostgreSQL: Inserta los datos cargados desde el archivo en una tabla PostgreSQL.
- Configurar Usuario y Contraseña: Solicita credenciales de PostgreSQL.
- Exportar PostgreSQL a TXT: Recupera datos de la base de datos y los guarda en un archivo
.txt
.
- Cargar Archivo TXT: Permite seleccionar un archivo
- Incluye cuatro botones:
- Formato del archivo TXT:
- Cada línea del archivo contiene los datos en el siguiente formato:
nombre,edad,ciudad
Ejemplo:Juan Pérez,30,Madrid
- Cada línea del archivo contiene los datos en el siguiente formato:
- Estructura de la base de datos:
- Crea una base de datos llamada
empresa
. - Crea una tabla llamada
clientes
con las columnasid
,nombre
,edad
yciudad
.
- Crea una base de datos llamada
- Comportamiento:
- Si no se selecciona un archivo antes de presionar «Enviar Datos a PostgreSQL», muestra un mensaje de advertencia.
- Los datos exportados deben incluir encabezados en el archivo generado.
Solución del Ejercicio
1. Configuración de la Base de Datos
Antes de ejecutar el programa, configura PostgreSQL con los siguientes comandos:
CREATE DATABASE empresa;
\c empresa
CREATE TABLE clientes (
id SERIAL PRIMARY KEY,
nombre VARCHAR(100),
edad INT,
ciudad VARCHAR(100)
);
2. Código Java
Aquí está el código completo de la aplicación:
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 = "postgres"; // Usuario predeterminado
private static String dbPassword = "admin"; // Contraseña predeterminada
public static void main(String[] args) {
JFrame frame = new JFrame("Gestión de Datos TXT y PostgreSQL");
frame.setSize(500, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JButton btnCargarTXT = new JButton("Cargar Archivo TXT");
JButton btnEnviarDatos = new JButton("Enviar Datos a PostgreSQL");
JButton btnConfigurarBD = new JButton("Configurar Usuario y Contraseña");
JButton btnExportarTXT = new JButton("Exportar PostgreSQL a TXT");
JLabel lblMensaje = new JLabel("");
frame.add(btnCargarTXT);
frame.add(btnEnviarDatos);
frame.add(btnConfigurarBD);
frame.add(btnExportarTXT);
frame.add(lblMensaje);
final File[] archivoSeleccionado = new File[1];
// Botón: Cargar Archivo TXT
btnCargarTXT.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 PostgreSQL
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:postgresql://localhost:5432/empresa", dbUser, dbPassword);
String line;
while ((line = br.readLine()) != null) {
String[] data = line.split(",");
String nombre = data[0];
int edad = Integer.parseInt(data[1].trim());
String ciudad = data[2];
String sql = "INSERT INTO clientes (nombre, edad, ciudad) VALUES (?, ?, ?)";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, nombre);
stmt.setInt(2, edad);
stmt.setString(3, ciudad);
stmt.executeUpdate();
}
JOptionPane.showMessageDialog(frame, "Datos enviados a PostgreSQL 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 PostgreSQL a TXT
btnExportarTXT.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Connection conn = DriverManager.getConnection(
"jdbc:postgresql://localhost:5432/empresa", dbUser, dbPassword);
String sql = "SELECT * FROM clientes";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Guardar Archivo TXT");
if (fileChooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
String filePath = file.getAbsolutePath();
if (!filePath.endsWith(".txt")) {
filePath += ".txt";
}
BufferedWriter bw = new BufferedWriter(new FileWriter(filePath));
bw.write("ID,Nombre,Edad,Ciudad");
bw.newLine();
while (rs.next()) {
bw.write(rs.getInt("id") + "," + rs.getString("nombre") + "," +
rs.getInt("edad") + "," + rs.getString("ciudad"));
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
- Configura PostgreSQL correctamente:
- Asegúrate de que tu servidor PostgreSQL esté funcionando.
- Verifica las credenciales y permisos.
- Prueba el archivo TXT:
- Usa un editor de texto para crear un archivo con datos de prueba.
- Asegúrate de que cada línea siga el formato correcto:
nombre,edad,ciudad
.
- Divide las funcionalidades:
- Prueba cada botón por separado.
- Verifica la conexión con la base de datos antes de enviar o exportar datos.
- Control de errores:
- Agrega validaciones para asegurarte de que los datos del archivo son correctos.
- Maneja excepciones comunes, como errores de conexión o formato incorrecto.
Con este enfoque, podrás construir una aplicación funcional y robusta para manejar datos entre archivos TXT y PostgreSQL. ¡Buena suerte!