Metodo inserir uma linha tableModel [RESOLVIDO]

6 respostas
psicoppardo

Caras na minha saga em busca de conhecimento sobre mvc, tablemodel e etc. Me deparei com um entrave.

No meu programa de estudo (Fichas DnZefinha), tenho um internalFrame que lança um novo registro no banco:

ManipulacaoClienteGui.java
public Cliente getCliente(){
                     
      Cliente cliente = new Cliente();
      
      cliente.setNome(tfNome.getText());
      cliente.setCpf(tfCPF.getText());
      cliente.setEndereco(tfEndereco.getText());
      cliente.setTelefone(tfTelefone.getText());
      
      return cliente;
    }

private void bOKActionPerformed(java.awt.event.ActionEvent evt) {                                    
        // TODO add your handling code here:
         Cliente c = getCliente();
         
        
         
        try {
            new ClienteDao().inserirCliente(c);
            ClientesGUI.dtm.addRow(c);
                       
            
        } catch (SQLException ex) {
            Logger.getLogger(ManipulacaoClienteGUI.class.getName()).log(Level.SEVERE, null, ex);
        }
        
       limparCampos();
               
    }

na minha ClienteTableModel.java tenho o método que adiciona a linha:

public void addRow(Cliente cliente){     
        listaClientes.add(cliente); 
        int ultimoIndice = getRowCount()-1;
        this.fireTableRowsInserted(ultimoIndice, ultimoIndice);

    }

Agora segue o meu problema:

Quando clico no botão OK do InternalFrame o código não captura o id_Cliente

A linha é adicionada na tabela, mas ela não captura o idCliente fica ± assim:

id_Cliente | Nome                 | cpf                  | Endereco                  | telefone        |
                  fulano                    090909099         Rua A                         909090909

Pronto, se eu clicar no botão excluir da minha aplicação ela retorna essa mensagem:

DELETE FROM cliente WHERE id_cliente = null

mas se eu fechar o InternalFrame que contém a tabela e abri-la de novo:

id_Cliente | Nome                 | cpf                  | Endereco                  | telefone        |
     20       fulano                    090909099         Rua A                         909090909

a linha e atualizada na tabela e quando mando excluir:
DELETE FROM cliente WHERE id_cliente = 20

Exclui normalmente. A minha dúvida é: Como faço para capturar o id_Cliente do BD. Estou usando um banco H2database, com o campo id_cliente autoencrement tipo Long.

Muito obrigado pelas respostas.

6 Respostas

psicoppardo

Vendo um tópico do ViniGodoy ele Deu um exemplo no qual no tablemodel colocava-se esse código:

public void update(Cliente cliente){
        int index = listaClientes.indexOf(cliente);
        this.fireTableRowsUpdated(index, index);
    }

mas eu não soube implementar para atualizar a tabela.

ViniGodoy

O método inserirCliente do clienteDao deveria pegar o id do cliente que foi recém cadastrado e então chamar o método setId nesse cliente.

Poste o método inserirCliente da classe ClienteDo.

psicoppardo

segue metodo inserirCliente da classe ClienteDao.

public void inserirCliente(Cliente cliente)throws SQLException{
        Connection conn = new ConexionFactory().getConn();
        PreparedStatement stmt = null;
        
        String sql = ADICIONAR_CLIENTE;
        
        try{
               stmt = conn.prepareStatement(sql);
               stmt.setString(1, cliente.getNome());
               stmt.setString(2, cliente.getCpf());
               stmt.setString(3, cliente.getEndereco());
               stmt.setString(4, cliente.getTelefone());
               
                 
               stmt.executeUpdate();
        
        }catch (SQLException exc) {
            exc.printStackTrace();
            
        } finally {
            conn.close();
            stmt.close();
    }
    }
ViniGodoy

Então, no seu método está faltando pegar o id retornado pelo banco e atribuir ao cliente recebido. Veja o método getGeneratedKeys() do PreparedStatement.

psicoppardo

beleza vou pesquisar.

valeu

psicoppardo

Resolução para o meu problema de capturar o ultimo registro id_cliente:

método inserir cliente:

public void inserirCliente(Cliente cliente)throws SQLException{
        Connection conn = new ConexionFactory().getConn();
        PreparedStatement stmt = null;
        
        String sql = ADICIONAR_CLIENTE;
        
        try{
               stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
               
               stmt.setString(1, cliente.getNome());
               stmt.setString(2, cliente.getCpf());
               stmt.setString(3, cliente.getEndereco());
               stmt.setString(4, cliente.getTelefone());
               
               stmt.executeUpdate();
               
               //solução para retornar o id_cliente
               ResultSet rs = stmt.getGeneratedKeys();
               rs.next();
               
               cliente.setIdCliente(rs.getLong(1));
               //imprimir o Id_cliente
               System.out.println("o id é: "+ rs.getLong(1));
               
               
               //return cliente.getIdCliente();
               
        
        }catch (SQLException exc) {
            exc.printStackTrace();
            
        } finally {
            conn.close();
            stmt.close();
    }
    }

Muito obrigado ViniGodoy por me ensinar o caminha das pedras.

Vini pode me responder uma coisa: Dessa forma e melhor do que um método que atualiza a tabela toda?? Se sim, porquê?? Se não, porquê??

Criado 27 de julho de 2012
Ultima resposta 28 de jul. de 2012
Respostas 6
Participantes 2