Pegar campos automaticamente

Boa noite pessoal.
Tenho uma JTable que está populada com nomes de tabelas e colunas que tenho no meu banco de dados e depois o sistema precisa varrer esse JTable, pegar o nome das tabelas e colunas, fazer um SELECT e INSERIR em outra tabela.
Até aí, tudo bem. O problema é que se eu colocar mais de um campo na JTable o sistema não entende esse novo campo e gera erro (não se se expliquei bem).

Segue o código que fiz.

ArrayList<String> ad = new ArrayList<>();
ArrayList<String> ab = new ArrayList<>();

// Aqui adiciono os dados do RESULTSET resultset.getString(1), resultset.getString(2)...
ad.add("TABELA_X"); 
ab.add("TABELA_Z"); 

Statement insDestino = con.sqlServer(dadosConexao.getServidorDestino(), dadosConexao.getPortaDestino(), dadosConexao.getBancoDeDadosDestino(), dadosConexao.getUsuarioDestino(), dadosConexao.getSenhaDestino()).createStatement();
// ad.get(ad.size()-1)  coloquei assim para pegar a última linha como teste
insDestino.executeUpdate("INSERT INTO TABELA (CAMPO A, CAMPO B) VALUES ('" + ad.get(ad.size()-1) + "', '" + ab.get(ab.size()-1) + "');");
insDestino.close();

Esse código funciona, mas se eu adicionar mais uma coluna na tabela terei que criar outro ArrayList e adicionar os dados do RESULTSET, preciso que o sistema entenda a quantidade de COLUNAS e pegue os dados corretamente para fazer o INSERT.

Valeu galera, obrigado.

Poste o erro que está dando.
A jTable é Default ou Abstract?
Usa um TableModel?
Para popular está montando um objeto?

Opa @fabiio2 o erro eu falei, ele exibe a mensagem falando que tem mais informações do que colunas e por isso não faz o INSERT. Se colocar o código do INSERT com apenas uma ou duas linhas na JTable funciona, porém, acima de duas linhas dá erro.
Preciso de uma ideia de como fazer para que o sistema entenda as colunas e pegue os dados perfeitamente para fazer o INSERT.

Na verdade, a JTable não importa pois a mesma está recebendo os dados exatamente como preciso (meu problema não está na JTable).
Estou pegando os dados da JTable de boa.

A ideia é a seguinte:
1 - Populo o JTable com o nome da TABELA e COLUNAS do banco - OK
2 - Faço um SELECT(com RESULTSET) com a(s) TABELAS que estão no JTable com suas respectivas COLUNAS - OK
3 - Pego os dados do RESULTSET e faço o INSERT em outra tabela do banco - OK
4 - Preciso que o sistema entenda a quantidade de colunas (de uma determinada tabela) que estão no JTable, pegue os dados de cada coluna a faça a inserção em outra tabela (que irei definir).

Esse é o processo que estou fazendo.

É meio difícil de explicar :wink:

Abraço.

Eu uso o método getValueAt() herdado de AbstractTableModel para percorrer minha tabela e montar um objeto para manipular.

Poste exatamente o erro que ocorre para podermos ajudar.

@fabiio2 fiz uma estrutura no código que ficou legal, acho que só falta um detalhe para resolver o problema.

// AQUI TEM O RESULTSET (APENAS UM SELECT)
Statement selOrigem = con.postGreSql(dadosConexao.getServidorOrigem(), dadosConexao.getPortaOrigem(), dadosConexao.getBancoDeDadosOrigem(), dadosConexao.getUsuarioOrigem(), dadosConexao.getSenhaOrigem()).createStatement();
ResultSet rs = selOrigem.executeQuery("SELECT CAMPOS FROM TABELA");

//VARIAVEL ARRAYLIST PARA RECEBER OS DADOS
ArrayList<String> ac = new ArrayList<>();
//PERCORRE O RESULTSET
while (rs.next()) {
       //CONTA A QTDE DE COLUNAS QUE TEM NO RESULTSET
       for(int a = 1; a <= rs.getMetaData().getColumnCount(); a++) {
                ac.add(rs.getString(a).trim());
       }
}
                                                    
System.out.println(ac);

A saída é:
[POSTGRE A, TEXTO A, POSTGRE B, TEXTO B, POSTGRE C, TEXTO C]

A quantidade de colunas do RESULTSET são duas, preciso que a saída seja assim:
[POSTGRE A, TEXTO A]
[POSTGRE B, TEXTO B]
[POSTGRE C, TEXTO C]

Onde a COLUNA A possui as informações (POSTGRE A, POSTGRE B, POSTGRE C) e a COLUNA B (TEXTO A, TEXTO B, TEXTO C).

Só preciso fazer essa separação mas não sei como.

Abraço e obrigado.

Faça assim.

ArrayList<String[]> ac = new ArrayList<String[]>();

while (rs.next()) {
    String[] objeto = new String[2];
    objeto[0] = rs.getString(campoA);
    objeto[1] = rs.getString(campoB);    
    ac.add(objeto);
}

@fabiio2 Consegui resolver, mas de outra forma.
Do jeito que você postou, teria que entrar um for ficar para contar o OBJETO de acordo com as linhas do JTable.

Meu código ficou assim:

while (rs.next()) {
// LIMPA O ARRAYLIST (DESSA FORMA TODA VEZ QUE PERCORRER LIMPA O ARRAY E ADICIONA A PRÓXIMA LEITURA
dados.clear();
//FOR QUE VERIFICA A QTDE DE COLUNAS NO RESULTSET
   for(int a = 1; a <= rs.getMetaData().getColumnCount(); a++) {
       //ADICIONA OS DADOS NO ARRAYLIST
       dados.add("'"+rs.getRef(a)+"'");
   }
                                                        
//AQUI FAZ O INSERT NA TABELA DESTINO
}

Agora funcionou :slight_smile:
Obrigado pela ajuda

Uma dica:

Enquanto não trabalha com JPA, procure usar PreparedStatement.
É melhor e evita sql injection.

@fabiio2 costumo usar PreparedStatement mesmo :slight_smile:
Valeu pela dica