3

Estoy haciendo un proyecto en java con formularios los cuales me tienen que guardar eliminar y modificar para esto creo una clase que es la clase conexion una clase distinta para cada uno de los formularios en la cual van los distintos métodos de guardar modificar y eliminar y los formularios.

pero la función guardar no me funciona y no se por que

Clase Guardar

package clasesAdministrador;

import Conexion.conexion1;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.table.DefaultTableModel;
import formAdministrador.usuarios1ad;
import javax.swing.JOptionPane;

public class usuario1ad {
Conexion.conexion1 conn=new Conexion.conexion1();
public PreparedStatement sql;
public ResultSet datos, rs;
DefaultTableModel tabla = new DefaultTableModel();
Statement sent;

     public void Guardar(int num_usu, String nom_usu, String con1,String tipus)
{
    try
    {
    conn.Conectar();
    sql=conn.con.prepareStatement("insert into usuario (id_usu,nom_usu,con_usu,tip_usu) values ("+num_usu+",'"+nom_usu+"','"+con1+"','"+tipus+"')");
    sql.execute();
    conn.cerrar();
    }
    catch(SQLException ex)
    {
      System.out.println("ERROR AL GUARDAR...");
    }
} // FIN METODO GUARDAR  
} // FIN DE TODO

Clase Conexion

package Conexion;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class conexion1{
public PreparedStatement sql; 
public ResultSet datos;   
public Connection con=null;  

  public void Conectar(){
       String db="jdbc:mysql://localhost:3306/sena";
       String usuario="root";
       String password="salomeaa";
       try
       {
           String controlador="com.mysql.jdbc.Driver";
           System.out.println("CONEXION CON BASE DE DATOS...." +db);
           Class.forName(controlador);
           con=DriverManager.getConnection(db,usuario,password);
           System.out.println("CONEXION EXITOSA");
       }
       catch(Exception ex)
       {
        System.out.println("Error "+ex.getMessage());
       } 
}
public void cerrar(){

if(con==null)
{
try
{ con.close();}
catch(Exception ex)
 { }
}

}

}

Form Java

public class usuarios1ad extends javax.swing.JFrame {
usuario1ad gg = new usuario1ad();

// demaciado codigo para ponerlo todo (botones y demas)

public void GuardarUsuario(){
this.tipUsu();
gg.Guardar(Integer.parseInt(num_usu.getText()),nom_usu.getText(),con1.getText(),tipus);
//  JOptionPane.showMessageDialog(null, "DATOS ALMACENADOS CORRECTAMENTE", "GUARDAR", JOptionPane.INFORMATION_MESSAGE);
}

num_usu : id del usuario

nom_usu : nombre de usuauario

con1 : contraseña del usuario

tipus : tipo de usuario (roles para permisos dentro del programa)

BASE DE DATOS (La tabla)

introducir la descripción de la imagen aquí


esto es lo que me sale al tratar de guardar información introducir la descripción de la imagen aquí

este es el formulario en el que guardo la informacion introducir la descripción de la imagen aquí

el combo lo guardo asi

public void tipUsu(){
if(tip_usu1.getSelectedItem()=="...")
{
JOptionPane.showMessageDialog(null, "Ingrese el tipo de usuario");
}
else if(tip_usu1.getSelectedItem()=="usuario")
{
tipus="usuario";
}
else if(tip_usu1.getSelectedItem()=="administrador")
{
tipus="administrador";
}

entonces el combo se llama "tip_usu1" pero solo es para saber que tipo de usuario es por que lo que mando a la base de datos es "tipus"


y para las contraseñas para validarlas dos

private boolean isPasswordCorrect(char[] con1,char[] con2){
boolean valor = true;
int puntero = 0;
if (con1.length != con2.length){
valor = false;
}  
else{
while((valor)&&(puntero < con1.length)){
if (con1[puntero] != con2[puntero]){
valor = false;
}
puntero++;
}
}
return valor;
}

los dos campos de contraseña solo es para confirmar que no este mal al ingresarla la que mando a la base de datos en "con1" "con2" solo es para compararla y ver que sena la misma

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • 2
    Puedes dar una mayor explicación de que es lo que sucede o que error te marca y en que línea. – Darth Vader Dec 30 '16 at 17:24
  • 2
    puedes decir el error que muestra, y si la conexión la hace correctamente, o simplemente se ejecuta bien pero no se refleja la inserción? – Alberto Rojas Dec 30 '16 at 17:29

5 Answers5

4

Recibes un NullPointerException porque con está a null en la sentencia siguiente:

sql=conn.con.prepareStatement("insert into usuario (id_usu,nom_usu,con_usu,tip_usu) values ("+num_usu+",'"+nom_usu+"','"+con1+"','"+tipus+"')");

Y la razón porque con está a null es porque ocurrió una excepción en el método Conectar(), por lo que nunca se asignó la variable con.

Puedes notar esto porque recibistes el siguiente mensaje proveniente del método Conectar():

Error com.mysql.jdbc.Driver

Trsitemente, ese mensaje está incompleto. Pero es sumamente probable que si hubieras permitido que la excepción original se viera con todos los detalles, hubieras notado que en realidad estás recibiendo:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

De modo que el problema de base es que no encuentra esa clase. ¿Has incluído en tu proyecto el driver JDBC para MySQL?


Cuidado con el manejo de excepciones

El hecho de que el problema real quede oscurecido por el NullPounterException que recibistes debería servir de lección que no es buena práctica atrapar excepciones, imprimir detalles a medias, e intentar continuar el programa. Y noto que haces esto en otros lugares de tu programa también. Esto no es una buena idea y dificulta muchísimo poder diagnosticar los problemas correctamente.

En este caso, lo correcto hubiera sido de no atrapar la excepción en absoluto (quitar el try-catch y permitir que la excepción suba al main()). Tristemente, en Java, esto implica que debes modificar la definición de los métodos para incluir la claúsula throws XXXException donde sea necesario.

Si no te agrada hacer esto, una alternativa aceptable es de atrapar la excepción y volver a lanzarla dentro de un RuntimeException:

try {
    // ...
} catch (Exception ex) {
    throw new RuntimeException(ex);
}

Sin importar lo que escojas, no intentes atrapar y esconder excepciones que en realidad no puedes manejar.


Sugerencias adicionales para evitar mas problemas

  1. Evita las variables globales cuando no son necesarios. Referencia útil: ¿Por qué es considerado una mala práctica utilizar variables globales?.
  2. No concatenes valores directamente en tu cadena SQL. Aprende a usar parámetros usando la clase PreparedStatement.
sstan
  • 16,591
  • 2
  • 21
  • 45
3

En una de estas dos líneas :

       Class.forName(controlador);
       con=DriverManager.getConnection(db,usuario,password);

Se produce una excepción. La cual ignoras, imprimiendo solo el mensaje de la excepción, aquí :

   catch(Exception ex)
   {
    System.out.println("Error "+ex.getMessage());
   } 

El método Guardar necesita una CONEXION EXITOSA, la cual no se ha producido.

Como primer paso para diagnosticar el error cambia (o añade) el println anterior por :

    ex.printStackTrace();

Esto te permitirá saber en qué línea exáctamente se produce el error. Así sabrás si el problema es que el class loader no encuentra el driver JDBC o si el problema es que falla la conexión.

O, incluso mejor, haz un tratamiento apropiado de la excepción en lugar de ignorarla.

Anonymous Coward
  • 6,185
  • 4
  • 31
  • 58
0

El código se puede optimizar bastante, pero vamos a lo que vamos, lo primero es que has utilizado mal el PreparedStatement. El prepared statement se utiliza porque mejora la seguridad a la hora de hacer consultas sobre la base de datos, así que no le tienes que pasar así los valores, sería algo así:

conn.Conectar();
sql=conn.con.prepareStatement("insert into usuario(id_usu,nom_usu,con_usu,tip_usu) values(?,?,?,?)");
sql.setInt(1,id_usu);
sql.setString(2,nom_usu);
sql.setString(3,con_usu);
sql.setString(4,tip_usu);
sql.executeUpdate();
conn.cerrar();

De todos modos el error te lo da a la hora de conectarte a la base de datos, deberías debuggear o bien poner algún println para que te avise en qué lugar falla.

Mariano
  • 23,777
  • 20
  • 70
  • 102
0

Te voy a poder diferentes soluciones espero una te ayude.

1.- Puedes pegar el archivo mysql-connector-java.jar Descargar del controlador en la configuración de Java en lugar de añadir a cada proyecto que se crea. Pegarlo en C:\Program Files\Java\jre7\lib\ext o donde quieras que haya instalado java.

2.- Descargar el archivo mysql-connector-java.jar Descargar y pegar en la carpeta dentro de tu proyecto ../WEB-INF/lib ten en cuenta que alguna carpeta WEB-INF veces no contiene carpeta de la lib, en ese momento debes crearla manualmente la carpeta lib y el conector de MySQL debes pegarlo en esa carpeta y esto debe funcionar.

3.- Inserta esta línea: DriverManager.registerDriver(new com.mysql.jdbc.Driver()); antes de recibir la conexión JDBC.

SoftMolina
  • 1,706
  • 2
  • 9
  • 19
-3

CLASE GUARDAR:

package clasesAdministrador;

import Conexion.Conexion1;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.table.DefaultTableModel;
import formAdministrador.usuarios1ad;
import javax.swing.JOptionPane;

public class usuario1ad {
    //INICIALIZAR EL OBJETO VACÍO
    Conexion1 conn = new Conexion();
    public PreparedStatement sql;
    public ResultSet datos, rs;
    DefaultTableModel tabla = new DefaultTableModel();
    Statement sent;

    public void Guardar(int num_usu, String nom_usu, String con1,String tipus{
        try{
            conn.Conectar();
            sql=conn.con.prepareStatement("insert into usuario   (id_usu,nom_usu,con_usu,tip_usu) values ("+num_usu+",'"+nom_usu+"','"+con1+"','"+tipus+"')");
            sql.execute();
            conn.cerrar();
        }catch(SQLException ex){
          System.out.println("ERROR AL GUARDAR...");
        }
    } // FIN METODO GUARDAR  
} // FIN DE TODO

CLASE CONEXIÓN

package Conexion;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Conexion1{
    public PreparedStatement sql; 
    public ResultSet datos;   
    public Connection con=null;  

    //CREAR CONSTRUCTOR VACÍO
    public void Conexion1(){
    }

    public void Conectar(){
       String db="jdbc:mysql://localhost:3306/sena";
       String usuario="root";
       String password="salomeaa";
       try{
           String controlador="com.mysql.jdbc.Driver";
           System.out.println("CONEXION CON BASE DE DATOS...." +db);
           Class.forName(controlador);
           con=DriverManager.getConnection(db,usuario,password);
           System.out.println("CONEXION EXITOSA");
       }catch(Exception ex){
           System.out.println("Error "+ex.getMessage());
       } 
    }

    public void cerrar(){
        if(con==null){
            try{ 
               con.close();
            }catch(Exception ex){
            }
        }
    }
}

Exactamente en está linea :

Conexion.conexion1 conn=new Conexion.conexion1();

Al hacer llamado a conexion1() ya es necesario que crees el constructor vacío para que la clase pueda reconocer que se está creando un nuevo objeto.

Jorgesys
  • 103,630
  • 13
  • 52
  • 124
Dasaaf
  • 1
  • ¡Hola Dasaaf! ¿Puedes acompañar el código de alguna explicación? Si no, pierde su utilidad. Por otro lado, el constructor vacío no es válido y de todas maneras no entiendo para que serviría. – sstan Dec 31 '16 at 04:28
  • Ok, es cierto lo de la explicación, exactamente en está linea `Conexion.conexion1 conn=new Conexion.conexion1();`, al hacer llamado a **conexion1()** ya es necesario que crees el constructor vació para que la clase pueda reconocer que se está creando un nuevo objeto, por otro lado, si sería bueno que por favor coloques exactamente el error que aparece. – Dasaaf Dec 31 '16 at 04:39
  • No, en este caso, ese no puede ser el problema, ya que toda clase de por sí ya tiene un constructor vacío por defecto. De modo que en este caso, no hay necesidad de definir una explícitamente, ya existe de forma implícita. De todas maneras, como te menciono, la sintaxis del constructor vacío en el código que tienes no es correcta. No debería incluir el `void`. – sstan Dec 31 '16 at 04:43