Excluir dados da JTable e do Banco de dados

Olá pessoal.

Estou com o seguinte problema:

Tenho uma JTable que carrega os dados do MySql. Quando dou um clique na JTable o sistema me pergunta se eu quero excluir
o cliente selecionado. Se eu clicar em sim, este cliente é excluído do banco de dados e da JTable mas, não estou conseguindo
excluir do banco de dados. Excluir do JTable eu até consigo mas não do banco.
Alguém pode me ajudar?

    final DefaultTableModel modelo = new DefaultTableModel();
    JTableDados = new JTable(modelo);
    modelo.addColumn("ID");
    modelo.addColumn("Nome");
    modelo.addColumn("CPF");
    modelo.addColumn("Telefone");
    modelo.addColumn("Nascimento");
    modelo.addColumn("Cadastro");
    JTableDados.getColumnModel().getColumn(0).setPreferredWidth(10);
    JTableDados.getColumnModel().getColumn(1).setPreferredWidth(250);
    JTableDados.getColumnModel().getColumn(2).setPreferredWidth(70);
    JTableDados.getColumnModel().getColumn(3).setPreferredWidth(70);
    JTableDados.getColumnModel().getColumn(4).setPreferredWidth(70);
    JTableDados.getColumnModel().getColumn(5).setPreferredWidth(50);
    JTableDados.setFont(new Font("Segoe UI",Font.PLAIN,11));
    JTableDados.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.LOWERED));
    JTableDados.setSelectionBackground(Color.YELLOW);
    JTableDados.setSelectionForeground(Color.BLUE);
    JTableDados.setDefaultRenderer(Object.class, new ColorRenderer()); // Chama a Classe que intercala as cores da JTable
    JTableDados.setFocusable(false); //Evita o foco
    JTableDados.setAutoCreateRowSorter(true);
    JTableDados.setFont(new Font("Lucida Console",Font.PLAIN,11));
    JTableDados.getTableHeader().setResizingAllowed(false);// evita que as colunas sejam redimensionadas        
    JTableDados.getTableHeader().setReorderingAllowed(false);// evita que as colunas sejam reordenadas        
    JTableDados.setShowGrid(false);// oculta a grade da tabela  
    JTableDados.setShowHorizontalLines(false);// oculta as linhas horizontais da tabela
    JTableDados.setShowVerticalLines(false);// oculta as linhas verticais da tabela
    JScrollPane1.setViewportView(JTableDados); 
    JPanel2 = new JPanel();	
    JPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createTitledBorder(null, "", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Segoe UI", 0, 11)), "Clientes Cadastrados", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Segoe UI", 0, 11)));
    JPanel2.setFont(new Font("Segoe UI",Font.PLAIN,11)); 
    JPanel2.setOpaque(false);	       
    JPanel2.setBounds(140, 370, 840, 340);
    JLabelFundo.add(JPanel2);
    try
{
String url = "jdbc:mysql://localhost:3306/javalocadora";
String usuario = "root";
String senha = "210683";
Class.forName("com.mysql.jdbc.Driver");
Connection con;
con = DriverManager.getConnection(url,usuario,senha);
Statement st = con.createStatement();
//Executa o comando SQL que retorna todos os campos da tabela desejada
    ResultSet RS = st.executeQuery("SELECT * FROM Clientes WHERE ID");
    while(RS.next()){
    int ID = RS.getInt("ID");        
    String Nome = RS.getString("Nome");
    //endereço = RS.getString("Endereco");
    String cpf = RS.getString("CPF");
    String telefone = RS.getString("Telefone");
    String nascimento = RS.getString("DataNasc");
    String cadastro = RS.getString("DataCadastro");
    modelo.addRow(new Object[]{new Integer(ID), new String(Nome),new String(cpf),new String(telefone),new String(nascimento),new String(cadastro)}); 
    }       
    con.close(); 
    RS.close();         
    }catch(SQLException e){ //trata os erros
    //JOptionPane.showMessageDialog(this,"Erro Cmdo SQL "+e.getMessage());
    }
    catch(Exception event) {        	
    }


    //Exclui dados da JTable e do banco de dados

    JTableDados.addMouseListener(new java.awt.event.MouseAdapter() {
    public void mouseClicked(java.awt.event.MouseEvent evt) {
     
    int status = JOptionPane.showConfirmDialog(null,"Deseja excluir este cliente?","Atenção",JOptionPane.YES_NO_OPTION);
    if (status == JOptionPane.YES_OPTION) {
    try
{
String url = "jdbc:mysql://localhost:3306/javalocadora";
String usuario = "root";
String senha = "210683";
Class.forName("com.mysql.jdbc.Driver");
Connection con;
con = DriverManager.getConnection(url,usuario,senha);
Statement st = con.createStatement();		
st.executeUpdate("DELETE * FROM Clientes WHERE ID ="+JTableDados.getSelectedRow());		
int[] l = JTableDados.getSelectedRows();   
    javax.swing.table.DefaultTableModel dtm = (javax.swing.table.DefaultTableModel)JTableDados.getModel();	
    for(int i = 0; i < l.length; i++)   
    dtm.removeRow(l[i] - i);
    con.close();		
    }
    catch(Exception event) {
    JOptionPane.showMessageDialog(null,"Não foi possível estabelecer conexão com o banco de dados!","Erro",JOptionPane.ERROR_MESSAGE);
    }
    }        	   
    }});

Vc está esquecendo de dar um commit antes de fechar a conexão.
Eu só não lembro se esse é um metodo da classe Statement ou se é da classe Conection.

rogeriuslima

Como eu faria esse Commit?

É fácil, antes de fechar a conexão vc usa o metodo commit() da classe Connection (eu já confirmei).
Se acontecer alguma falha vc usa o metodo rollback().
No caso do seu código ficaria assim:


try
{
String url = "jdbc:mysql://localhost:3306/javalocadora";
String usuario = "root";
String senha = "210683";
Class.forName("com.mysql.jdbc.Driver");
Connection con;
con = DriverManager.getConnection(url,usuario,senha);
Statement st = con.createStatement();
st.executeUpdate("DELETE * FROM Clientes WHERE ID ="+JTableDados.getSelectedRow());
int[] l = JTableDados.getSelectedRows();
javax.swing.table.DefaultTableModel dtm = (javax.swing.table.DefaultTableModel)JTableDados.getModel();
for(int i = 0; i < l.length; i++)
dtm.removeRow(l[i] - i);
con.commit();
con.close();
} 

Lembre-se que quando vc faz alguma alteração na tabela ou nos dados dela vc precisa fazer o commit.
Abraços

rogeriuslima

Obrigado… Vou fazer o teste aqui.

Só uma dúvida… O ID do produto coincide com o número da linha selecionada??

está certo voce dar um DELETE * FROM Clientes WHERE ID ="+JTableDados.getSelectedRow()???

Fernando

Eu costumo fazer assim na tabela

public void removeLinha(int linha) {
this.tableModel.removeRow(linha);
}

atraves dessa chamada

tabela.removeLinha(tabela.getSelectedRow());

para deletar no banco eu uso assim :

public Object retornaDado(int linha, int coluna) {
return (this.getModel().getValueAt(linha, coluna));
}

recuperando o identificar que eu quero.

Wallace

Fernando Generoso da Rosa

coincide sim

E voce está ciente que a primeira linha, em um getSelectedRow() irá retornar 0, certo??

Fernando Generoso da Rosa
Sim

Ainda não consegui resolver meu problema!

Alguém pode me ajudar

Você aperta em um botão para excluir a linha!??

ajfilho >>

Não. É no evento mouseClicked

olha abaixo:

JTableDados.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {

int status = JOptionPane.showConfirmDialog(null,“Deseja excluir este cliente?”,“Atenção”,JOptionPane.YES_NO_OPTION);
if (status == JOptionPane.YES_OPTION) {
try
{
String url = “jdbc:mysql://localhost:3306/javalocadora”;
String usuario = “root”;
String senha = “210683”;
Class.forName(“com.mysql.jdbc.Driver”);
Connection con;
con = DriverManager.getConnection(url,usuario,senha);
Statement st = con.createStatement();
st.executeUpdate(“DELETE * FROM Clientes WHERE ID =”+JTableDados.getSelectedRow());
int[] l = JTableDados.getSelectedRows();
javax.swing.table.DefaultTableModel dtm = (javax.swing.table.DefaultTableModel)JTableDados.getModel();
for(int i = 0; i < l.length; i++)
dtm.removeRow(l[i] - i);
con.close();
}
catch(Exception event) {
JOptionPane.showMessageDialog(null,“Não foi possível estabelecer conexão com o banco de dados!”,“Erro”,JOptionPane.ERROR_MESSAGE);
}
}
}});