En una ocasión anterior mostramos como conectar una aplicación Java con MySQL, basados en eso, nos enfocaremos en insertar datos desde una aplicación Java hacia una tabla de una base de datos MySQL, algo muy necesario para muchos programadores ¡Manos a la obra!
Tabla de Contenido
Hay que preparar la base de datos primero
Comenzamos creando la tabla que vamos a necesitar, desde una ventana de consola o desde nuestro cliente SQL favorito, ejecutamos las siguientes instrucciones::
create database pruebajava;
use pruebajava;
create table datos(id int not null auto_increment, nombre varchar(30) not null, edad int not null, sexo set('F','M'), primary key(id));
La cual, queda así:
Asegurando la conexión a la base de datos
Es hora de abrir Netbeans y crear un nuevo proyecto. Para hacer esto, vamos al menú File y seleccionamos New.
En la ventana de New Project, seleccionamos Java with Ant en la sección Categories y luego Java Application en la sección Projects. Luego presionamos el botón Next.
En Project Name, le ponemos nombre al proyecto y presionamos el botón Finish.
En el gestor de proyectos, seleccionamos la carpeta Libraries, presionamos el botón derecho del ratón encima de ella y seleccionamos Add Library.
En la ventana de diálogo, seleccionamos el ConnectorJ que previamente descargamos y configuramos, después presionamos el botón Add Library.
Vamos a reutilizar la clase que se genero automáticamente. Para ello, usamos el botón derecho encima del archivo java, seleccionamos la opción Refactor y luego Rename.
En la ventana de diálogo, establecemos el valor de New Name a Conectar, luego presionamos el botón Refactor.
Usaremos la misma clase que creamos en el artículo anterior, para acortar debe quedar así:
package javamysql;
import java.sql.Connection;
import java.sql.DriverManager;
public class Conectar {
public static final String URL = "jdbc:mysq l://localhost:3306/pruebajava";
public static final String USER = "root";
public static final String CLAVE = "";
public Connection getConexion(){
Connection con = null;
try{
Class.forName("com.mysq l.cj.jdbc.Driver");
con = (Connection) DriverManager.getConnection(URL, USER, CLAVE);
}catch(Exception e){
System.out.println("Error: " + e.getMessage());
}
return con;
}
}
Hagamos el modelo para la tabla
Para hacer nuestro ejemplo más funcional, haremos uso de MVC de una manera muy simple, así que comenzamos creando el modelo. En el gestor de proyectos, presionamos el botón derecho sobre nuestro package, seleccionamos New y luego Java Class.
El Class Name de nuestro archivo será ModeloDatos, después de eso presionamos el botón Finish.
Comenzamos creando las variables que corresponden a los campos de nuestra tabla, recordemos que las variables deben ser privadas.
private Integer id;
private String nombre;
private Integer edad;
private String sexo;
Debajo de la última variable presionamos el botón derecho del ratón y seleccionamos la opción Insert Code.
En la lista de opciones que aparece, seleccionamos Getter and Setter.
En la ventana de diálogo que aparece, presionamos el botón Select All y luego Generate.
Hagamos el controlador de los datos
En el gestor de proyectos, presionamos el botón derecho sobre nuestro package, seleccionamos New y luego Java Class.
El Class Name de nuestro archivo será ControlDatos, después de eso presionamos el botón Finish.
Comencemos colocando los import a los objetos que vamos a necesitar, son: Connection, PreparedStatement, SQLException y JOptionPane:
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import javax.swing.JOptionPane;
Dentro de la clase, colocamos una variable de tipo Connection, otra de tipo ModeloDatos y una más de tipo Conectar.
private Conectar conectar;
private ModeloDatos modelo;
private Connection con;
Creamos el constructor de la clase y dentro del mismo, instanciamos los objetos de tipo Conectar y ModeloDatos.
public ControlDatos(){
conectar = new Conectar();
modelo = new ModeloDatos();
}
Creamos el método Insertar con 3 parámetros: nombre, edad y sexo.
public void insertar(String nombre, int edad, String sexo){
}
Dentro de nuestro método, creamos una variable de tipo PreparedStatement, un String para nuestro sql y cargamos nuestro modelo con los datos que provienen de los parámetros del mismo método.
PreparedStatement ps;
String sql;
modelo.setNombre(nombre);
modelo.setEdad(edad);
modelo.setSexo(sexo);
Inmediatamente después de eso, colocamos un try – catch con un mensaje de advertencia:
try{
}catch(SQLException e){
JOptionPane.showMessageDialog(null, "Error de conexión:" + e.getMessage());
}
Trabajemos dentro del try. Lo primero es establecer la conexión:
con = conectar.getConexion();
Después, creamos nuestra cadena SQL en formato de sentencia preparada.
sql = "insert into datos(nombre, edad, sexo) values(?,?,?)";
Creamos nuestra sentencia con el SQL que acabamos de crear.
ps = con.prepareStatement(sql);
Después con los métodos setString para cadenas de texto y setInt para número enteros, reemplazamos pasamos los datos que tenemos cargados en el modelo a la sentencia preparada en el mismo orden de los campos.
ps.setString(1, modelo.getNombre());
ps.setInt(2, modelo.getEdad());
ps.setString(3, modelo.getSexo());
Finalmente ejecutamos la sentencia preparada y lanzamos un mensaje de confirmación
ps.executeUpdate();
JOptionPane.showMessageDialog(null, "Se han insertado los datos");
La clase completa queda así:
package javamysql;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class ControlDatos {
private Conectar conectar;
private ModeloDatos modelo;
private Connection con;
public ControlDatos(){
conectar = new Conectar();
modelo = new ModeloDatos();
}
public void insertar(String nombre, int edad, String sexo){
PreparedStatement ps;
String sql;
modelo.setNombre(nombre);
modelo.setEdad(edad);
modelo.setSexo(sexo);
try{
con = conectar.getConexion();
sql = "insert into datos(nombre, edad, sexo) values(?,?,?)";
ps = con.prepareStatement(sql);
ps.setString(1, modelo.getNombre());
ps.setInt(2, modelo.getEdad());
ps.setString(3, modelo.getSexo());
ps.executeUpdate();
JOptionPane.showMessageDialog(null, "Se han insertado los datos");
}catch(SQLException e){
JOptionPane.showMessageDialog(null, "Error de conexión:" + e.getMessage());
}
}
}
¡Es hora de crear la vista!
En el gestor de proyectos, presionamos el botón derecho sobre nuestro package, seleccionamos New y luego JFrame Form.
El Class Name de nuestro archivo será VistaDatos, después de eso presionamos el botón Finish.
Para crear la vista, necesitamos 4 jLabel, 1 JTextField, 1 JSpinner, 1 JComboBox y un JButton. Después de jugar un poco con ellos, nuestro formulario queda más o menos así:
Vamos a personalizar un poco el JSpinner, lo seleccionamos y nos movemos a su ventana de propiedades. En ella, presionamos el botón de tres puntos que está a la derecha de la propiedad model.
En la ventana de diálogo, abrimos la lista llamada Model Type y seleccionamos Number.
En las Model Properties, configuramos los valores Initial Value, Minumum y Maximum según nuestra conveniencia, al finalizar presionamos el botón OK.
Ahora, personalizamos el JComboBox, para ello lo seleccionamos y en su ventana de propiedades usamos el botón de tres puntos a la derecha de la propiedad model.
En la ventana de diálogo, reemplazamos lo valores default del Combo por los que necesitamos, al finalizar presionamos el botón OK.
Es hora de poner nombres a la variables, sobre el jTextField presionamos el botón derecho del ratón y elegimos Change Variable Name.
El New Name de nuestro objeto será txtNombre, al finalizar presionamos el botón OK.
Haremos lo mismo con los otros objetos, llamándolos spnEdad para el JSpinner, cmbSexo para el JComboBox y btnGuardar para el JButton.
¡Es tiempo de programar el botón de Guardar!
Damos un doble click sobre nuestro botón de Guardar para invocar a su método ActionPerformed, ahí comenzaremos a escribir.
Necesitamos una variable Boolean para saber si un registro se puede guardar o no, esta variable iniciará en true. También necesitamos una variable String para los mensajes de error.
Boolean guardar = true;
String mensaje = "";
Pasamos el nombre del JTextField a una variable String
String nombre = txtNombre.getText();
Hacemos lo mismo con la edad, cuidando de convertir el String del JSpinner en un número entero.
int edad = Integer.parseInt(spnEdad.getValue().toString());
En cuanto al sexo, lo tomemos del elemento seleccionado del JComboBox
String sexo = cmbSexo.getSelectedItem().toString();
Si la longitud del nombre es cero, entonces cambiamos la bandera a false y guardamos el primero mensaje de error.
if(nombre.length()==0){
guardar = false;
mensaje+="Escriba el nombre, por favor\n";
}
Si la edad se queda en cero, cambiamos la bandera a false y guardamos el segundo mensaje de error.
if(edad==0){
guardar = false;
mensaje+="Escriba la edad, por favor\n";
}
Si la bandera no se cambio a false en ningún momento, entonces creamos la instancia de nuestro ControlDatos, aseguramos los valores necesarios para la variable sexo, le pasamos los valores al controlador por medio de su método insertar y regresamos los objetos a sus valores iniciales.
if(guardar){
ControlDatos control = new ControlDatos();
if(sexo.equals("Fememino")) sexo = "F";
if(sexo.equals("Masculino")) sexo = "M";
control.insertar(nombre, edad, sexo);
txtNombre.setText("");
spnEdad.setValue(0);
cmbSexo.setSelectedIndex(0);
}
En caso contrario (la bandera si cambio a false) notificamos los errores que hayamos encontrado.
else JOptionPane.showMessageDialog(null, mensaje);
Todo el código dentro del botón queda así:
Boolean guardar = true;
String mensaje = "";
String nombre = txtNombre.getText();
int edad = Integer.parseInt(spnEdad.getValue().toString());
String sexo = cmbSexo.getSelectedItem().toString();
if(nombre.length()==0){
guardar = false;
mensaje+="Escriba el nombre, por favor\n";
}
if(edad==0){
guardar = false;
mensaje+="Escriba la edad, por favor\n";
}
if(guardar){
ControlDatos control = new ControlDatos();
if(sexo.equals("Fememino")) sexo = "F";
if(sexo.equals("Masculino")) sexo = "M";
control.insertar(nombre, edad, sexo);
txtNombre.setText("");
spnEdad.setValue(0);
cmbSexo.setSelectedIndex(0);
}
else JOptionPane.showMessageDialog(null, mensaje);
Probando el resultado final
Si todo salió bien… (Ver en pantalla completa)
DESCARGA EL PROYECTO NETBEANS PARA PROBAR
¡Y eso es todo por ahora! ¿Te ha resultado? Déjanos saber en los comentarios aquí abajo, en nuestra cuenta de twitter @cablenaranja7 o en nuestra página de facebook.
Docente, IT Manager, Blogger & Developer. Escribo por diversión, educo por pasión. | Grandstanding is not my thing.
El código funciona de maravilla, fue de mucha ayuda, pero quisiera saber como hacer para cuando tengo más de una tabla ¿Como horganiso o que hago en vista para hacer el acomodo?
Puedes checar nuestro artículo sobre Vistas:
https://www.cablenaranja.com/como-manejar-vistas-en-mysql/
Si necesitas más de una, puedes utilizar una subconsulta también (Una consulta dentro de otra) por ejemplo:
select id, producto, precio, cantidad, (select importe from ventas where productoid = id) as "Importe" from productos
Te traerá id, nombre del producto, precio y cantidad de la tabla de productos, pero también si notas la consulta dentro de los paréntesis trae el importe de venta del producto utilizando el id, eso es una subconsulta.
Espero te sirva.
Claro que si muchas gracias 🙏🏼🙏🏼🙏🏼🙏🏼
¿Como puedo hacer para generar diferentes paneles para ingresar datos a diferentes tablas?
Solo repite el proceso por cada tabla y cambia las campos y cadenas SQL de acuerdo a la tabla.
Buenas, el código es de mucha ayuda, pero una duda, también introduce los campos en el formato necesario para la tabla? por ejemplo, los tipo date.
Muchísimas gracias.
Saludos Antonio. Si notaste, en efecto se ajusta cada campo según su tipo de datos. En el caso de los datos tipo date, recuerda que en MySQL va en orden: año-mes-día, lo que significa que tienes que configurarlo en el servidor.
Hola quisiera hacerte una pregunta, usted importa el archivo en el que tiene la conexion de la base de datos y los otros en el de la vista?
No, para eso es el controlador. Ese es el que importo a la vista. De hecho se “importa” solito cuando hacemos:
ControlDatos control = new ControlDatos();
Dentro del código del botón.
Hola. Esta vez me tocó revisar la vista de los datos, pero bien, una librería que no tenía que haber puesto. Muy bueno el material, me ha ayudado muchísimo. Saludos
Hola! (quizas sea muy tonta la pregunta pero…)
en el caso de tener un tabla persona y dos tablas de roles diferentes (corresponden a la funcion que cumple cada persona dentro del sistema ejemplo: paciente y medico), como haria el proceso…?
Saludos Romina. Eso va en la clase ControlDatos, tocaría crear un método similar a insertar con los correspondientes datos. Algo como:
public void insertarPaciente(String nombre, int edad, String sexo){
PreparedStatement ps;
String sql;
modelo.setNombre(nombre);
modelo.setEdad(edad);
modelo.setSexo(sexo);
try{
con = conectar.getConexion();
sql = "insert into pacientes(nombre, edad, sexo) values(?,?,?)";
ps = con.prepareStatement(sql);
ps.setString(1, modelo.getNombre());
ps.setInt(2, modelo.getEdad());
ps.setString(3, modelo.getSexo());
ps.executeUpdate();
JOptionPane.showMessageDialog(null, "Se han insertado los datos");
}catch(SQLException e){
JOptionPane.showMessageDialog(null, "Error de conexión:" + e.getMessage());
}
}
Y lo mismo para médico.
En la invocación, sería algo como:
control.insertar(nombre, edad, sexo);
control.insertarPaciente(nombre, edad, sexo);
control.insertarMedico(nombre, edad, sexo);
Es una idea. Espero te sirva, saludos.
Hola, es muy bueno el programa pero al momento de correrlo sale que hay error en el “com.mysql l.cj.jdbc.Driver”
Y en la clase de ControlDatos de insertar
Me podría ayudar por favor
Borre el espacio dentro de “com.mysql l.cj.jdbc.Driver” debe ser “com.mysqll.cj.jdbc.Driver”
Saludos
Hola buenas tardes! segui el paso a paso, pero al momento de apretar el boton para guardar datos me aparece este error Exception in thread “AWT-EventQueue-0” java.lang.UnsupportedOperationException: Not supported yet.
como puedo solucionarlo?
Saludos ¿En qué parte del código aparece ese error? Puedes colocarlo aquí para que lo revisemos.
De acuerdo a la salida de errores. Tiene algunos detalles en las líneas 197, 190, 123, 13 y 55 ¿Puede dejarnos ver esas líneas, por favor?
hola buenos noches al correr el programa no me sale en inicio no sale nada
Hola Daniela ¿Qué información tienes en el output? Normalmente cuando hay un problema ahí se puede ver. Presione Ctrl + 4 y pon aquí la información que te salga. Quizá te podamos ayudar con eso.
Hola: gusto con tus explicaciones y soy nuevo en esto de base de datos, tengo una duda, ¿si tengo una apliacación web con una base de datos relacionada, al momento de llenar una tabla desde la apliación a través de un formulario, pero resulta que esa tabla esta relacionada con otra, pero algunos atributos de esa otra tabla no se han llenado aún, entonces cómo se llena esta tabla que tiene atributos de otra tabla, pero que la aplicación todavía no ha llegado a esa pagina para llenar los atributos de esa tabla, no sé si me hago entender. Por ejemplo tengo la tabla con nombre, apellidos, asignaturaa, calificación. y la otra tabla tiene la asignatura y la calificación, si te das cuenta puedo llenar en la primera página con la primera tabla, pero la asignatura y calificación aún no la puedo llenar por que viene de la otra tabla que aún no se ha llenado esos atributos, esto es un ejemplo. Tengo esa duda, como te digo soy nuevo en esto no sé si me puedes indicar o enviar un link e investigar bien mi problemilla. Mil gracias.
Puedes tener 3 tablas: alumnos, asignatura y calificación, siendo calificación la tabla que une alumnos y asignatura con sus correspondientes claves foráneas. Es un error de diseño el integrar elementos que no pertenecen a la entidad. Es decir, en tu tabla de alumnos asignatura y calificación son dos entidades (tablas, relaciones, etc) diferentes por lo que no deben estar ahí. Mientras que asignatura es otra tabla y calificación es una relación.
Si tienes más dudas, hazme saber. Saludos
Tienes un correo o forma de contactarte
Puedes dejar un mensaje en nuestra página de Facebook.
https://facebook.com/cablenaranja