Resultado de um ArrayList dentro de uma String sql

6 respostas
javasql
S

Bom dia pessoal venho tirar uma duvida com você afim de aprimorar meus conhecimentos.

Tenho um método que recupera os valores do banco e verifica os que são nulos, ate ai tudo bem,
mas estou tentando fazer um update neste campo onde contém os valores nulos, mas a minha duvida é,
como posso fazer para criar um update onde eu possa passar os valores do id para o script sql sem ter que chama-lo varias vezes.

Ex: em um update direto faríamos assim: update tabela set coluna = ? where id in(?). usando o in para vários valores eu gostaria de variar os valores da coluna e do id sem precisar repetir a chamada do sql toda vez que fizer a chamada do método de atualização.

Codigo:
Tenho duas classes uma DAO que tras os registros contendo o campo a ser atualizado com valores nulos e uma classe que recupera estes valores e chama o metodo de atualização para alterar os registros da tabela produto1.

public void UpdadeProduto1(String valorParaAtualizar, int codigoID) throws ClassNotFoundException, SQLException{ 
    Connection con = ConectaBD.getConnection(banco);
    PreparedStatement stmt = null;
    String sql = "UPDATE tabela SET coluna = "+valorParaAtualizar+" WHERE codigoID in ("+codigoID+")";
    
    try {
        
        stmt = con.prepareStatement(sql);
        stmt.executeUpdate();
        
        JOptionPane.showMessageDialog(null, "Informações salvas com sucesso.");
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "Erro ao atualizar informações na tabela. " + ex);
    }finally{
        ConectaBD.closeConnection(con, stmt);
    }
}

private void comparaResultados() throws ClassNotFoundException, SQLException, Exception {
    Banco1 b1dao = new Banco1DAO();
    Banco2 b2dao = new Banco2DAO();
    List<Produtos1> listab1 = b1dao.listaProdutos1();
    List<Produtos2> listab2 = b2dao.listaProdutos2();
    StringBuilder sb = new StringBuilder();
    lblResult.setText(String.valueOf(listaf.size()));

    for (Banco2  b2 : listab2) {
        for (Banco1 b1 : listab1) {
            if (b1.getCodProd1().equals(b2.getCodProd2())) {
                 b1dao.UpdadeProduto1(b2.getCampoParaAtualizar,b1.getCodID);
            }
        }

    }
    
    txtAreaRes.append(sb.toString());

}

Neste exemplo eu tenho um metodo na classe Banco1DAO que traz somente os registros que contiverem valores nulos na tabela produto1.

Tudo isso é uma representação do meu problema, mas tentei implementar desta forma.
Será que poderia fazer de uma forma mais otimizada e como eu faria a chamada do metodo update sem repetir toda a instrução sql?

6 Respostas

D

Se estiverem no mesmo banco, encontrei um link que poderá ajudar:

Caso contrário, se o CodProd 1 e 2 forem únicos, após o update coloque um break, pois esperasse que não haja um outro com o mesmo cod:

if (b1.getCodProd1().equals(b2.getCodProd2())) {
             b1dao.UpdadeProduto1(b2.getCampoParaAtualizar,b1.getCodID);
             break;
        }
S

São bancos diferentes, mas eu consigo fazer a comparação eu conecto nos dois e busco os registro, o único problema que estou tendo e na chamada do método de atualização, se existir muito registro ele é chamado muitas vezes, isso que estou tentando evitar.

D

Não sei se isso ajuda, nunca testei ou fiz algo parecido:

http://www.mkyong.com/jdbc/how-to-run-a-mysql-script-using-java/

No artigo acima executa um arquivo sql usando uma biblioteca, poderia criar um “arquivo virtual” contendo os scripts para a atualização, neste caso usaria o StringReader em vez do FileReader, isso teoricamente seria executado uma única vez.

https://docs.oracle.com/javase/7/docs/api/java/io/StringReader.html

D

Pesquisei um pouco mais e talvez fosse melhor usar o “SQL Batch”

S

vou fazer uns teste e posto o resultado, por enquanto muito obrigado pelas dicas.

S

Pessoal consegui resolver com um StringBuilder e configurar as informações e defini-las em uma string separada por virgula, com replace. Obrigado a todos por postarem sua opinião.

Criado 7 de março de 2018
Ultima resposta 17 de mai. de 2018
Respostas 6
Participantes 2