Atualizar o banco de dados através de um JTable

18 respostas
wamarra

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.

18 Respostas

wamarra

Alguém dê um luz! :frowning:

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.

:slight_smile:

rafaelglauber

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.

wamarra

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.

:)


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+

rafaelglauber

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

wamarra
rafaelglauber:
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:
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();
        }
}
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. :P Agradeço a força desde então! Abraços
Raarm

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!!!

wamarra

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

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

:stuck_out_tongue:

wamarra

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


depois como faria para pegar cada elemendo contido nas colunas dessa linha?
teria que colocar em um array?
vlw

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

>

wamarra

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

>


Valeu Raarm, :smiley:
Vou testar depois eu posto o resultado
Abraços

wamarra

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

Raarm

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

wamarra

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

Raarm

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

wamarra

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+

wamarra

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+

Criado 26 de novembro de 2007
Ultima resposta 28 de nov. de 2007
Respostas 18
Participantes 3