Atualizar o banco de dados através de um JTable

Olá pessoal,
Alguém sabe como atualizar uma tabela de um banco de dados utilizando um JTable?
Ou seja, o usuário faz uma busca no banco e retorna dentro de um JTable, até ai tudo bem.
Mas quando faz as alterações necessárias, tenho que enviar novamente para o banco.
Como faz o UPDATE?
Caso saibam de algum tutorial que possa me ajudar, fico Grato.
Desde já agradeço.
Abraços.

Alguém dê um luz! :frowning:

veja se isso te ajuda em algo: http://www.go-java.com/blog/2007/09/27.html

não é exatamente o que você quer, mas no caso você pediu uma :idea: então já alguma coisa.

:slight_smile:

incrementando o post acima, poderia colocar botões de comando para realizar as operações no banco de dados e recarregar o JTable…em todo caso, se de nada servir o conteúdo, posta mais detalhes do que quer fazer.

[quote=rafaelglauber]veja se isso te ajuda em algo: http://www.go-java.com/blog/2007/09/27.html

não é exatamente o que você quer, mas no caso você pediu uma :idea: então já alguma coisa.

:)[/quote]
Olá rafaelglauber,
Cara um artigo muito bom, porém realmente não era bem isso que estou querendo.
Mas de qualquer forma irei dar uma olhada mais aprofundada, pois o assunto é interessante.

Com relação a:

Bom, realmente eu utilizo um evento de um JButton para carregar o JTable até aqui funciona perfeitamente.
O meu problema é quando o usuário faz as alterações na JTable ele clica em outro JButton para que estas atualizações sejam enviadas para o banco.
Ou seja, o meu problema se resume em como enviar os dados do JTable atualizados para o banco de dados.
Caso tenha alguma outra idéia de como posso resolver isso, ficarei eternamente grato. :smiley:
Desde já agradeço

T+

Você tá usando algum framework orm? Tá usando jdbc puro?..como faz a persistência de sua aplicação?

JDBC puro mesmo,
Utilizo um evento de um JButton ao qual dentro deste evento faço a conexão com o banco.
O código que estou tentando é algo + ou - assim:

private void editarJurLancamentos(java.awt.event.ActionEvent evt) { try { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/gerpro"; String usuario = "root"; String senha = "admin"; Connection con; con = DriverManager.getConnection(url, usuario, senha); PreparedStatement ps = con.prepareStatement("UPDATE lancamentosjuridico SET condominio = ? , unidade = ? , servico = ? , hora = ? , data = ? , contato = ? , comentario =?"); ps.setString(1 , aqui não sei como setar o campo da JTable); ps.setString(2 , aqui não sei como setar o campo da JTable); ps.setString(3 , aqui não sei como setar o campo da JTable); ps.setString(4 , aqui não sei como setar o campo da JTable); ps.setString(5 , aqui não sei como setar o campo da JTable); ps.setString(6 , aqui não sei como setar o campo da JTable); ps.setString(7 , aqui não sei como setar o campo da JTable); ps.executeUpdate(); con.close(); }catch (ClassNotFoundException e ){ JOptionPane.showMessageDialog(null, "Falha na conexão com o banco de dados.\n" + e.getMessage()); e.printStackTrace(); }catch (SQLException e){ e.printStackTrace(); } }
Bom na consulta eu fiz assim:

[code]
private void abrirEditarJurLancamentos(java.awt.event.ActionEvent evt) {
editarJurLancamentos.setExtendedState(JFrame.MAXIMIZED_BOTH);
editarJurLancamentos.setVisible(true);
comboJurEdiLancCondominio.removeAllItems();
comboJurEdiLancServico.removeAllItems();
preencherComboJurServicos();
preencherComboJurCondominios();
redimencionarColumasLancJuridico();

    DefaultTableModel modelo = (DefaultTableModel)jtJurEdiLancTabela.getModel();//obtem o tablemodel da tabela 
    
    //Limpando os campos da tabela antes de inserir os dados da consulta
    int i = 0;
    while (modelo.getRowCount() > 0){
        modelo.removeRow(i);
    } 
    try {
        Class.forName("com.mysql.jdbc.Driver");   
            String url = "jdbc:mysql://localhost:3306/gerpro";   
            String usuario = "root";   
            String senha = "admin";   
            Connection con;   
            con = DriverManager.getConnection(url, usuario, senha);
            PreparedStatement ps = con.prepareStatement("SELECT * FROM lancamentosjuridico");
            ResultSet rs = ps.executeQuery();
            
            while (rs.next()){                
                Object[] novaLinha = new Object[7];//cria um array de objetos com a quantidade igual as colunas da table   
                novaLinha[0] = rs.getString("condominio");   
                novaLinha[1] = rs.getString("unidade");   
                novaLinha[2] = rs.getString("servico"); 
                novaLinha[3] = rs.getString("hora"); 
                novaLinha[4] = rs.getString("data"); 
                novaLinha[5] = rs.getString("contato"); 
                novaLinha[6] = rs.getString("comentario");   
                modelo.addRow( novaLinha );//adiciona uma nova linha ao tablemodel da tabela 
            }

            con.close();
    }catch (ClassNotFoundException e ){     
        JOptionPane.showMessageDialog(null, "Falha na conexão com o banco de dados.\n" + e.getMessage());     
            e.printStackTrace();     
    }catch (SQLException e){     
            e.printStackTrace();
    }

}[/code]
Bom, eu na verdade queria atualizar tabela toda e não os campos como citei em cima. //ali é só um idéia
Porque o usuário pode atualizar mais de um campo por vez.
Caso saiba de alguma solução, fico eternamente grato. :stuck_out_tongue:
Agradeço a força desde então!
Abraços

Cara eu nao entendi bem este “aqui não sei como setar o campo da JTable”

....................
ps.setString(1 , aqui não sei como setar o campo da JTable);   
                ps.setString(2 , aqui não sei como setar o campo da JTable);   
                ps.setString(3 , aqui não sei como setar o campo da JTable);   
                ps.setString(4 , aqui não sei como setar o campo da JTable);   
                ps.setString(5 , aqui não sei como setar o campo da JTable);   
                ps.setString(6 , aqui não sei como setar o campo da JTable);   
                ps.setString(7 , aqui não sei como setar o campo da JTable); 
.....................................................

Voce nao sabe pegar os campos da tabela ? é isso ?


                              int row = jTable1.getSelectedRow();
    	              int col = jTable1.getSelectedColumn();
    	              String camposel=jTable1.getValueAt(row, col).toString();

No seu caso precisa saber qual coluna fixar e ir variando as linhas!!!

Olá Raarm,

Estou tentando de outra maneira,
Mas o código que me enviou:

int row = jTable1.getSelectedRow(); int col = jTable1.getSelectedColumn(); String camposel=jTable1.getValueAt(row, col).toString();
É para acessar uma única célula, correto?
Se sim, como faço para pegar a linha toda ao invés de uma única célula e obter as strings das colunas dessa linha.

Valeu a força,
Abraços

Entao Wesley…para vc pegar uma linha inteira e só fixar a linha:


String camposel=jTable1.getValueAt(0, col).toString(); //primeira linha 

ou para coluna:

ou entao faz um for…pra pegar todas as linhas

:stuck_out_tongue:

[quote=Raarm]Entao Wesley…para vc pegar uma linha inteira e só fixar a linha:


String camposel=jTable1.getValueAt(0, col).toString(); //primeira linha 

ou para coluna:

ou entao faz um for…pra pegar todas as linhas

:P[/quote]
depois como faria para pegar cada elemendo contido nas colunas dessa linha?
teria que colocar em um array?
vlw

Entao vc pode fazer assim, cria um array dados[][]


for(int col=0;col<6;col++)
{
  for(int lin=0;lin<modelo.size();lin++)
   {
      dados[lin][col]=jTable1.getValueAt(lin, col).toString(); 
    }
}

>

[quote=Raarm]Entao vc pode fazer assim, cria um array dados[][]


for(int col=0;col<6;col++)
{
  for(int lin=0;lin<modelo.size();lin++)
   {
      dados[lin][col]=jTable1.getValueAt(lin, col).toString(); 
    }
}

>[/quote]
Valeu Raarm, :smiley:
Vou testar depois eu posto o resultado
Abraços

Olá Raarm,
Não sei se estou fazendo o correto, pois tá dando o erro :

[color=red]Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException[/color]

Se puder dá uma olhada no código,
A idéia seria um evento de um JButton ao qual na seleção de uma linha na JTable e clicando no JButton “OK” as colunas da linha selecionada da JTable fosse para os JTextfields.
o código é seguinte:

private void editarJurLancamentos(java.awt.event.ActionEvent evt) { DefaultTableModel modelo = (DefaultTableModel)jtJurEdiLancTabela.getModel();//obtem o tablemodel da tabela jtJurEdiLancTabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); //permite selecionar apenas uma linha da tabela int lin = jtJurEdiLancTabela.getSelectedRow(); int col = jtJurEdiLancTabela.getSelectedColumn(); String dados [][] = null; for(col=0;col<6;col++){ for(lin=0;lin<modelo.getRowCount();lin++){ dados[lin][col]=jtJurEdiLancTabela.getValueAt(lin, col).toString(); } } cxTxtJurLancUnidade.setText(dados[lin][2]); cxTxtJurLancHorario.setText(dados[lin][4]); cxTxtJurLancContatoCom.setText(dados[lin][5]); cxTxtJurLancComentarios.setText(dados[lin][6]); juridicoLancamentos.setVisible(true); }
Valeu mesmo a força
É que tô apanhando muito com JTable
Abraço

Eai Wesley…entao cara se vc quer pegar só as colunas da linha é o seguinte…


              int colunas[] = jtJurEdiLancTabela.getSelectedColumns(); //pega as colunas selecionadas, no seu caso sao 6	
	int linha = jtJurEdiLancTabela.getSelectedRow(); //pega a linha selecionada 
                   String dados[] = new String[colunas.length];

	for(int i=0;i&lt;colunas.length;i++)
	{	
	dados[i] = jtJurEdiLancTabela.getValueAt(linha, i).toString();
	}

.........

        cxTxtJurLancUnidade.setText(dados[2]);   
        cxTxtJurLancHorario.setText(dados[4]);   
        cxTxtJurLancContatoCom.setText(dados[5]);   
        cxTxtJurLancComentarios.setText(dados[6]); 

Acho que assim resolve…ve ai!! 8) >

Valeu Raarm,
Vou tentar mais tarde e te falo, é que no momento eu não tenho como testa, estou sem o projeto aqui.
Mas, desde já agradeço a força.
Abração

Blza Wesley…a parte de atualizar no banco eu tb to implementando algo parecido aqui no meu projeto…qqr coisa te dou uma força!!!
Abraço
Raphael

Grande Raphael,

Funcionou :stuck_out_tongue:
Cara, tô te devendo essa.
Só tive que alterar uma coisinha:

int colunas[] = jtJurEdiLancTabela.getSelectedColumns(); //pega as colunas selecionadas int linha = jtJurEdiLancTabela.getSelectedRow(); //pega a linha selecionada String dados[] = new String[7]; int i=0; for(i=0;i<7;i++){ dados[i] = jtJurEdiLancTabela.getValueAt(linha, i).toString(); }
Ele não quis funcionar com colunas.length
Dava erro de indexação.
Então eu coloquei a quantidade de colunas mesmo, que na verdade são 7
Não é o certo mas funcionou.

Aproveitando o gancho e já abusando, :oops:

Como faria se tivesse que comparar um indice desse array com um item de um JComboBox para deixá-lo selecionado?
É que já tô pensando em uma problema mais na frente.

Brigadaum mesmo.
T+

Resolvido o Problema do Combo, é que eu tenho um método para preenche-lo é táva executando ele 2 vezes então ele duplicava os valores.

Valeu Raphael.
T+