Java - Dúvidas no ResultSet.getInt

Olá pessoal, é a primeira vez que uso o Guj. Estou com uma dúvida…
Bom eu sei que quando eu quero pegar o id gerado eu uso:

Int var = rs.getInt(1);

Esse 1 é o índice da minha coluna ?
Porque eu criei outra tabela e coloquei:
NOME, CPF, ID.
Então o meu índice não deveria ser 3 ? Pois ele não acompanha a coluna ?
Porém se eu coloco Int var = rs.getInt(3);
Ele explode um erro de ColumnIndex 3 > 1… Porque ?

Sim, este 1 representa o índice da coluna. No caso vc estaria solicitando a primeira coluna.

Só que este índice nem sempre está relacionado com a posição da coluna no banco de dados.

Se no seu SELECT vc listar as colunas que vc quer, este índice estará relacionado com a posição em que a coluna aparece nesta lista. Por exemplo:

try (final PreparedStatement statement = conn.prepareStatement("SELECT * FROM cliente")) {
  final ResultSet resultSet = statement.executeQuery();

  if (resultSet.next()) {
    System.out.println(resultSet.getInt(3));
  }
}

O código acima retorna o resultado desejado, pois o asterisco traz as colunas na ordem em que foram criadas. Porém…

try (final PreparedStatement statement = conn.prepareStatement("SELECT id, cpf, nome FROM cliente")) {
  final ResultSet resultSet = statement.executeQuery();

  if (resultSet.next()) {
    System.out.println(resultSet.getInt(3));
  }
}

O código acima gera erro, pois é o nome que está na terceira posição da query e ele não pode ser convertido para int.

try (final PreparedStatement statement = conn.prepareStatement("SELECT nome FROM cliente")) {
  final ResultSet resultSet = statement.executeQuery();

  if (resultSet.next()) {
    System.out.println(resultSet.getInt(3));
  }
}

O código acima gera o erro que vc mencionou, pois eu estou trazendo apenas uma coluna, mas estou tentando acessar a terceira, isto é, estou tentando acessar o índice de uma coluna que não existe na query.

Por isso eu acredito que o problema pode estar em como vc montou seu SELECT.

Mas imagine que na 3 coluna eu coloquei id que no caso é int… Nao deveria retornar resultset.getint(3) ? Sendo que é o índice ? Sendo que o id esta listado na 3 coluna ?

Se o seu SELECT está correto, com pelo menos 3 colunas, realmente é estranho.

Para te ajudar só eu vendo como vc fez exatamente e testando mesmo. Se quiser, mostra seu código para eu testar.

Só um minuto

Create table estado {
Nome…
Local…
Id… Pk
}

resultset.getInt(3);

Quando eu coloco getInt(1) o resultado vem…
Independentemente da onde a coluna está…

Talvez o Index não tem haver com o jeito que tu cria a tabela… E sim pelo id…

Então, é como eu disse, tem a ver com a ordem das colunas no SELECT.

Se vc mostrar seu código eu posso tentar rodar aqui.

package modelo;
/**
*

  • @author ED
    */
    public class Telefone{
    private int id_Telefone;
    private String telefone_Pessoal;
    private String telefone_Fixo;

    public int getId_Telefone() {
    return id_Telefone;
    }

    public String getTelefone_Pessoal() {
    return telefone_Pessoal;
    }

    public void setTelefone_Pessoal(String telefone_Pessoal) {
    this.telefone_Pessoal = telefone_Pessoal;
    }

    public String getTelefone_Fixo() {
    return telefone_Fixo;
    }

    public void setTelefone_Fixo(String telefone_Fixo) {
    this.telefone_Fixo = telefone_Fixo;
    }

    public void setId_Telefone(int id_Telefone) {
    this.id_Telefone = id_Telefone;
    }

}

public void salvar_Telefones(Telefone telefones) throws SQLException{
Connection conexao_Banco_Dados = Conexao_Banco_Dados.getConexaoBD();
try{
PreparedStatement stmt = conexao_Banco_Dados.prepareStatement(“insert into”
+ " telefone (telefone_pessoa, telefone_fixo) values "
+ “(?,?)”,PreparedStatement.RETURN_GENERATED_KEYS);
stmt.setString(1, telefones.getTelefone_Fixo());
stmt.setString(2, telefones.getTelefone_Pessoal());
//vamos jogar no banco de dados usando o
comando a baixo
stmt.executeUpdate(); //executar e atualizar la dentro
ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) {
telefones.setId_Telefone(rs.getInt(3));
}
}catch(SQLException error){
throw new SQLException("FALHA AO INSERIR TELEFONE "+error);
}
}

Ah, agora ficou mais claro o seu problema.

O método getGeneratedKeys() retorna os ids que foram auto-gerados pelo banco. Ou seja, ele retorna apenas uma coluna contendo estes ids.

É por isso que vc vê aquele erro quando invoca getInt(3). O correto é usar getInt(1) mesmo, pois só há uma coluna neste ResultSet.

Como assim 1 coluna ? Nao sao 3 ?

Não. Quando vc faz isso:

ResultSet rs = stmt.getGeneratedKeys();

Ele retorna apenas um coluna contendo os ids gerados. Dá uma olha na doc:

https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#getGeneratedKeys--

Ah, experimenta colocar um print tipo assim:

ResultSet rs = stmt.getGeneratedKeys();
System.out.println(rs);

Vc vai ver algo assim no console:

LocalResultImpl@1697f2b3 columns: 1 rows: 1 pos: -1

No caso dizendo que só tem uma coluna e uma linha.