Foro sobre Java SE > Insertar una fecha de JTextField a Tabla MySql
Lo que hice fue parsear el java.util.Date a java.sql.Date y parece que ya funciona. Pero ahora me tira un error.
En mi tabla tengo:
1.- ID autoincrement PRIMARY KEY
2.- PrimerApellido
3.- SegundoApellido
4.- Nombre
5.- TipoUsuario
6.- FechaNacimiento
El código que uso para insertar es el siguiente:
try {
Connection conexion = (Connection) Conexion.getConnection();
String sentencia = "insert into empleado values(?,?,?,?,?)";
PreparedStatement prepararConsulta = conexion.prepareStatement(sentencia);
prepararConsulta.setString(1,usuario.getPrimerApellido());
prepararConsulta.setString(2,usuario.getSegundoApellido());
prepararConsulta.setString(3,usuario.getNombre());
prepararConsulta.setString(4,usuario.getTipoUsuario());
prepararConsulta.setDate(5,fecha2);
prepararConsulta.executeUpdate();
prepararConsulta.close();
conexion.close();
JOptionPane.showMessageDialog(null,"Datos ingresados satisfactoriamente.");
}
catch(SQLException e) {
JOptionPane.showMessageDialog(null,e.getMessage().toString());
}
Y cuando le doy a registrar, SQL me dice que los valores que se van a insertar no coincide con la cuenta de la tabla.
Si coloco de 2 al 6, me tira un error IndexOutOfBounds de SQL.
El problema puede ser la Primary Key ID? se supone que es autoincrementable, por lo que no es necesario ingresar nada.
Si así fuera, ¿como solucionarlo?
PD: ¿Algunos consejos sobre mejorar mi código?
Pojo Usuario:
public class Usuario {
private String nombre;
private String primerApellido;
private String segundoApellido;
private String tipoUsuario;
private String fechaNacimiento;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getPrimerApellido() {
return primerApellido;
}
public void setPrimerApellido(String primerApellido) {
this.primerApellido = primerApellido;
}
public String getSegundoApellido() {
return segundoApellido;
}
public void setSegundoApellido(String segundoApellido) {
this.segundoApellido = segundoApellido;
}
public String getTipoUsuario() {
return tipoUsuario;
}
public void setTipoUsuario(String tipoUsuario) {
this.tipoUsuario = tipoUsuario;
}
public String getFechaNacimiento() {
return fechaNacimiento;
}
public void setFechaNacimiento(String fechaNacimiento) {
this.fechaNacimiento = fechaNacimiento;
}
}
Controller:
public class Controller implements ActionListener {
private Formulario vista;
private RegistrarUsuario modelo;
public Controller(Formulario vista, RegistrarUsuario modelo)
{
this.vista = vista;
this.modelo = modelo;
}
@Override
public void actionPerformed(ActionEvent evento)
{
if(evento.getSource() == vista.btnRegistrar)
{
Usuario usuario = new Usuario();
String nombre = vista.txtNombre.getText();
String primerApellido = vista.txtPrimerApellido.getText();
String segundoApellido = vista.txtSegundoApellido.getText();
String tipoUsuario = vista.cboTipoUsuario.getSelectedItem().toString();
String fechaNacimiento = vista.txtFechaNacimiento.getText();
usuario.setNombre(nombre);
usuario.setPrimerApellido(primerApellido);
usuario.setSegundoApellido(segundoApellido);
usuario.setTipoUsuario(tipoUsuario);
usuario.setFechaNacimiento(fechaNacimiento);
try {
modelo.registrarUsuario(usuario);
} catch (SQLException ex) {
Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex);
}
}
else if (evento.getSource() == vista.btnNuevo)
{
vista.limpiar();
}
else if (evento.getSource() == vista.btnSalir)
{
System.exit(0);
}
}
}
RegistrarUsuario:
package modelo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import pojos.Usuario;
public class RegistrarUsuario {
List <Usuario> datosRecuperados = new ArrayList<>();
public void registrarUsuario(Usuario usuario) throws SQLException
{
DateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date fecha = null;
java.sql.Date fecha2 = null;
try {
fecha = ft.parse(usuario.getFechaNacimiento());
fecha2 = new java.sql.Date(fecha.getTime());
}
catch(ParseException ex) {
JOptionPane.showMessageDialog(null,"Debes ingresar una fecha correcta.");
}
try {
Connection conexion = (Connection) Conexion.getConnection();
String sentencia = "insert into empleado values(?,?,?,?,?)";
PreparedStatement prepararConsulta = conexion.prepareStatement(sentencia);
prepararConsulta.setString(1,usuario.getPrimerApellido());
prepararConsulta.setString(2,usuario.getSegundoApellido());
prepararConsulta.setString(3,usuario.getNombre());
prepararConsulta.setString(4,usuario.getTipoUsuario());
prepararConsulta.setDate(5,fecha2);
prepararConsulta.executeUpdate();
prepararConsulta.close();
conexion.close();
JOptionPane.showMessageDialog(null,"Datos ingresados satisfactoriamente.");
}
catch(SQLException e) {
JOptionPane.showMessageDialog(null,e.getMessage().toString());
}
}
public List<Usuario> recuperarDatos(Usuario usuario)
{
return datosRecuperados;
}
}
Conexion:
public class Conexion {
public static Connection getConnection() {
Connection conexion;
try
{
Class.forName("com.mysql.jdbc.Driver");
String servidor = "jdbc:mysql://localhost/empleados";
String usuarioDB="root";
String passwordDB="";
conexion= DriverManager.getConnection(servidor,usuarioDB,passwordDB);
}
catch(ClassNotFoundException | SQLException ex)
{
JOptionPane.showMessageDialog(null,ex.getMessage());
conexion=null;
}
return conexion;
}
Formulario:
package vista;
import controlador.Controller;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
public class Formulario implements apoyo{
public JLabel lblNombre, lblPrimerApellido, lblSegundoApellido;
public JLabel lblTipoUsuario, lblFechaNacimiento;
public JTextField txtNombre, txtPrimerApellido, txtSegundoApellido, txtFechaNacimiento;
public JComboBox cboTipoUsuario;
public JButton btnNuevo, btnRegistrar, btnSalir;
private JFrame marco;
private String[] tipos = {"Administrador","Vendedor","Consultor"};
public Formulario()
{
marco = new JFrame();
marco.setLayout(new FlowLayout(FlowLayout.CENTER,0,0));
marco.add(getTitle());
marco.add(getFields());
marco.add(getButtonsPanel(),BorderLayout.SOUTH);
}
private void config()
{
marco.setVisible(true);
marco.setResizable(false);
marco.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
marco.setSize(550,550);
}
private JPanel getTitle(){
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout(FlowLayout.CENTER));
panel.setBorder(new EmptyBorder(40,0,30,0));
JLabel lbl = new JLabel("REGISTRO DE NUEVOS USUARIOS");
lbl.setForeground(Color.BLUE);
lbl.setFont(new Font("",Font.BOLD,28));
panel.add(lbl);
return panel;
}
private JPanel getFields()
{
JPanel panelfields = new JPanel();
panelfields.setSize(new Dimension(500,300));
panelfields.setLayout(new GridLayout(5,2,70,20));
panelfields.setBorder(new EmptyBorder(40,40,40,40));
lblNombre = new JLabel("NOMBRE:");
lblNombre.setFont(new Font("Segoei",0,11));
lblPrimerApellido = new JLabel("PRIMER APELLIDO:");
lblPrimerApellido.setFont(new Font("",0,11));
lblSegundoApellido = new JLabel("SEGUNDO APELLIDO:");
lblSegundoApellido.setFont(new Font("",0,11));
lblTipoUsuario = new JLabel("TIPO DE USUARIO:");
lblTipoUsuario.setFont(new Font("",0,11));
lblFechaNacimiento = new JLabel("FECHA DE NACIMIENTO:");
lblFechaNacimiento.setFont(new Font("",0,11));
txtNombre = new JTextField("",20);
txtNombre.setPreferredSize(new Dimension(100,25));
txtPrimerApellido = new JTextField("",20);
txtSegundoApellido = new JTextField("",20);
txtFechaNacimiento = new JTextField("",20);
cboTipoUsuario = new JComboBox(tipos);
panelfields.add(lblNombre);
panelfields.add(txtNombre);
panelfields.add(lblPrimerApellido);
panelfields.add(txtPrimerApellido);
panelfields.add(lblSegundoApellido);
panelfields.add(txtSegundoApellido);
panelfields.add(lblTipoUsuario);
panelfields.add(cboTipoUsuario);
panelfields.add(lblFechaNacimiento);
panelfields.add(txtFechaNacimiento);
return panelfields;
}
private JPanel getButtonsPanel()
{
JPanel panelBotones = new JPanel();
panelBotones.setLayout(new FlowLayout(FlowLayout.LEFT,50,0));
panelBotones.setBorder(new EmptyBorder(50,40,0,50));
btnNuevo = new JButton("Nuevo");
btnNuevo.setPreferredSize(new Dimension(100,40));
btnRegistrar = new JButton("Registrar");
btnRegistrar.setPreferredSize(new Dimension(100,40));
btnSalir = new JButton("Salir");
btnSalir.setPreferredSize(new Dimension(100,40));
panelBotones.add(btnNuevo);
panelBotones.add(btnRegistrar);
panelBotones.add(btnSalir);
return panelBotones;
}
@Override
public void setControlador(Controller controlador)
{
btnNuevo.addActionListener(controlador);
btnRegistrar.addActionListener(controlador);
btnSalir.addActionListener(controlador);
}
@Override
public void limpiar() {
txtNombre.setText("");
txtPrimerApellido.setText("");
txtSegundoApellido.setText("");
cboTipoUsuario.setSelectedIndex(0);
txtFechaNacimiento.setText("");
txtNombre.requestFocus();
}
@Override
public void arrancar()
{
config();
}
}
Main:
package vista;
import controlador.Controller;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import modelo.RegistrarUsuario;
public class Main {
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run()
{
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName() );
}
catch(ClassNotFoundException | IllegalAccessException | InstantiationException | UnsupportedLookAndFeelException e){
JOptionPane.showMessageDialog(null,e.toString());
}
Formulario vista = new Formulario();
RegistrarUsuario modelo = new RegistrarUsuario();
Controller controlador = new Controller(vista, modelo);
vista.setControlador(controlador);
vista.arrancar();
}
});
}
}
Gracias.
Guenas.
Cambia la sentencia insert.
Usa esta forma:
insert into tabla (columnas) values (valores)
Un saludo
Buenas,
La mejor manera de depurar esto es que pongas, despues de la sentencia:
prepararConsulta.setDate(5,fecha2);
Esto:
JOptionPane.showMessageDialog(null,prepararConsulta);
Eso imprimira la consulta en una ventana.
Toma la consulta y ejecutala en la base de datos. Asi sabras porque no esta funcionando.
Tambien es interesante que en el catch imprimas en consola toda la traza del error.
e.printStackTrace();
Ah, y el .close() tiene que ir en un finally!!
Un saludo
Muchas gracias UnoPorAhí!. Lo que hice fue colocar igualmente in SetInt y le paso 0, verifico y si incrementa el ID y respeta el orden normalmente.
El close debe ir en un finally cierto? Osea que declaro mi objeto Connection fuera del try -catch?
Connection conexion = null;
Lo hice y luego cerré la conexión en el finally. El método registrarUsuario quedó así:
public void registrarUsuario(Usuario usuario) throws SQLException
{
Connection conexion = null;
DateFormat ft = new SimpleDateFormat("yyyy-MM-dd"); // crea un estilo de formato anio - mes - dia
java.util.Date fecha = null; // crea objetos tipo util.Date y sql.Date
java.sql.Date fecha2 = null;
try {
fecha = ft.parse(usuario.getFechaNacimiento()); // convierte el string en util.Date
fecha2 = new java.sql.Date(fecha.getTime()); // convierte el util.Date en sql.Date
}
catch(ParseException ex) {
JOptionPane.showMessageDialog(null,"Debes ingresar una fecha correcta.");
}
try {
conexion = (Connection) Conexion.getConnection(); // abrimos la conexion
// crea una sentencia previa para mandarla a una declaracion preparada (PreparedStatement)
String sentencia = "insert into empleado values(?,?,?,?,?,?)";
PreparedStatement prepararConsulta = conexion.prepareStatement(sentencia); // prepara la declaracion con la sentencia previa
prepararConsulta.setInt(1, 0); // pasa los valores que se van a insertar en la tabla
prepararConsulta.setString(2,usuario.getPrimerApellido());
prepararConsulta.setString(3,usuario.getSegundoApellido());
prepararConsulta.setString(4,usuario.getNombre());
prepararConsulta.setString(5,usuario.getTipoUsuario());
prepararConsulta.setDate(6,fecha2);
prepararConsulta.executeUpdate(); // ejecuta la declaracion
prepararConsulta.close(); // cierra la conexion de la declaracioN
JOptionPane.showMessageDialog(null,"Datos ingresados satisfactoriamente.");
}
catch(SQLException e) {
JOptionPane.showMessageDialog(null,e.getMessage().toString());
}
catch(NullPointerException np){
JOptionPane.showMessageDialog(null,"No se ha podido establecer la conexion.");
}
finally{
conexion.close();
}
Pero Netbeans me lanza warnings, quizás estoy haciendo algo un poco mal.
En esta linea me dice : Converty to try-catch resources
PreparedStatement prepararConsulta = conexion.prepareStatement(sentencia);
Y en el finaly: Deferencing posible NullPointer.
conexion.close();
Supongo que tengo que hacerle caso a San Netbeans no? Que significan esos warnings?
Gracias.
Buenas,
No me ha quedado claro, la query ya te funciona no?
Lo que te esta sugiriendo NetBeans es que utilices la nueva capacidad de Java 7 para gestionar y cerrar automaticamente los recursos sin necesidad de finally
http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
En tu caso entonces podrias hacer asi el try:
try (Connection conexion = (Connection) Conexion.getConnection();
PreparedStatement prepararConsulta = conexion.prepareStatement(sentencia);) {
....
}
Un saludo
Oh, entiendo :)
Sip ya funciona correctamente la query, solo le agrege un setInt y le pase 0 para que haga referencia al ID.
Ahora, la fecha necesariamente tiene que ser formato yyyy-mm-dd. Mejor coloco un método para verificar que la cadena tenga ese formato antes de agregarlo a la tabla no?
Por que si ingreso la fecha en un formato diferente, se ingresa, pero con otros numeros :S
Muchas gracias :)
El formato de la fecha tendra que ser aquel en el que esta el String que devuelve getFechaNacimiento.
Un saludo
Que es "apoyo"?
Quisiera saber como se hace para insertar una fecha en una tabla con columna tipo Date, ya que no logro hacerlo.
String strFecha = usuario.getFechaNacimiento();
Como paso eso a una columna tipo Date?
Muchas gracias.