Durante nuestro curso de desarrollo de aplicaciones en Java y MySQL aprendemos a crear un CRUD, que es el acronimo de Create, Read, Update and Delete (Crear, Leer, Actualizar y Borrar), que se usa para referirse a las transacciones básicas en bases de datos.
Primero aprenderemos a realizar esta aplicación de forma sencilla con programación estructurada para familiarizarnos con el lenguaje de programación Java y la integración de datos de MySQL. Más adelante haremos una aplicación similar pero implementado la arquitectura MVC.
Requerimientos
- JDK 8.0 o superior
- MySQL 5.7 o superior
- Connector/J 8.0
El proyecto se desarrollo con de IDE Apache Netbeans.
Crear base de datos
Aquí la estructura de la base de datos y tabla.
CREATE DATABASE IF NOT EXISTS `escuela` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `escuela`;
CREATE TABLE `persona` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`clave` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
`nombre` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`domicilio` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
`telefono` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`correo_electronico` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`fecha_nacimiento` date DEFAULT NULL,
`genero` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Crear proyecto
El proyecto lo hemos desarrollado en el IDE Netbeans actualmente Apache Netbeans. Creamos un proyecto de tipo Java Application y desmarcamos la casilla Create Main Class:
Esto creará un proyecto vacío por lo cual agregaremos un paquete dan clic derecho sobre el nombre del proyecto > New > Java Package y no nombramos como app.
Dentro de este paquete agregamos un JFrame dando clic derecho sobre el nombre del paquete > New > JFrame Form y lo nombramos como persona.
La estructura del proyecto se será así:
Diseño de la vista
Para agregar el diseño de nuestro formulario abrimos el archivo persona.java dando doble clic, agregamos el siguiente diseño:
Descripción de los elementos
Elemento | Texto | Variable |
---|---|---|
JLabel | Clave | |
JLabel | Nombre | |
JLabel | Domicilio | |
JLabel | Telefono | |
JLabel | ||
JLabel | Fecha de nacimiento | |
JLabel | Genero | |
JTextField | txtClave | |
JTextField | txtId | |
JTextField | txtNombre | |
JTextField | txtDomicilio | |
JTextField | txtTelefono | |
JTextField | txtEmail | |
JTextField | txtFecha | |
JComboBox | cbxGenero | |
JButton | Buscar | btnBuscar |
JButton | Guarda | btnGuarda |
JButton | Modifica | btnModifica |
JButton | Elimina | btnElimina |
JButton | Limpiar | btnLimpiar |
Para el elemento JComboBox ve a la propiedades y en Model agrega las opciones:
- Selecciona
- Masculino
- Femenino
Puedes agregar más opciones. También puede agregar más elementos al formulario según tus necesidades.
Conexión a MySQL
Para conectar Java con MySQL se necesita un controlador JDBC compatible entre la versión JDK y MySQL. Descargar Connector/J.
Después de descargar el controlador vamos al proyecto y damos clic derecho en la carpeta Libraries y seleccionamos Add JAR/Folder, buscamos el controlador .jar y lo agregamos.
Teniendo el controlador agregado ya podemos conectarnos a la base de datos de MySQL para esto regresamos al JFrame pero ahora seleccionamos la pestaña source para ver el código fuente del formulario.
Método para conexión
Dentro del código fuente de la clase persona.java trabajaremos después del constructor que es el método que se llama igual que la clase.
public static Connection getConection() {
Connection con = null;
String base = "escuela"; //Nombre de la base de datos
String url = "jdbc:mysql://localhost:3306/" + base; //Direccion, puerto y nombre de la Base de Datos
String user = "root"; //Usuario de Acceso a MySQL
String password = "password"; //Password del usuario
try {
Class.forName("com.mysql.cj.jdbc.Driver");
con = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException | SQLException e) {
System.err.println(e);
}
return con;
}
Métodos CRUD
Después de realizar la conexión a MySQL crearemos los métodos para las transacciones básicas; Registrar, Leer o Buscar, Modificar y Eliminar. Para estos se necesita implementar eventos de ActionListener la cual se usa para detectar y manejar eventos de acción, como el clic en los botones.
Podemos activar este eventos de forma automática regresando a la vista diseño y dando doble clic en los botones o dando clic derecho sobre el botón > Events > Action > actionPerformed.
Antes de agregar el código a los botón crearemos un método que elimine el contenido de las cajas de texto (JTextField).
private void limpiarCajas() {
txtClave.setText(null);
txtNombre.setText(null);
txtDomicilio.setText(null);
txtTelefono.setText(null);
txtEmail.setText(null);
txtFecha.setText(null);
cbxGenero.setSelectedIndex(0);
}
Método del botón para guardar
private void btnGuardaActionPerformed(java.awt.event.ActionEvent evt) {
Connection con;
try {
con = getConection();
ps = con.prepareStatement("INSERT INTO persona (clave, nombre, domicilio, telefono, correo_electronico, fecha_nacimiento, genero) VALUES(?,?,?,?,?,?,?) ");
ps.setString(1, txtClave.getText());
ps.setString(2, txtNombre.getText());
ps.setString(3, txtDomicilio.getText());
ps.setString(4, txtTelefono.getText());
ps.setString(5, txtEmail.getText());
ps.setDate(6, Date.valueOf(txtFecha.getText()));
ps.setString(7, cbxGenero.getSelectedItem().toString());
int res = ps.executeUpdate();
if (res > 0) {
JOptionPane.showMessageDialog(null, "Persona Guardada");
} else {
JOptionPane.showMessageDialog(null, "Error al Guardar persona");
}
limpiarCajas();
con.close();
} catch (HeadlessException | SQLException e) {
System.err.println(e);
}
}
Método del botón para buscar
private void btnBuscarActionPerformed(java.awt.event.ActionEvent evt) {
Connection con;
try {
con = getConection();
ps = con.prepareStatement("SELECT * FROM persona WHERE clave = ?");
ps.setString(1, txtClave.getText());
rs = ps.executeQuery();
if (rs.next()) {
txtId.setText(rs.getString("id"));
txtNombre.setText(rs.getString("nombre"));
txtDomicilio.setText(rs.getString("domicilio"));
txtTelefono.setText(rs.getString("telefono"));
txtEmail.setText(rs.getString("correo_electronico"));
txtFecha.setText(rs.getString("fecha_nacimiento"));
cbxGenero.setSelectedItem(rs.getString("genero"));
} else {
JOptionPane.showMessageDialog(null, "No existe una persona con la clave");
limpiarCajas();
}
} catch (HeadlessException | SQLException e) {
System.err.println(e);
}
}
Método del botón para editar
private void btnModificaActionPerformed(java.awt.event.ActionEvent evt) {
Connection con;
try {
con = getConection();
ps = con.prepareStatement("UPDATE persona SET clave=?, nombre=?, domicilio=?, telefono=?, correo_electronico=?, fecha_nacimiento=?, genero=? WHERE id=?");
ps.setString(1, txtClave.getText());
ps.setString(2, txtNombre.getText());
ps.setString(3, txtDomicilio.getText());
ps.setString(4, txtTelefono.getText());
ps.setString(5, txtEmail.getText());
ps.setDate(6, Date.valueOf(txtFecha.getText()));
ps.setString(7, cbxGenero.getSelectedItem().toString());
ps.setString(8, txtId.getText());
int res = ps.executeUpdate();
if (res > 0) {
JOptionPane.showMessageDialog(null, "Persona Modificada");
} else {
JOptionPane.showMessageDialog(null, "Error al Modificar persona");
}
limpiarCajas();
con.close();
} catch (HeadlessException | SQLException e) {
System.err.println(e);
}
}
Método del botón para eliminar
private void btnEliminaActionPerformed(java.awt.event.ActionEvent evt) {
Connection con;
try {
con = getConection();
ps = con.prepareStatement("DELETE FROM persona WHERE id=?");
ps.setInt(1, Integer.parseInt(txtId.getText()));
int res = ps.executeUpdate();
if (res > 0) {
JOptionPane.showMessageDialog(null, "Persona Eliminada");
} else {
JOptionPane.showMessageDialog(null, "Error al eliminar persona");
}
limpiarCajas();
con.close();
} catch (HeadlessException | NumberFormatException | SQLException e) {
System.err.println(e);
}
}
Método del botón limpiar
private void btnLimpiarActionPerformed(java.awt.event.ActionEvent evt) {
limpiarCajas();
}
Como instrucción adicional podemos hacer que el campo de texto para guardar temporalmente el ID del registro no sea visible. Para esto agregamos la propiedad setVisible(false) a la variable txtId, esto será en el método constructor después de iniciar los componentes.
public persona() {
initComponents();
txtId.setVisible(false);
}
Ejecutar proyecto CRUD
Para ejecutar el proyecto damos clic derecho dentro de la clase y seleccionar Run File para ejecutar el proyecto.
Resultado
Puedes crear tu propio diseño, quitar o agregar campos al formulario y adaptarlo a tus necesidades.
Bonus
Si quieres una explicación más detallada sobre este proyecto puedes ver el siguiente vídeo:
También puedes ver y descargar el proyecto desde GitHub: https://github.com/mroblesdev/CRUD-Java-MySQL
Si está en tus posibilidades puedes invitarme un café ☕️, una cerveza 🍺 o realizar una donación 🎁 vía Paypal https://www.paypal.com/paypalme/markorobles?locale.x=es_XC
Espero que este tutorial te haya servido, nos vemos hasta la próxima.