Inserir dados de uma List em um banco de dados

9 respostas
welington2502

Boa noite pessoal…

parte do meu projeto academica esta chegando ao final, mas agora estou emperrado na hora de gravar uma List no banco.
essa parte do programa é os produtos que aparecem em uma Jtable e são gravados em uma List. até aqui funciona bem, mas como fazer a Lógica de gravar no banco de dados?
Se alguem tiver algum exemplo ou link será bem vindo…

T+

9 Respostas

williamdasflores

Faz um “for”, aí dentro desse “for” você faz os inserts no banco.

welington2502

Obrigado por responder seria algo +/- assim?

public void setInserirPedido(Venda venda) {

        //////////// inserir o Pedido
              List<Produto> listaComboBox = new ArrayList<Produto>();

        try {

            stmt = con.prepareStatement("INSERT INTO pedido(fkidcliente, fkidbairro, desconto, valorbairro) VALUES (?, ?, ?, ?)");

            for (int i = 0 ; i < listaComboBox.size() ; i++ ){

            stmt.setInt(1, venda.getCliente().getId());
            stmt.setInt(2, venda.getBairro().getIdBairro());
            stmt.setDouble(3, venda.getDesconto());
            stmt.setDouble(4, venda.getBairro().getValorBairro());
            stmt.execute();
            }
            stmt.close();
            JOptionPane.showMessageDialog(null, "inserido o pedido!");

        } catch (SQLException xx) {
            System.out.println("Erro VendaDAO setInserirPedido, (Inserir Pedido): " + xx.getMessage());
        }
    }
williamdasflores

Só coloca o SQL dentro do for também, assim

for (int i = 0 ; i < listaComboBox.size() ; i++ ){  
 stmt = con.prepareStatement("INSERT INTO pedido(fkidcliente, fkidbairro, desconto, valorbairro) VALUES (?, ?, ?, ?)");

 stmt.setInt(1, venda.getCliente().getId());  
 stmt.setInt(2, venda.getBairro().getIdBairro());  
 stmt.setDouble(3, venda.getDesconto());  
 stmt.setDouble(4, venda.getBairro().getValorBairro());  
 stmt.execute();  
}
stmt.close();  
JOptionPane.showMessageDialog(null, "inserido o pedido!");
welington2502

Valeu vou testar aqui.

ViniGodoy

O ideal é não colocar o SQL dentro do for.

Se quiser fazer bem certinho, também dê uma olhada nos métodos de batchUpdate().

williamdasflores

ViniGodoy,
No caso de usar batchUpdate(), você poderia me dar um exemplo de como eu faria essa inserção?

ViniGodoy

public void setInserirPedido(Venda venda) { List&lt;Produto&gt; listaComboBox = new ArrayList&lt;Produto&gt;(); String query = &quot;INSERT INTO pedido(fkidcliente, fkidbairro, desconto, valorbairro) VALUES (?, ?, ?, ?)&quot;; try (stmt = con.prepareStatement(query)) { for (int i = 0 ; i &lt; listaComboBox.size() ; i++ ){ stmt.setInt(1, venda.getCliente().getId()); stmt.setInt(2, venda.getBairro().getIdBairro()); stmt.setDouble(3, venda.getDesconto()); stmt.setDouble(4, venda.getBairro().getValorBairro()); stmt.addBatch(); } stmt.executeBatch(); JOptionPane.showMessageDialog(null, &quot;inserido o pedido!&quot;); } catch (SQLException xx) { throw new RuntimeException(&quot;Erro VendaDAO setInserirPedido, (Inserir Pedido): &quot;, xx); } }

Estranho, reescrevendo o código percebi que o for não usa nenhum dado da lista.
Então, pra que você está fazendo o for? Não deveria fazer get em algum momento da lista?

williamdasflores

Entendi, agora ViniGodoy pq o ideia é não colocar o SQL dentro do for?

ViniGodoy

Quando um SQL é enviado para o banco, a base de dados gera um plano de execução. Ou seja, ele compila a query, otimiza, escolhe para ela os melhores índices, carrega as triggers e constraints e deixa o banco “preparado” para executá-la. Por isso o comando chama-se PrepareStatement.

A diferença de um PreparedStatement de um Statement comum, é que justamente o PreparedStatement permite que você faça todo esse setup apenas uma vez, e envie para ele apenas os dados na sequência, dispensando a necessidade do banco refazer todo esse processo de compilação. Isso agiliza muito queries que rodem dentro de fors, porém, como o banco é obrigado a manter o estado dessa compilação ativo, tem (um pouco) menos performance caso você queira rodar a query sozinha (a diferença é tão pequena que geralmente não compensar o risco de ter SQL injection). Isso sem contar o tempo que leva para a query circular pela rede, que no caso de deixa-la dentro do for também será duplicado.

O batchUpdate é outra otimização. Mandar um dado por vez é menos eficiente não por causa do banco, mas do canal de comunicação. Você usa a rede query-por-query, assim, cada transmissão de dados irá sofrer delay do canal, e isso pode deixar o banco ocioso, aguardando queries. No caso do batchUpdate, você monta para o banco um “pacotão”, com vários dados, e então manda uma única grande massa de dados para o BD (muitos protocolos são inclusive capazes de compactar esse pacote, para otimizar banda de rede). O banco então pega o Statement preparado e executa rapidamente para todo o batch, sem ter que ficar esperando nada. Só deve-se cuidar no caso do batchUpdate pois é necessário ter memória para armazenar o batch. Por isso, caso sua query tenha muitos registros, você deve organizar batchs com algum limite, como 200 em 200 registros.

Criado 21 de maio de 2012
Ultima resposta 22 de mai. de 2012
Respostas 9
Participantes 3