SetString no JDBC

Olá pessoa, sou inciante , é a primeira vez q abro um tópico aqui então me perdoe qualquer vacilo ok ?
vamos ao problema,
uso o JDBC pra obter informações com o banco de dados Postgres, assim como também inserir dados usando o PreparedStatement.

tenho este método que segue abaixo:

public static int updateHoras(ArrayList<String[]> mats, String mes) throws SQLException{
String ddl = “update Competencia”+Controle.ano+" set “+mes+” = ? where BASE = ‘SALDO’ and id = ?";
PreparedStatement pstdados =
AcessaBD.connection.prepareStatement(ddl, tipo, concorrencia);
int dados = 0;

    for(int i = 0; i < mats.size(); i++){
        
        pstdados.setString(1, mats.get(i)[1]);
        pstdados.setLong(2, Long.parseLong(mats.get(i)[0]));
        dados = pstdados.executeUpdate();
    }
   
    
    return dados;
}

pois bem, o setString e o setLong não tão passando os dados no “?” como deveria acontecer,
se observarem a “gambiarra” que fiz com as concatenações de string é o único jeito q ta dando certo de passar parâmetros pelo PreparedStatement; uso o NetBeans,
será q ta desconfigurado algo?

porque ja revirei tudo quanto conteúdo de JDBC e minha sintaxe ta correta, não tem segredo
o setString deveria substituir o ? por uma String e o setLong substituir por um Long,

alguém tem uma solução que não precise mudar de IDE ??

Desde já agradeço

Boa noite, uma observação: Não faça concatenação com PreparedStatmente.
O update e insert são bem parecidos.
Segue o exemplo:

 public void inserirPessoa(Pessoa pessoa) throws Exception {
        Connection con;//esta variável recebe a conexão do banco de dados
        PreparedStatement stmt = null;
        String sql = "insert into tb_pessoa (nome, idade) values (?,?)";
        try {
            stmt = con.prepareStatement(sql);
            stmt.setString(1, pessoa.getNome());
            stmt.setInt(2, pessoa.getIdade());
            stmt.executeQuery();
        } catch (Exception e) {
            throw e;
        } finally {
            //finaliza conexão com o banco de dados, PreparedStatement e ResultSet, caso seja uma consulta.
            //é importante que as conexões sejam finalizadas após uma interação com o banco de dados.
        }

Obrigado pela dica, vou usaro finally para encerrar as conexões,
quanto a concatenação, foi uma solução que usei para o bug com o .setString;
os primeiros métodos tava funcionando direitinho, quando começou a ficar maior bugou .

O setString (ou setqqcoisa) funiciona para valores que queres ler / inserir em colunas, não funciona para nomes de colunas ou tabelas. Aí terás sempre de fazer concatenação.

cara, será ? descordo hein ,
para ler teria que ser “get”

“set” para atribuir
"get" para ler

Quando falei em ler estava a referir-me a selects e fazer set de um parâmetro nesse select.

os dados q estou passando por parametro no PreparedStatement são dados que quero inserir nas colunas

Eu estava a responder ao facto de teres concatenação para mes e Controle.ano. Não tens outra hipótese neste caso.
Para os teus set, deveria funcionar sem problema.

Porque dizes que não funciona?
Dá erro?
Não atualiza nada na BD (neste caso pode ser problema de transação)?

não atualiza nada na string,
dei alguns "System.out.println(Strings)"
pra ver o q estava sendo lido e os “?” continuam lá

A IDE não tem nada a ver com o seu problema.

Qual o conteúdo do objeto mats ?

mats é um ArrayList<String[]> … onde mats.get(i)[1] é uma String que contém o que quero inserir no banco e mats.get(i)[0] é uma matrícula por isso estou usando o método Long.parseLong…

então a ideia era : (ignorando as concatenações)

String ddl = “update Competencia set mes = ? where BASE = ‘SALDO’ and id = ?”;

onde:

pstdados.setString(1, mats.get(i)[1]); //atribuiria o dado a ser inserido no banco
pstdados.setLong(2, Long.parseLong(mats.get(i)[0])); // o id da tupla a ser inserido o dado

dentro de um for para percorrer todo o ArrayList<String[]>

Ah…

Você está realizando um UPDATE, então tem que usar o método executeUpdate, que serve para realizar operações que não retornam resultado, como o INSERT, DELETE e UPDATE.

O método executeQuery é para realizar operações que retornam resultado, como o SELECT, tanto que ele retorna um objeto do tipo ResultSet.

A string não muda, continuas a ver os ?. A substituição é feita só na escrita para a Base de Dados.

O senhor está corretíssimo,
fiz alguns testes aqui e realmente na saída do ide não há alterações, o problema da minha aplicação deve ser algo no banco , sendo assim vou encerrar o tópico

grato.