En múltiples ocasiones hemos tenido a oportunidad de trabajar con componentes Swing como lo son los JTable; este tipo de componentes visuales, nos permiten presentar datos recopilados de forma ordenada. Estos datos en la mayoría de los casos provienen de bases de datos; hoy recrearemos un ejemplo de cómo modificar JTable y actualizar MySQL desde Java, esto con el fin de que al momento de cambiar el valor de una celda el datos quede actualizado inmediatamente en la base de datos, empecemos.
Modificar JTable y actualizar Mysql desde Java
Propongamos el siguiente escenario sobre el cual recrearemos el ejemplo de modificar JTable y actualizar MySQL desde Java:
Base de datos de ejemplo
Contaremos con una base de datos y una tabla con el listado de personas que mostraremos en el JTable.
🌟 ¡Visita Nuestra Tienda para Programadores! 🌟Descubre Códigos Fuente, Cursos, Software, Computadoras, Accesorios y Regalos Exclusivos. ¡Todo lo que necesitas para llevar tu programación al siguiente nivel!
Código fuente: Proyecto CRUD en Java MVC – con base de datos MySQL
Interfaz del programa
La interfaz del programa es muy sencilla, solo un formulario tipo JFrame con un JTable donde se muestran los datos. Si aún no sabes cómo cargar los datos en el JTable puedes acceder a este artículo donde explico cómo hacerlo.
Funcionamiento del programa
Cómo fue citado en el primer párrafo, el programa deberá actualizar los datos al momento de editar una celda del JTable; el usuario escribirá el nuevo valor o modificará el existente y pulsará enter. En este momento los datos deberán actualizarse en la tabla de MySQL.
Evento KeyReleased del JTable
El código que escribiremos lo ubicaremos en el evento KeyReleased del JTable, con el fin de identificar cuando el usuario pulsa enter sobre una celda en estado de edición.
El código utilizado en este evento es muy similar al usado en un botón; con la diferencia que utilizamos un condicional al inicio para identificar la pulsación de la tecla enter; posteriormente procedemos a obtener todos los valores de las celdas de la fila seleccionada para enviarlos como parámetros a la consulta SQL.
Para este ejemplo enviamos a actualizar todos los datos al tiempo; pero también podemos enviar solo el dato que se está editando, así mismo mostramos un mensaje aspecto que podríamos omitir por comodidad al usuario.
Programa en funcionamiento
Como observamos al pulsar enter sobre la celda editada. Los datos son guardados en la tabla.
Verificando los registros de la taba en MySQL
Al consultar los registros de la tabla «listado_personas» en MySQL, nos damos cuenta que el dato fué actualizado. Esta es una de las muchas formas sobre las cuales podemos actualizar en tiempo de ejecución un dato de un JTable en Java enviandolo a MySQL de forma inmediata.
Compañero buenos días, quisiera saber si podrías ayudarme con algo, seguí tus paso al pie de la letra, el programa me carga la base de datos en el Jtable pero al darle click para poder editar alguna celda me sale el siguiente error
«Exception in thread «AWT-EventQueue-0″ java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 1
at optica1.cita$17.isCellEditable(cita.java:1144)»
estoy haciendo paso a paso, agradecería tu ayuda
Buenas tardes, amigo, normalmente los errores de tipo ArrayIndexOutOfBoundsException, suceden por que estás intentando acceder a un índice que no existe (Normalmente en un arreglo, o matriz), sin embargo estás utilizando un JTable que es muy similar, debes tener presente los números de las filas y columnas, de lo contrario el valor no será encontrado.
éxitos.
Amigo buenos días, efectivamente tenia un error en la numeración de las filas y columnas, quisiera saber si podrías ayudarme con un tema diferente, no se como hacer para que me guarde la letra » ñ » en mi base de datos desde mi aplicativo Netbeans hasta el momento la letra me la guarda con este símbolo «?» al ver un nombre en mi base de datos me sale «londo?o», he mirado varia información pero aun a si no logro encontrar nada que me sirva, de ante mano te agradezco.
Buenos días Andrés, puedes intentar pasar la codificación de los caracteres en tu clase conexión, un ejemplo sería:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Modelo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;
/**
*
* @author Ivan
*/
public class Conexion {
public Connection conexion;
public Statement sentencia;
public ResultSet resultado;
//Establecemos los datos de conexion de MySQL
//Asignamos el driver correspondiente a la base de datos que usaremos
public void Conectar() {
try {
final String Controlador = «com.mysql.jdbc.Driver»;
Class.forName(Controlador);
final String url_bd = «jdbc:mysql://localhost:3306/basededatos?characterEncoding=latin1&useConfigs=maxPerformance»;
conexion = DriverManager.getConnection(url_bd, «root», «root»);
sentencia = conexion.createStatement();
} catch (ClassNotFoundException | SQLException ex) {
JOptionPane.showMessageDialog(null, ex.getMessage(), «Error», JOptionPane.ERROR_MESSAGE);
}
}
public void Desconectar() {
try {
if (conexion != null) {
if (sentencia != null) {
sentencia.close();
}
conexion.close();
}
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, ex.getMessage(), «Error», JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
}
public Connection getConnection() {
return conexion;
}
}
Mira la parte donde dice characterEncoding=latin1…
Recuerda también codificar tu base de datos y las tablas como utf8.
Saludos!
Buenos días,
mil gracias por la ayuda me fue de mucha utilidad, ahora podre terminar y empezar a mirar los reportes
Excelente amigo, éxitos en tus proyectos.
amigo, sabes de donde sale sentencia? mi código lo agarra como error
Maestro buenas noches, como buen hijo prodigo vuelvo, esta vez con un problema que tengo al intentar grabar una imagen a mi base de datos, me sale un error que no logro interpretar
Exception in thread «AWT-EventQueue-0» java.lang.AbstractMethodError: Receiver class com.mysql.jdbc.PreparedStatement does not define or inherit an implementation of the resolved method ‘abstract void setBinaryStream(int, java.io.InputStream)’ of interface java.sql.PreparedStatement.
esta es la forma que hago la consulta a la base de datos
conectar2 cc = new conectar2();
Connection conect = (Connection) cc.conexion();
fis=new FileInputStream(path);
PreparedStatement pst = conect.prepareStatement(«insert….. values ?…
y esta la forma en la que lee los datos
pst.setString(46, diagnostico.getText());
pst.setBinaryStream(47, fis);
no te agrego todo el codigo ya que como puedes obsevar son 47 datos a ingresar aunque en su totalidad son 46 de forma string y el 47 es el parametro que guarda la imagen
de ante mano te agradezco la ayuda
Buenos días, hasta ahora veo tu mensaje, quizá a este punto ya solucionaste el error; este error lo he visto en varias ocasiones, y va más orientado a la librería jdbc que estás utilizando, te recomiendo que revises la versión de JDK que estás usando y descargar e importar una librería actualizada.
Cómo recomendación, te diría que en lugar de guardar una imagen en la base de datos, guardes solo la ruta de la misma, puedes intentar enviar tus imágenes a un servidor FTP y en la base de datos solo guardar el texto de la URL, es más ligero para tu proyecto.
Saludos!
Mil gracias por tu respuesta,la verdad aún sigo mirando soluciones al error , efectivamente uso una versión más vieja del JDK,pero si uso la última que es la versión 15 no me afectaría el uso de ireport?
Y una pregunta más si guardara solo la ruta cuando fuera a imprimir en un reporte me traería la ruta o la imagen, podrías darme un ejemplo perdona tanta pregunta, aún soy muy ignorante en este mundo ya que actualmente lo ando estudiando
Maestro buenas noches ya lo pude solucionar mil gracias por tu ayuda.
Hola… tengo un problema con el codigo, he copiado el codigo pero el try catch no me lo permite poner en funcionamiento, el catch me sale con error y dice: REMOVE CATCH CLAUSE
Hola Sara, quizá es por que no estás usando una conexión a base de datos, prueba colocando:
try{
//Tu código
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, ex.getMessage(), «Error», JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
Saludos!
¿Que es sentencia? de donde sale?