Sistema java mostra mensagem de sucesso ao editar mas não edita os dados [RESOLVIDO]

boa noite

estou desenvolvendo um sistema java em 3 camadas, mas estou com problema para editar os dados.

tenho um Jtable que me mostra os dados quando digito o nome em um Jtextfield. já tentei fazer a edição cm o critério where nome, e where id.

já testei varias vezes e refiz o código varias vezes mas não encontrei a solução se alguem puder me ajudar.

Esse é o método da minha classe DAL

  public void editarCliente(Cliente_Juridico cliente) {

    StringBuilder sql = new StringBuilder();

    try {

        sql.append("UPDATE FROM tbl_cliente_juridico ");
        sql.append("SET nome_cliente_J = ?, cnpj = ?, telefone = ?, celular = ?, email = ?, endereco = ?, num_end = ?, bairro = ?, cidade = ?, estado = ? ");
        sql.append("WHERE nome_cliente_J = ? ");

        Connection connection = ModuloConexao.conector();

        PreparedStatement comando = connection.prepareStatement(sql.toString());

        comando.setString(1, cliente.getNome_cliente_J());
        comando.setString(2, cliente.getCnpj());
        comando.setString(3, cliente.getTelefone());
        comando.setString(4, cliente.getCelular());
        comando.setString(5, cliente.getEmail());
        comando.setString(6, cliente.getEndereco());
        comando.setString(7, cliente.getNum_end());
        comando.setString(8, cliente.getBairro());
        comando.setString(9, cliente.getCidade());
        comando.setString(10, cliente.getEstado());
        comando.setString(11, cliente.getCategoria());

        comando.executeUpdate();

    } catch (SQLException erro) {

        System.out.println(erro);
    }

}

Esse é o método da classe BLL que faz a ligação com a classe DAL

public void editarClienteDAL(Cliente_Juridico cliente){

    Cliente_Juridico_DAL dal = new Cliente_Juridico_DAL();
    
    dal.editarCliente(cliente);
}

esse é o método dentro do Jframe

public void editarCliente_J(Cliente_Juridico cliente){
    
    ClasseBLL_J bll = new ClasseBLL_J();
    
    cliente.setNome_cliente_J(txt_nome_edit.getText());
    cliente.setCnpj(txt_cnpj_edit.getText());
    cliente.setTelefone(txt_fixo_edit.getText());
    cliente.setCelular(txt_cel_edit.getText());
    cliente.setEmail(txt_email_edit.getText());
    cliente.setEndereco(txt_end_edit.getText());
    cliente.setNum_end(txt_num_edit.getText());
    cliente.setBairro(txt_bairro_edit.getText());
    cliente.setCidade(txt_cidade_edit.getText());
    cliente.setEstado(cb_uf_edit.getSelectedItem().toString());
    
    
    bll.editarClienteDAL(cliente);
    
    JOptionPane.showMessageDialog(null, "Editado com sucesso");
}

private void btn_editar_cliActionPerformed(java.awt.event.ActionEvent evt) {

    Cliente_Juridico cliente = new Cliente_Juridico();
    editarCliente_J(cliente);
  
}

Boa noite

Cara, é DAO e não DAL. E quando for usar um WHERE, não usa um nome. Usa um id, preferencialmente uma chave primária, pois ela não vai se repetir. E digo mais, quando for usar WHERE com um texto, não usa o comparador “=”, usa o comparador “LIKE”

No mais, eu não uso PreparedStatement, eu uso Statement mesmo. É questão de trocar PreparedStatement por Statement. Talvez dê certo. O que pode estar acontecendo é o sql tá executando, mas não encontra o teu registro pelo parâmetro que tá passando.

Pra verificar, faz debug ou exibe o parâmetro que tá buscando, no console.

System.out.println("Parametro: " + cliente.getNome_cliente_J()); // ou cliente.getID_cliente_J caso exista id

Como nosso amigo @Chaybelucas já mencionou, o nome é DAO de Data Access Object.

Ao contrário do que ele disse, ao fazer INSERT ou UPDATE sempre é melhor utilizar o PreparedStatement, para garantir que o driver JDBC trate corretamente a conversão dos tipos de dado Java para os tipos de dado do banco…

Sobre você receber mensagem de "Editado com sucesso" mesmo quando não editou, é porque o seu método editarCliente possui um try-catch que está suprimindo a exceção, aí obviamente quem for chamar esse método, não vai perceber que houve um problema.

Tira o try-catch e declara o throws na assinatura do método, assim, quem for chamar o método deverá tratar a exceção.

1 curtida

Muito obrigado pelas dicas, já até corrigi a inscrita do meu DAO, vi algumas aulas o pessoal escrevendo DAL e peguei o erro. vou fazer o que me disse e digo se deu certo.

Remova o FROM.

Já tirei o FROM e não atualiza, vou revisar o código novamente

Acho que devia ser cliente.getCNPJ (). Pois se vc olhar sua tabela, vai ver que a categoria não tem nada escrito.

Adendo: ajustar a cláusula WHERE

é o seguinte, tenho uma tela de cadastro de clientes que tem um combo box categoria que tem as opções de cliente pessoa FISICA e JURIDICA, e quando for selecionado FISICA o campo
CNPJ ficara Enabled(false) e da mesma forma se for selecionado JURIDICA o campo CPF ficara Enabled(false).

Eu recomendo uma coisa bem simples, ao invés de usar um método void use um boolean, assim só vai aparecer mensagem de “Atualizado com sucesso!” se o método realmente executar o sql.
Ex:

public boolean editarCliente(Cliente_Juridico cliente) {

    StringBuilder sql = new StringBuilder();

    try {

        sql.append("UPDATE FROM tbl_cliente_juridico ");
        sql.append("SET nome_cliente_J = ?, cnpj = ?, telefone = ?, celular = ?, email = ?, endereco = ?, num_end = ?, bairro = ?, cidade = ?, estado = ? ");
        sql.append("WHERE nome_cliente_J = ? ");

        Connection connection = ModuloConexao.conector();

        PreparedStatement comando = connection.prepareStatement(sql.toString());

        comando.setString(1, cliente.getNome_cliente_J());
        comando.setString(2, cliente.getCnpj());
        comando.setString(3, cliente.getTelefone());
        comando.setString(4, cliente.getCelular());
        comando.setString(5, cliente.getEmail());
        comando.setString(6, cliente.getEndereco());
        comando.setString(7, cliente.getNum_end());
        comando.setString(8, cliente.getBairro());
        comando.setString(9, cliente.getCidade());
        comando.setString(10, cliente.getEstado());
        comando.setString(11, cliente.getCategoria());

       int editado = comando.executeUpdate();
       if(editado > 0){
          return true;
       }

    } catch (SQLException erro) {
        System.out.println(erro);
    }
    return false;
}

Eu também recomendaria você instanciar diretamente esse método sem o uso de outro método para buscar os dados, usando um construtor da classe Cliente_Juridico para buscar esses dados, fazendo os devidos tratamentos de mensagens dentro do método actionPerformed do botão que vai chamar o método.

Você esta comparando os dados da coluna nome_cliente_J com a categoria do cliente, não faz sentido nenhum.

Reveja a sentença sql.

Sugestão comparar o CNPJ do cliente com o existente no banco de dados, pois o CNPJ deve ser cadastrado como chave única.
Realizar o update de um cliente com base no nome é prejuízo.

Resumo, reveja o SQL, pois ele não é coerente.

refiz todos os métodos e deu certo. obrigado pela ajuda de todos