Dificuldade de inserir informações no banco

26 respostas
Jorge_Eduardo

Boa tarde pessoal, antes de mais nada gostaria de dizer que não sei muito de Java e estou desenvolvendo um programa simples de cadastro de clientes para praticar. Utilizo um pouco de MVC e separo por pacotes, model, view e DAO.

O meu problema está na hora de inserir os dados no banco, a única coisa que está sendo enviada é o ID do cliente, já rodei o código todo aqui e não consegui enxergar o erro.

Aqui está a parte do DAO em que eu salvo o cliente no banco:

public void salvarCliente(Cliente cliente)

{

String sql = INSERT INTO cliente (CLI_ID, CLI_NOME, CLI_CPF, CLI_NASC, CLI_ENDERECO, CLI_EMAIL, CLI_TEL, CLI_BAIRRO, CLI_CEP, CLI_ESTADO)

+ VALUES (?,?,?,?,?,?,?,?,?,?);
Connection conn = null;
	PreparedStatement pstm = null;
	
	try 
	{
		//prepara a conexão com o BD
		conn = Conexao.getConexaoMySQL();
		
		//cria um PreparedStatment, classe usada para executar a query
		pstm = conn.prepareStatement(sql);
		
		//adciona o valor ao 1º parametro
		pstm.setInt(1,cliente.getCLI_ID());
		//adciona o valor ao 2º parametro
		pstm.setString(2, cliente.getCLI_NOME());
		//adciona o valor ao 3º parametro
		pstm.setString(3,cliente.getCLI_CPF());
		//adciona o valor ao 4º parametro
		pstm.setDate(4, cliente.getCLI_NASC());
		//adciona o valor ao 5º parametro
		pstm.setString(5,cliente.getCLI_ENDERECO());
		//adciona o valor ao 6º parametro
		pstm.setString(6,cliente.getCLI_EMAIL());
		//adciona o valor ao 7º parametro
		pstm.setString(7,cliente.getCLI_TEL());
		//adciona o valor ao 8º parametro
		pstm.setString(8,cliente.getCLI_BAIRRO());
		//adciona o valor ao 9º parametro
		pstm.setString(9,cliente.getCLI_CEP());
		//adciona o valor ao 10º parametro
		pstm.setString(10,cliente.getCLI_ESTADO());
		
		//executa a query
		pstm.execute();
	} catch (Exception e) {
		e.printStackTrace();
	}finally {
		try {
				if(pstm != null)
				{
					pstm.close();
				}
				
				if(conn != null)
				{
					conn.close();
				}
			}catch (Exception e){
				e.printStackTrace();
			}
	}	
}

Aqui está a parte do botão no JFrame que chama o metodo acima:
public void actionPerformed(ActionEvent e) {

//capturando o ID
			String ID = txtID.getText();
			int id = Integer.parseInt(ID);
			cliente.setCLI_ID(id);
			
			//capturando o nome
			cliente.setCLI_NOME(txtNome.getText());
			
			
			//capturando o CPF/CNPJ
			cliente.setCLI_CPF(txtCPF.getText());
			
			//capturando o telefone
			cliente.setCLI_TEL(txtTel.getText());
			
			//capturando o email
			cliente.setCLI_EMAIL(txtEmail.getText());
			
			//capturando o endereço
			cliente.setCLI_ENDERECO(txtEndereco.getText());
			
			//capturando o bairro
			cliente.setCLI_BAIRRO(txtBairro.getText());
			
			//capturando o cep
			cliente.setCLI_CEP(txtCEP.getText());
			
			//capturando a escolha do combobox
			cliente.setCLI_ESTADO(String.valueOf(cbEstado.getSelectedItem()));
			
			//capturando a data de nascimento
			java.util.Date invoiceDate = null;
			try
			{
				invoiceDate = formatDate.parse(txtDataNasc.getText().trim());
			}catch(Exception e4)
			{
				e4.printStackTrace();
			}
			java.sql.Date sqlDate = new java.sql.Date(invoiceDate.getTime());
			cliente.setCLI_NASC(sqlDate);
			//fim da captura de data de nascimento
			
			if ((txtID.getText().isEmpty()) || (txtNome.getText().isEmpty()) || (txtCPF.getText().isEmpty()) || (txtTel.getText().isEmpty()) || (txtEmail.getText().isEmpty()) || (txtEndereco.getText().isEmpty()) || (txtBairro.getText().isEmpty()) || (txtCEP.getText().isEmpty()))
			{
				JOptionPane.showMessageDialog(null,"<html>Os campos com * <strong>não</strong> podem ficar vazios!</html>");
			}
			else
			{
				dao.salvarCliente(cliente);
				JOptionPane.showMessageDialog(null, "Cliente " + txtNome.getText() +" inserido com sucesso!" );
				limparCampos();
			}
					
					
		}

Peço desculpas caso a formatação não esteja (e sei que não esta :sweat_smile: ) do jeito certo, sou novo no forum também.

Caso esteja faltando alguma parte do código, eu posto também.

Obrigado desde já.

26 Respostas

Emerzoom

Boa tarde Jorge_Eduardo,

Tente lançar os valores dos campos no console pra ver se eles estão chegando no código interno, depois, veja se não está sendo lançada nenhuma Exception durante essa operação.

Poste aqui os erros aparentes no console, caso hajam.

Rodrigo_Void

Posta a classe onde vc cria a conexao e a Cliente

Jorge_Eduardo

Vou tentar fazer do jeito que você falou, caso apareça algum erro posto aqui.

Jorge_Eduardo

Classe Conexão:

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

public class Conexao {

public static String status = "Não conectou...";

public static java.sql.Connection getConexaoMySQL()
{
	Connection connection = null;
	
	try
	{
		//Carregando o JDBC Driver padrão
		String driverName = "com.mysql.jdbc.Driver";
		
		Class.forName(driverName);
		
		//configurando a conexão com o BD
		
		String serverName = "localhost:3306";  //caminho do servidor do BD
		String myDataBase = "banco_sistema"; 	//nome do seu banco de dados
		String url = "jdbc:mysql://" + serverName + "/" + myDataBase;
		String userName = "root"; //usuario do BD
		String password = "juninho12"; //senha do BD
		
		connection = DriverManager.getConnection(url, userName, password);
		
		//teste de conexão
		
		if (connection != null)
		{
			status = ("Conectado com Sucesso!");
		}
		
		else
		{
			status = ("Não foi possível realizar a conexão!");
		}
			
		return connection;
	} catch (ClassNotFoundException e) {  //Driver não encontrado

    	  System.out.println("O driver expecificado nao foi encontrado.");

          return null;

      } catch (SQLException e) {

//Não conseguindo se conectar ao banco

          System.out.println("Nao foi possivel conectar ao Banco de Dados.");

          return null;
      }
}

}

E a classe cliente que você se refere é a do model?

Rodrigo_Void

e pq vc teria várias classes Cliente?

Jorge_Eduardo

Classe Cliente:

public class Cliente {

private int CLI_ID;
private String CLI_NOME;
private String CLI_CPF;
private java.sql.Date CLI_NASC;
private String CLI_ENDERECO;
private String CLI_EMAIL;
private String CLI_TEL;
private String CLI_BAIRRO;
private String CLI_CEP;
private String CLI_ESTADO;

public int getCLI_ID() {
	return CLI_ID;
}
public void setCLI_ID(int CLI_ID) {
	CLI_ID = this.CLI_ID;
}

public String getCLI_NOME() {
	return CLI_NOME;
}
public void setCLI_NOME(String CLI_NOME) {
	CLI_NOME = this.CLI_NOME;
}

public String getCLI_CPF() {
	return CLI_CPF;
}
public void setCLI_CPF(String CLI_CPF) {
	CLI_CPF = this.CLI_CPF;
}

public java.sql.Date getCLI_NASC() {
	return CLI_NASC;
}
public void setCLI_NASC(java.sql.Date CLI_NASC) {
	CLI_NASC = this.CLI_NASC;
}

public String getCLI_ENDERECO() {
	return CLI_ENDERECO;
}
public void setCLI_ENDERECO(String CLI_ENDERECO) {
	CLI_ENDERECO = this.CLI_ENDERECO;
}

public String getCLI_EMAIL() {
	return CLI_EMAIL;
}
public void setCLI_EMAIL(String CLI_EMAIL) {
	CLI_EMAIL = this.CLI_EMAIL;
}

public String getCLI_TEL() {
	return CLI_TEL;
}
public void setCLI_TEL(String CLI_TEL) {
	CLI_TEL = this.CLI_TEL;
}

public String getCLI_BAIRRO() {
	return CLI_BAIRRO;
}
public void setCLI_BAIRRO(String CLI_BAIRRO) {
	CLI_BAIRRO = this.CLI_BAIRRO;
}

public String getCLI_CEP() {
	return CLI_CEP;
}
public void setCLI_CEP(String CLI_CEP) {
	CLI_CEP = this.CLI_CEP;
}

public String getCLI_ESTADO() {
	return CLI_ESTADO;
}
public void setCLI_ESTADO(String CLI_ESTADO) {
	CLI_ESTADO = this.CLI_ESTADO;
}
Cleidiano

Olá @Jorge_Eduardo, após o trecho código pstm.execute();, você precisa fazer commit na sua Connection, conn.commit();.

Rodrigo_Void

Ele não tem autoCommit(false);
Por padrão é autoCommit true até pq ele disse que o id está inserindo, mas os outros dados não

Jorge_Eduardo

Fiz do jeito que você disse, criei variáveis e lancei os valores pelo console. Fui verificar no banco e continua da mesma forma

Não aparece nenhum erro no console, so que quando verifico o banco pra ver se inseriu mesmo, só vai o ID.

J

E quando você pega os valores, antes de enviar para o DAO eles estão nulos ?

Rodrigo_Void

Não vai aparecer erro, muito menos printar no console resolveria seu problema, entenda que a sugestão foi pra vc ver OQUE vai printar no console, se printar os dados o problema é na inserção, se não printar, seu problema está em setar os dados da tela no objeto. Portanto verifique isso e responda com oq printou no console.

Rodrigo_Void

Hummmmm, perae…
troca a linha:
pstm.execute();
por:
pstm.executeUpdate();

Jorge_Eduardo

Como eu faria essa verificação?

Jorge_Eduardo

Troquei a linha que você falou, mas ficou do mesmo jeito. Vou fazer a verificação que você disse em relação a printar os dados.

Jorge_Eduardo

Todos os dados foram printados na tela, então como você disse possivelmente é alguma coisa na hora de setar para o objeto.

Rodrigo_Void

Posta o código q vc fez pra printar

JulioCesarSF

Você pode tentar adicionar o logger no final da sua URL:

?logger=com.mysql.jdbc.log.StandardLogger&profileSQL=true

Ai ele vai mostrar o que está fazendo quando tenta inserir e se dá algum problema durante.

Jorge_Eduardo

public void actionPerformed(ActionEvent e) {

//capturando o ID
			String ID = txtID.getText();
			int id = Integer.parseInt(ID);
			cliente.setCLI_ID(id);
			System.out.println(txtID.getText());
			
			//capturando o nome
			cliente.setCLI_NOME(txtNome.getText());
			System.out.println(txtNome.getText());
			
			//capturando o CPF/CNPJ
			cliente.setCLI_CPF(txtCPF.getText());
			System.out.println(txtCPF.getText());
			
			
			//capturando o telefone
			cliente.setCLI_TEL(txtTel.getText());
			System.out.println(txtTel.getText());
			
			
			//capturando o email
			cliente.setCLI_EMAIL(txtEmail.getText());
			System.out.println(txtEmail.getText());
			
			
			//capturando o endereço
			cliente.setCLI_ENDERECO(txtEndereco.getText());
			System.out.println(txtEndereco.getText());
			
			
			//capturando o bairro
			cliente.setCLI_BAIRRO(txtBairro.getText());
			System.out.println(txtBairro.getText());
			
		
			//capturando o cep
			cliente.setCLI_CEP(txtCEP.getText());
			System.out.println(txtCEP.getText());
			
			
			//capturando a escolha do combobox
			cliente.setCLI_ESTADO(String.valueOf(cbEstado.getSelectedItem()));
			System.out.println(cbEstado.getSelectedItem());
			
			
			//capturando a data de nascimento
			java.util.Date invoiceDate = null;
			try
			{
				invoiceDate = formatDate.parse(txtDataNasc.getText().trim());
			}catch(Exception e4)
			{
				e4.printStackTrace();
			}
			java.sql.Date sqlDate = new java.sql.Date(invoiceDate.getTime());
			cliente.setCLI_NASC(sqlDate);
			System.out.println(txtDataNasc.getText());
			//fim da captura de data de nascimento
			
			
			if ((txtID.getText().isEmpty()) || (txtNome.getText().isEmpty()) || (txtCPF.getText().isEmpty()) || (txtTel.getText().isEmpty()) || (txtEmail.getText().isEmpty()) || (txtEndereco.getText().isEmpty()) || (txtBairro.getText().isEmpty()) || (txtCEP.getText().isEmpty()))
			{
				JOptionPane.showMessageDialog(null,"<html>Os campos com * <strong>não</strong> podem ficar vazios!</html>");
			}
			else
			{
				dao.salvarCliente(cliente);
				JOptionPane.showMessageDialog(null, "Cliente " + txtNome.getText() +" inserido com sucesso!" );
				limparCampos();
			}
					
					
		}

Talvez eu não tenha entendido bem o que você me pediu para fazer, so fiz um teste de printar na tela os dados que passo como parâmetro no DAO, e eles devolvem os dados. Caso esteja fazendo errado, peço desculpa como disse sou muito juvenil ainda em Java :sweat_smile:

Jorge_Eduardo

Onde precisamente eu insiro esse logger?

Rodrigo_Void

poe os print na DAO

JulioCesarSF

Você não tem uma variavel chamada url na sua classe de conexão?
Depois de tudo insere o texto que passei. URL fica ± assim:

public final class Conexao {
	
	private static Connection con;
	
	private final static String USUARIO = "teste";
	private final static String SENHA = "123";
	private final static String URL = "jdbc:mysql://localhost/testes?useSSL=false&logger=com.mysql.jdbc.log.StandardLogger&profileSQL=true";
	
	private Conexao(){}
	
	public static Connection getCon(){
		if(con == null)	{
			try {
				Class.forName("com.mysql.jdbc.Driver");
				
				con = (Connection) DriverManager.getConnection(URL, USUARIO, SENHA);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}			
		}		
		return con;
	}
}
Vonquelbe_Cruz

Segue minha classe de conexão

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import lib.Util;

public class Conn {
    
    private static Conn instance;
    private static Connection conn = null;
/**
 * Método de conexão com banco e tem como retorno um Boolean
 * @return 
 */ public static Boolean getConnection() {
        try {
            if (conn == null||conn.isClosed()) {
                conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/servadm", "root", "root");
            }
        } catch (Exception e) {
            Util.mensagem("Erro ao conectar: " + e.getMessage());
            return false;
        }
        return true;
    }
/**
 * Método público estático de acesso único ao objeto!
 * Sintaxe: Conn con = Conn.getInstance();
 * @return 
 */ public static Conn getInstance() {
        if (instance == null) {
            instance = new Conn();
        }
        return instance;
    }
/**
 * Recupera conexão
 * @return Connection
 */ public static Connection getConn() {
        return conn;
    }
/**
 * Encerra conexão
 */ public static void closeConnection (){
        try {
            if(!conn.isClosed()&&conn!=null){
                conn.close();
            }
        } catch (SQLException ex){
            Util.mensagem("Erro ao encerrar conexão: "+ex.getMessage());
        }
    } 
}

Eu uso o método getConnection apenas quando faço Login no sistema. Repare que ele me retorna um boolean.

Em todas as minha classes DAO eu tenho um método chamado Acao que faz o CRUD

public class ServDao {
    
    private static ResultSet rs = null;
    private static PreparedStatement ps = null;

    public static Msg Acao (ServMod obj){
     // Criticas
        //if (obj.getCodigo()==0) {return new Msg(0, "Campo obrigatório: Código");}
        if (obj.getDescr().equals("")) {return new Msg(1, "Campo obrigatório: Descrição");}
        if (obj.getSegmento().equals("")) {return new Msg(2, "Campo obrigatório: Segmento");}
     // Ação
        try {
            switch(obj.getAcao()) {
                case "INC":
                    ps = Conn.getConn().prepareStatement("insert into aux_servico values (null, ?, ?, ?, ?)");
                    ps.setString (1,obj.getDescr   ());
                    ps.setString (2,obj.getSegmento());
                    ps.setBoolean(3,obj.isAtivo    ());
                    ps.setString (4,obj.getTempo   ());
                    ps.executeUpdate();
                    Util.mensagem(obj.getAcao(), (char) ps.getUpdateCount());
                    break;
                case "ALT":
                    ps = Conn.getConn().prepareStatement("update aux_servico     "
                                                       + "   set descr    = ? "
                                                       + "     , segmento = ? "
                                                       + "     , ativo    = ? "
                                                       + "     , tempo    = ? "
                                                       + " where codserv  = ? ");
                    ps.setString (1,obj.getDescr   ());
                    ps.setString (2,obj.getSegmento());
                    ps.setBoolean(3,obj.isAtivo    ());
                    ps.setString (4,obj.getTempo   ());
                    ps.setInt    (5,obj.getCodigo  ());
                    ps.executeUpdate();
                    Util.mensagem(obj.getAcao(), (char) ps.getUpdateCount());
                    break;
                case "EXC":
                    ps = Conn.getConn().prepareStatement("delete from aux_servico "
                                                       + " where codserv = ?");
                    ps.setInt(1,obj.getCodigo());
                    ps.executeUpdate();
                    Util.mensagem(obj.getAcao(), (char) ps.getUpdateCount());
                    break;
            }
        } catch (Exception e) {
            Util.mensagem((e.getMessage().contains("foreign key constraint") ? "ForeignKey":null), e.getMessage());
        } finally {
            Conn.closeConnection(ps);
        }
        return new Msg(0, null);
    }
}

Repare que eu chamo o método getConn da classe Conn que me retorna o Connection. Assim não preciso ficar abrindo e fechando conexão o tempo todo … Só fecho a conexão quando encerro a aplicação.

Repare que no começo do método Acao eu faço umas verificações justamente para saber se estou passando os dados corretamente antes de gravar na tabela. Msg é uma classe que tem apenas código e descrição que eu trato como mensagem e para saber qual campo esta com erro no return.

Jorge_Eduardo

Fiz como você disse, e o retorno foi “null”. Então deve ser por isso não está indo nada pro banco.

Jorge_Eduardo

Entendi, muito obrigado! Irei tentar usar alguma ideia sua na minha aplicação.

Jorge_Eduardo

Usei o logger e não retornou erro de banco, acho que o erro está no meu DAO mesmo. Mas de qualquer forma, obrigado! :smiley:

M

Sim, pois o ID entra automaticamente(se tiver setado como auto_increment), então nem precisa passar ele.

Criado 29 de novembro de 2017
Ultima resposta 4 de dez. de 2017
Respostas 26
Participantes 8