Классы довода "против" Metodo Guardar en Java

Довод "против" Estoy haciendo un proyecto en java formularios Лос cuales я связь tienen que guardar eliminar y modificar para esto creo una clase que es la clase uno una clase distinta para cada фургон de los formularios en la cual los distintos métodos de guardar modificar y eliminar y los formularios.

pero la función guardar не я funciona y никакой 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)
 { }
}

}

}

Java формы

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

//demaciado codigo параграф ponerlo todo (botones y демы)

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: идентификатор del usuario

nom_usu: nombre de usuauario

con1: contraseña del usuario

tipus: tipo de usuario (роли para permisos dentro del programa)

BASE DE DATOS (Таблица La)

introducir la descripción de la imagen aquí


продажа esto es lo que me 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 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";
}

соло "tip_usu1" pero ламы entonces el combo se es сабля параграфа que tipo de usuario es por que lo que mando а-ля основывает 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;
}

Лос DOS Кампус de contraseña соло es para confirmar que no este mal al ingresarla la que mando а-ля основывает соло es para compararla y ver que sena la misma de datos en "con1" "con2"

3
задан 05.01.2017, 10:01
0 ответов

Ты получаешь один NullPointerException потому что con будь в null в следующем решении:

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

И разум потому что con будь в null он, потому что произошло исключение в методе Conectar(), которым никогда не была распределена переменная con.

Ты можешь замечать это, потому что recibistes следующее сообщение, полученное от метода Conectar():

Ошибка com.mysql.jdbc. Драйвер

Trsitemente, это сообщение неполное. Но крайне вероятно, что, если ты позволил, что первоначальное исключение было видно всеми деталями, ты ощутился, что ты в действительности получаешь:

java.lang. ClassNotFoundException: com.mysql.jdbc. Драйвер

Так что базовая проблема состоит в том, что он не находит этот класс. Ты существуешь включая в твоем проекте драйвер JDBC для MySQL?


Забота с управлением исключений

Тот факт, что реальная проблема осталась стемневшей из-за NullPounterException что recibistes было бы должно стоить урока, который не хорошая практика, ловить исключения, печатать детали пополам, и пробовать продолжать программу. И я ощущаюсь, что ты это делаешь в других местах твоей программы также. Это не хорошая идея и затрудняет очень большая власть ставить диагноз проблемам правильно.

В этом случае, правильное не состояло в том, чтобы не ловить исключение абсолютно (прекращаться try-catch и позволять, что исключение поднялось в main()). Грустно, в Java, это подразумевает, что ты должен изменять определение методов, чтобы включать claúsula throws XXXException где он был необходим.

Если тебе не хочется делать это, приемлемая альтернатива состоит в том, чтобы ловить исключение и вновь бросать ее внутри одного RuntimeException:

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

Не импортируя того, что ты выбираешь, не пробуешь ловить и прятать исключения, которыми ты в действительности не можешь манипулировать.


Добавочные подсказки, чтобы предотвращать больше проблем

  1. Предотврати глобальные переменные, когда они не необходимы. Полезная ссылка: Почему это считается плохой практикой использовать глобальные переменные?.
  2. Не прилагай стоимость прямо в твоей цепи SQL. Научись использовать параметры используя класс PreparedStatement.
4
ответ дан 03.12.2019, 17:55

В одной из этих двух линий:

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

Случается исключение. Которую ты игнорируешь, печатая только сообщение исключения, здесь:

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

Метод Guardar нуждайся в УСПЕШНОЙ СВЯЗИ, которая не случилась.

Как первый шаг, чтобы ставить диагноз ошибке, меняет (или он добавляет) предыдущий println из-за:

    ex.printStackTrace();

Он позволит тебе знать это в какой линии exáctamente случается ошибка. Так ты будешь знать, состоит ли проблема в том, что class loader не находит драйвер JDBC, или если проблему состоит в том, что он бьет козырем связь.

Или, даже лучше, сделай соответствующую обработку исключения вместо того, чтобы игнорировать ее.

3
ответ дан 03.12.2019, 17:55

Код могут оптимизировать достаточно, но мы идем, в которое мы идем, первое состоит в том, что ты использовал плохо PreparedStatement. Предстена statement используется, потому что он улучшает безопасность во время делания консультаций по поводу базы данных, так что ты не должен перемещать его так стоимость, оно было бы нечто похожим:

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();

В любом случае ошибка дает это тебе во время присоединения в базу данных, ты был бы должен debuggear или помещать какой-то println для того, чтобы он предупредил тебя в каком месте он не удается.

0
ответ дан 03.12.2019, 17:55
  • 1
    Тогда, segú n то, что está s говоря, ¿ эта не serí в ответ на вопрос? –  05.01.2017, 12:45

Я ты смогу различные решения буду надеяться, что одна помогает тебе.

1. - Ты можешь прикреплять файл mysql-connector-java.jar Загружаться драйвера в конфигурацию Java вместо того, чтобы добавлять к каждому проекту, что он создается. Прикреплять это в C:\Program Files\Java\jre7\lib\ext, или где ты хотел, чтобы он установил java.

2. - Загружать файл mysql-connector-java.jar Загружаться и прикреплять в папке внутри твоего проекта./WEB-INF/lib, имей в виду, что какая-то папка WEB-INF разы не содержит папку lib, в этом моменте ты должен создавать вручную папку lib и соединитель MySQL ты должен прикреплять это в этой папке и это должно функционировать.

3. - Вставленная эта линия: DriverManager.registerDriver(new com.mysql.jdbc.Driver()); перед тем, как получать связь JDBC.

0
ответ дан 03.12.2019, 17:55

КЛАСС СОХРАНЯТЬ:

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

КЛАСС СВЯЗЬ

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){
            }
        }
    }
}

Точно в está линия:

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

Сделав названный в conexion1() уже необходимо, чтобы ты создал пустой строитель для того, чтобы класс смог допускать, что создан новый объект.

-3
ответ дан 03.12.2019, 17:55
  • 1
    ¡ Привет Dasaaf! ¿ Ты можешь acompañ ar có я говорю какой-то explicació n? Если не, он теряет Вашу утилиту. С другой стороны, строитель vací или он не vá lido и в любом случае я не понимаю для того, чтобы servirí в. –  31.12.2016, 06:28
  • 2
    Ok, верный это explicació n, точно в está линия Conexion.conexion1 conn=new Conexion.conexion1();, сделав названными conexion1, () уже необходим, чтобы ты создал строитель vació для того, чтобы класс смог распознавать, что está создавая новый объект, с другой стороны, если serí в хороший, что ты пожалуйста разместил точно ошибку, которая появляется. –  31.12.2016, 06:39
  • 3
    Нет, в этом случае, это не может быть проблема, так как все виды из-за sí уже у него есть строитель vací или по умолчанию. Так что в этом случае, нет необходимости определять explí citamente, уже существуй формы implí назначь встречу. В любом случае, поскольку я упоминаю о тебе, синтаксис строителя vací или в có я говорю, что ты имеешь, она не правильна. Не deberí чтобы включать void. –  31.12.2016, 06:43

Теги

Похожие вопросы