Java + netbeans + banco de dados (RESOLVIDO)

22 respostas
mysql
IgorMag

Bom dia galera, sou novo por aqui.

Estou desenvolvendo um projeto, e nele me foi pedido para quando eu adicionar as informações no
JTable eu conseguir também adicionar no banco de dados (MySQL WorkBench) no caso. Eu sei que o mais comum é alimentar o JTable com o banco de dados, porém nesse caso eu preciso fazer o procedimento contrário e queria saber se isso é possivel? Se consigo pegar o conteudo que eu jogar no JTable e criar um botao adicionar para enviar para o banco de dados.

Obrigado desde já.

Segue a imagem para explicar melhor o que quero fazer, pegar os dados que esta nessa JTable e enviar ao banco de dados.

OBS: O banco de dados já esta montado, com todas as tabelas, já consigo fazer a pesquisa de PEP por ele, está tudo certinho.

22 Respostas

L

Como você adiciona as informações na tabela? Existe um formulário? Existe um botão que adiciona os dados na tabela?
Se for o caso, quando você clicar no botão para inserir os dados, além de inserir, você chama um método que pegue essa instância e passe como parâmetro em uma função que faça o cadastro.

IgorMag

Então nessa tabela em especifico, eu adiciono copiando e colando, por que quem vai usar a ferramenta iria inserir as informações dessa forma, por exemplo copiando umas informações no excel e colando dentro da jtable. Meu problema é o próximo passo ai, como fazer essas informações que coloquei dentro da jtable ir pro banco de dados! Saberia algo sobre isso? Na minha cabeça imagino que teria que ter um comando onde eu setaria as colunas da Jtable, mas não sei por onde começar.

L

Eu fiz este exemplo:

Após eu inserir os dados na tabela, eu seleciono a linha que desejo cadastrar e clico no botão cadastrar.

Segue o código:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    Cliente cliente = new Cliente();
    cliente.setId(Long.parseLong(tabelaCliente.getValueAt(tabelaCliente.getSelectedRow(), 0).toString()));
    cliente.setNome(tabelaCliente.getValueAt(tabelaCliente.getSelectedRow(), 1).toString());
    cliente.setTelefone(tabelaCliente.getValueAt(tabelaCliente.getSelectedRow(), 2).toString());
    cliente.setEmail(tabelaCliente.getValueAt(tabelaCliente.getSelectedRow(), 3).toString());
    
    this.txtId.setText(cliente.getId().toString());
    this.txtNome.setText(cliente.getNome());
    this.txtTelefone.setText(cliente.getTelefone());
    this.txtEmail.setText(cliente.getEmail());
}

No exemplo, eu mandei inserir os dados no formulário, mas no seu caso você chama uma função que faça o cadastro.

Se eu fosse cadastrar os dados do cliente por exemplo, eu iria criar o seguinte método:

public void cadastrarCliente(Cliente cliente) {
    try {
        em.getTransaction().begin();
        em.persist(cliente);
        em.getTransaction().commit();
    } catch (Exception e) {
        System.out.println(e.getMessage());
    } finally {
        em.close();
    }
}

Neste exemplo estou utilizando o Hibernate para persistência dos dados.

IgorMag

Obrigado pelo interesse em me ajudar desde já!
Mas acho que você não entendeu ainda, ali na minha imagem acima, você ve a jTable preenchida, e ela foi preenchida dando um Ctrl C, Ctrl V de uma planilha excel, ao lado você ve o botão de + (no caso de adicionar) o meu intuito pra quem for usar a ferramenta é que quando a tabela estiver preenchida a pessoa clique no botão adicionar e as informações da jTable vá para o banco de dados.

Obs: Eu vi que voce usou campo texto de suporte na sua imagem, e se fosse assim realmente seria mais fácil, porém o procedimento que preciso fazer é exatamente esse que expliquei logo acima.

Tentei reutilizar seu código dessa forma, mas não tive exito:

private void adicionar() {

String sql = "insert into tabge(lista,dat,pep,listec,item,material,txtbre,qtde,um,rncrm,necob,natnf,local,pepaux,projeto) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
    try {
        pst = conexao.prepareStatement(sql);
     
                  
        pst.setlista(jTable1.getValueAt(jTable1.getSelectedRow(), 0).toString()));
        pst.setdat(jTable1.getValueAt(jTable1.getSelectedRow(), 1).toString());
        pst.setpep(jTable1.getValueAt(jTable1.getSelectedRow(), 2).toString());
        pst.setlistec(jTable1.getValueAt(jTable1.getSelectedRow(), 3).toString());
        pst.setitem(jTable1.getValueAt(jTable1.getSelectedRow(), 4).toString());
        pst.setmaterial(jTable1.getValueAt(jTable1.getSelectedRow(), 5).toString());
        pst.settxtbre(jTable1.getValueAt(jTable1.getSelectedRow(), 6).toString());
        pst.setqtde(jTable1.getValueAt(jTable1.getSelectedRow(), 7).toString());
        pst.setum(jTable1.getValueAt(jTable1.getSelectedRow(), 8).toString());
        pst.setrncrm(jTable1.getValueAt(jTable1.getSelectedRow(), 9).toString());
        pst.setnecob(jTable1.getValueAt(jTable1.getSelectedRow(), 10).toString());
        pst.setnatnf(jTable1.getValueAt(jTable1.getSelectedRow(), 11).toString());
        pst.setlocal(jTable1.getValueAt(jTable1.getSelectedRow(), 12).toString());
        pst.setpepaux(jTable1.getValueAt(jTable1.getSelectedRow(), 13).toString());
        pst.setprojeto(jTable1.getValueAt(jTable1.getSelectedRow(), 14).toString());

    } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, e);
    }

}
L

O preparedStatement está sendo usado errado.

Deve ser usado assim. Exemplo:

Se na sua tabela do banco a coluna lista for um varchar, aí no preparedStatement você vai usar o pst.setString(1, jTable1.getValueAt(jTable1.getSelectedRow(), 0).toString()));

Se você quiser setar o id e nome em uma tabela cliente por exemplo, você vai usar o pst assim:

String sql = "insert into cliente (id, nome) values (?, ?)";
pst = conexao.prepareStatement(sql);
pst.setInt(1, cliente.getId());
pst.setString(2, cliente.getNome());
pst.execute();
IgorMag

O que mais posso fazer? Depois do print tentei colocar Int onde está Int e Date onde está date porém continua com erro.

L

O ideal era você ter classes somente para fazer a conexão com o banco. Tipo ClienteDAO, onde dentro desta classe você faria o CRUD por exemplo. Você deveria estudar sobre padrões de projeto, modelo MVC e etc…

IgorMag

Mas meu banco de dados ta funcionando perfeitamente, vou mostrar a outra tela onde eu excluo e edito o que quero e vai direto pro BD.

E estou usando a mesma conexao do ModuloConexao que eu criei e puxando da mesma forma com o pst e PreparedStatement… creio que o código da setagem mesmo pode estar errado, sei lá… que jTable complicado…

L

Acabei de fazer a mesma coisa em um pequeno exemplo aqui…

Tudo certo…

L

Tira um print do erro por favor…

L

Amigo, se você está querendo evoluir, começa a usar JPA com Hibernate em vez de JDBC.

IgorMag

e quando executo aparece esses erros:

Exception in thread AWT-EventQueue-0 java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: br.com.gem.telas.Tela_Adicionar_Imprimir.initComponents

at br.com.gem.telas.Tela_Adicionar_Imprimir.(Tela_Adicionar_Imprimir.java:33)

at br.com.gem.telas.TelaPrincipal.jMenuItem1ActionPerformed(TelaPrincipal.java:230)

at br.com.gem.telas.TelaPrincipal.access$200(TelaPrincipal.java:18)

at br.com.gem.telas.TelaPrincipal$3.actionPerformed(TelaPrincipal.java:125)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)

at javax.swing.AbstractButton.doClick(AbstractButton.java:376)

at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:842)

at javax.swing.plaf.basic.BasicMenuItemUI$Handler.menuDragMouseReleased(BasicMenuItemUI.java:952)

at javax.swing.JMenuItem.fireMenuDragMouseReleased(JMenuItem.java:586)

at javax.swing.JMenuItem.processMenuDragMouseEvent(JMenuItem.java:483)

at javax.swing.JMenuItem.processMouseEvent(JMenuItem.java:429)

at javax.swing.MenuSelectionManager.processMouseEvent(MenuSelectionManager.java:339)

at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:888)

at java.awt.Component.processMouseEvent(Component.java:6539)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)

at java.awt.Component.processEvent(Component.java:6304)

at java.awt.Container.processEvent(Container.java:2239)

at java.awt.Component.dispatchEventImpl(Component.java:4889)

at java.awt.Container.dispatchEventImpl(Container.java:2297)

at java.awt.Component.dispatchEvent(Component.java:4711)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)

at java.awt.Container.dispatchEventImpl(Container.java:2283)

at java.awt.Window.dispatchEventImpl(Window.java:2746)

at java.awt.Component.dispatchEvent(Component.java:4711)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)

at java.awt.EventQueue.access$500(EventQueue.java:97)

at java.awt.EventQueue$3.run(EventQueue.java:709)

at java.awt.EventQueue$3.run(EventQueue.java:703)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)

at java.awt.EventQueue$4.run(EventQueue.java:733)

at java.awt.EventQueue$4.run(EventQueue.java:731)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
L

Parece ser erro de sintaxe, expected “;”

Parece ter um ) a mais em cada linha.

IgorMag

Era isso mesmo o erro, ai compilei, mas não fez a adição! :pensive::triumph:

como se tivesse tudo certo, mas quando pesquisei no banco não achei

L

Claro amigão, está faltando o pst.execute() :expressionless:

IgorMag

Eu tinha colocado. Mas deu outro erro:

L

Então, você precisa selecionar a linha que vc acabou de preencher na tabela.

L

Em seguida, vc clica no botão para fazer o insert no banco. Este método getSelectedRow() pega a linha em questão.

IgorMag

Cara! Muuuuuuuuuuuuuuuuuuuuuito obrigado! é meu primeiro post aqui, valeu demais mesmo! Sei que tenho que estudar muito e melhorar muito, mas valeu velho! (RESOLVIDO).

L

:grin::wink:

Implementa JOptionPane.showMessageDialog() para exibir a mensagem de cadastro efetuado com sucesso logo após do pst.execute(). :wink:

IgorMag

Bom dia, sem querer reabrir o problema, mas eu tive a impressão aquele dia que estava adicionando tudo que havia dentro da jTable, hoje que fui utilizar na prática mesmo e vi que só esta adicionando na verdade uma linha por vez, se eu colocar por exemplo 15 informações la e adicionar, ele só adiciona a primeira linha, mesmo selecionando a tabela toda. Teria algum FOR ou laço que você saberia me dizer que se eu colocar no código faz adicionar mais de uma informação por vez?

G

Faça um loop…for, while, etc. A cada repetição do loop incremente 1 na variável que referencia o número da linha que será adicionada e pronto, todas as linhas irão para a DB.

Criado 11 de dezembro de 2020
Ultima resposta 1 de fev. de 2021
Respostas 22
Participantes 3