[RESOLVIDO] Java - SQL Update

6 respostas Resolvido
mysqljavaprogramação
A

Como faço pra fazer um update em meu banco de dados com um ArrayList sem os valores de Where?

String instSQL =
“UPDATE iten SET id_movi = ?”
+ “WHERE BP = ?”;

try{
        PreparedStatement ps = conexao.prepareStatement(instSQL);
        String value2 = jcBPsMovi.getSelectedItem().toString();
        ps.setString(1, value2);
        ps.setString(2, (Itens));
        ps.execute();
        System.out.println("Alteração realizada com sucesso.");
        JOptionPane.showMessageDialog(null,
                "Alteração realizada com sucesso.",
                "Realização de alteração no cadastro", 
                JOptionPane.INFORMATION_MESSAGE);
    }catch(Exception e){
        System.out.println("Falha na alteração - "
                            + e.toString());
        JOptionPane.showMessageDialog(null,
                "Falha na alteração - " + e.toString(),
                "Realização de alteração no cadastro.", 
                JOptionPane.ERROR_MESSAGE);
    }

6 Respostas

P

Não percebi o que pretendes. Queres atualizar vários registos com base numa lista ou todos os registos da tabela?

A

eu tenho um ArrayList com nomes, pretendo atualizar coisa numa tabela com base no valores do Array que seria o Where, pensei da seguinte maneira:
String instSQL = “UPDATE iten SET id_movi = ? WHERE BP = ?;”;

while(!Itens.isEmpty()){
        
    try {
        PreparedStatement ps = conexao.prepareStatement(instSQL);
        String value2 = jcListaBPs.getSelectedItem().toString();
        ps.setString(1, value2);


        ps.execute();
        System.out.println("Cadastro realizado com sucesso.");
        JOptionPane.showMessageDialog(null,
                "Cadastro realizado com sucesso.",
                "Realização de cadastro",
                JOptionPane.INFORMATION_MESSAGE);
        buscarBPsMovi();
        listarCategoria();
        buscarNomeMovimentacao();
    } catch (Exception e) {
        System.out.println("Falha no cadastro - "
                + e.toString());
        JOptionPane.showMessageDialog(null,
                "Falha no cadastro - " + e.toString(),
                "Realização de cadastro",
                JOptionPane.ERROR_MESSAGE);
    }

onde a segunda exclamação seria o valor do array, porem o ArrayList nao pode ser convertido pra String e tambem gostaria de pegar um valor do Array por como esta no While

P

Para o que pretendes no SQL usa-se o IN e não o =

UPDATE iten SET id_movi = 'abc' WHERE BP IN ('aaa', 'bbbb', 'cc');

O problema é que o PreparedStatement não suporta diretamente este tipo de parametros. Não podes fazer IN (?) porque depois não há maneira de colocar o conteudo do ArrayList no ponto de interrogação.

Algumas alternativas são:

1 - Construir a query de forma dinamica, colocando tantos ? no IN quantos os teus valores a alterar, separados por virgula ... WHERE BP IN (?,?,?,?) e depois fazer um setString para cada um dos elementos do ArrayList

2 - Construir a query de forma dinâmica, sem utilização dos parametros e colocando os valores diretamente na query. É semelhante ao anterior mas ficas sujeito a ataques de SQL injection se estes valores vem do utilizador e é mais confuso de concatenar porque tens de andar sempre a colocar as '' nos valores.

3 - Construir a query com um update (como tens) e executar várias vezes (preferencialmente com bath update), para os vários parametros.

A

teria algum código pra demostrar?

P

É só pesquisar no google… rapidamente encontrei estes
query dinamica
batch update

A
Solucao aceita

Fiz desta forma e funcionou

try {
// Crie um objeto Statement
Statement stmt = conexao.createStatement();

// Execute o comando SQL
stmt.execute("SET SQL_SAFE_UPDATES=0;");

} catch (Exception ex) {
    ex.printStackTrace();
}
    
    String instSQL = "Select id_movi2 from movi where nome = ?;";
    ResultSet rs = null;
    String result = "";

        try {
            PreparedStatement ps = conexao.prepareStatement(instSQL);
            String value = jcBPsMovi.getSelectedItem().toString();
            System.out.println(value);
            ps.setString(1, value);

// Execute a consulta e obtenha o ResultSet
            rs = ps.executeQuery();

// Verifique se o ResultSet tem pelo menos uma linha
            if (rs.next()) {
                int idInt = rs.getInt("id_movi2");
                idMovi = String.valueOf(idInt);
                System.out.println(idMovi);
            }
            } catch (Exception e) {
// Imprima a pilha de rastreamento para ajudar a depurar o problema
             e.printStackTrace();
            }

    
    while(!Itens.isEmpty()){
try {
    String selectedItem = jcBPsMovi.getSelectedItem().toString();
    System.out.println(idMovi);
    String item = Itens.remove(0);
    String instSQL2 = "UPDATE iten SET id_movi = ? WHERE BP = ?";
    PreparedStatement ps = conexao.prepareStatement(instSQL2);
    ps.setString(1, idMovi);
    ps.setString(2, item);
    ps.execute();
    System.out.println("mudança .");
    JOptionPane.showMessageDialog(null,
            "mudança funcionou.",
            "mudança funcionou",
            JOptionPane.INFORMATION_MESSAGE);
    listarItens();
} catch (Exception e) {
    System.out.println("Falha no update - "
            + e.toString());
    JOptionPane.showMessageDialog(null,
            "Falha no cadastro - " + e.toString(),
            "Realização de cadastro",
            JOptionPane.ERROR_MESSAGE);
}

}

Criado 7 de novembro de 2023
Ultima resposta 8 de nov. de 2023
Respostas 6
Participantes 2