Estou fazendo uma tela dentro do VSCode para mostrar uma tabela e dentro dela há valores do meu banco de dados. A opção de remover um dado da tabela não funciona.
Será que o auto-commit não está desabilitado e faltou vc invocar o commit() depois do execute()?
J
JotaMoreno
o auto-commit tá definido como true, não deu certo
W
wldomiciano
E não aparece erro nenhum no terminal?
Pode nos mostrar a classe ConnectionFactory?
J
JotaMoreno
Não aparece erro no terminal.
O comando de Insert funciona normalmente, então acho que o problema não está na conexão.
J
Jonathan_Medeiros1 like
O registro não é excluído do banco de dados ou ele não é removido do seu table model?
Olhando o código, parece estar correto, porém, aparentemente você não remove a linha do registro excluído do seu table model, não seria esse o caso?
J
JotaMoreno
Ele não é excluído do bd e nem removido do table model. O teste que eu fiz usando id = 3 em vez do id = ?, excluiu do bd e removeu do table model o dado com id 3. Porém usando o “?” não acontece nenhum dos dois.
W
wldomiciano
Ah, então vai naquela linha na qual vc chama o c.getId() e coloca um println para ver se esse getId() está retornando o id certo.
J
JotaMoreno
caramba, tá retornando 0. O atributo id tá como auto_increment no bd, então nem to colocando valor pra ele no construtor. Acho que ele não tá recebendo o valor do bd, como posso resolver isso?
W
wldomiciano
Eu tenho uma ideia, mas deixa eu ver sua classe Categoria e o método de inserção antes?
Abaixo está o código completo que usei para fazer os testes aqui. No caso eu usei o H2 para facilitar, mas no MySQL é a mesma coisa.
No meu código usei o try-with-resources, pois ele garante o fechamento dos recursos sem que precisemos invocar o close() explicitamente.
Código que usei para testar
importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;publicclassMain{privatestaticfinalStringsql="INSERT INTO tbCategoria (Nome) VALUES (?)";privatestaticvoidinsert(Categoriac){try(Connectionconn=DriverManager.getConnection("jdbc:h2:mem:db;INIT=RUNSCRIPT FROM 'classpath:db.sql';MODE=MYSQL");PreparedStatementstmt=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS)){stmt.setString(1,c.getNome());if(stmt.executeUpdate()>0){try(ResultSetresult=stmt.getGeneratedKeys()){if(result.next()){c.setId(result.getInt(1));}}}}catch(SQLExceptione){e.printStackTrace();}}publicstaticvoidmain(String...args){Categoriac=newCategoria("Eletrônicos");insert(c);System.out.println(c);}}classCategoria{privateintid;privateStringnome;Categoria(Stringnome){this.nome=nome;}publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetNome(){returnnome;}publicvoidsetNome(Stringname){this.nome=name;}@OverridepublicStringtoString(){return"{id=%d, name=%s}".formatted(this.id,this.nome);}}
J
JotaMoreno
Deu erro no RETURN_GENERATED_KEYS:
“RETURN_GENERATED_KEYS cannot be resolved or is not a field”
W
wldomiciano
Vê se vc importou o Statement correto. O certo é:
importjava.sql.Statement;
É importante checar porque tem uma classe com este mesmo nome, mas o pacote é diferente, é o java.beans.Statement. O correto é java.sql.Statement.
J
JotaMoreno
É, tinha importado um pacote diferente. Troquei o import mas mesmo assim não funcionou, o getId() continua retornando 0.
W
wldomiciano
Me mostra como tá o método insert agora.
J
JotaMoreno
public void insert(Categoria c) { String sql = “insert into tbCategoria (Nome) values (?)”;
Em teoria, se vc colocasse um print logo abaixo de cd.insert(c), vc veria o id atualizado.
Mas se nem tá entrando naquele if, então deve ser outro problema.
Vc pode mostrar o seu CREATE TABLE?
J
JotaMoreno
Então,coloqueioprintagorae,realmente,oidtásaindocerto.Eunãoseioqueestáerrado,masnométodoquepuxaoremover,eupegoonúmerodaposiçãodatabela,essenúmeroéusadocomoparâmetrodeummétodoquepuxaoobjetoqueestánessaposiçãoeesseobjetopassacomoparâmetroproremover.Segueoscódigosparavocêentender:Códigodobotãoexcluir:publicvoidbtExcluirClick(ActionEvente){inti=tab.getSelectedRow();System.out.println("numero da tab "+i);if(i!=-1){intx=JOptionPane.showConfirmDialog(this,“Temcertezaquedesejaexcluirestedado?”,“Confirmação”,JOptionPane.WARNING_MESSAGE);if(x==0){Categoriac=newTableModelCategoria().getCategoria(i);System.out.println("id do categoria q ta no btexcluir "+c.getId());CategoriaDAOcd=newCategoriaDAO();cd.remover(c);this.setVisible(false);this.setVisible(true);}}else{JOptionPane.showMessageDialog(this,“Escolhaalgumdado!”,“Aviso”,JOptionPane.PLAIN_MESSAGE);}}Códigodoremover:publicvoidremover(Categoriac){Stringsql=“deletefromtbCategoriawhereid=?”;