Inserir registro usando Auto-incremento do PostgreSQL

Prezados colegas,

Estou inciando estudos para utilizar JDBC com PostgreSQL 8.3, baseados em exemplos conseguidos na Internet, e tenho as seguintes dúvidas:

  • O que significa cada interrogação neste trecho do código abaixo?
insert into Pessoa (id, nome, email, telefone) values(?,?,?,?)
  • Qual o relacionamento entre o código abaixo e as interrogações no trecho do código acima (os algarismos 1, 2, 3 e 4 - as interrogações, e os métodos pessoa.getId(), pessoa.getNome(), pessoa.getEmail e pessoa.getTelefone) ?
         
         comandoSQL.setLong(1, pessoa.getId());
         comandoSQL.setString(2, pessoa.getNome());
         comandoSQL.setString(3, pessoa.getEmail());
         comandoSQL.setString(4, pessoa.getTelefone());
  • Admintindo-se que na modelagem do Banco de Dados em PostgreSQL, o campo id é do tipo SERIAL (auto-incremento), como “informar” ao programa Java que este será gerado automaticamente, sem receber algum dado da janela de cadastro?

Segue abaixo o trecho do código que estou estudando, para melhores entendimentos:


package dao;

import beans.Pessoa;
import conexao.Conexao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class DaoPessoa {
   public DaoPessoa() {
   }

//GRAVAR
//====================================

   public boolean grava(Pessoa pessoa) {
      try {
            PreparedStatement comandoSQL;
            
            comandoSQL = Conexao.getInstance().prepareStatement("insert into Pessoa (id, nome, email, telefone) values(?,?,?,?)");
            
            comandoSQL.setLong(1, pessoa.getId());
            comandoSQL.setString(2, pessoa.getNome());
            comandoSQL.setString(3, pessoa.getEmail());
            comandoSQL.setString(4, pessoa.getTelefone());
            
            comandoSQL.execute();

            Conexao.getInstance().commit();

            return true;
         } catch (SQLException e) {
                e.printStackTrace();
         }
      return false;
   }


//ALTERAR
//====================================

   public boolean atualiza(Pessoa pessoa) {

      try {
           PreparedStatement comandoSQL;

           comandoSQL = Conexao.getInstance().prepareStatement("update Pessoa set nome = ? where id = ? ");
           
           comandoSQL.setString(1, pessoa.getNome());
           comandoSQL.setString(2, pessoa.getEmail());
           comandoSQL.setString(3, pessoa.getTelefone());
           
           comandoSQL.execute();

           Conexao.getInstance().commit();

      } catch (SQLException e) {
           e.printStackTrace();
      }
      return false;
   }


//DELETAR
//=====================================

   public boolean deleta(Pessoa pessoa) {
      try {
           PreparedStatement comandoSQL;

           comandoSQL = Conexao.getInstance().prepareStatement("delete from Pessoa where id = ?");
         
           comandoSQL.setLong(1, pessoa.getId());

           comandoSQL.execute();

           Conexao.getInstance().commit();

      } catch (SQLException e) {
             e.printStackTrace();
    }
     return false;
   }


//LISTAR TODOS
//=====================================

   public List lista() {
      try {

            PreparedStatement comandoSQL;

            comandoSQL = Conexao.getInstance().prepareStatement("select * from Pessoa");

            ResultSet rs = comandoSQL.executeQuery();

            List arlPessoas = new ArrayList();

            while (rs.next()) {
                 Pessoa pess = new Pessoa();
                 
                 pess.setId(rs.getLong("id"));
                 pess.setNome(rs.getString("nome"));
                 pess.setEmail(rs.getString("email"));
                 pess.setTelefone(rs.getString("telefone"));
                 arlPessoas.add(pess);
           }
             return arlPessoas;
          // conexao.commit();
      } catch (SQLException e) {
            e.printStackTrace();
      }
         return null;
   }


//CONSULTA ESPECIFICA POR CAMPOS
//=====================================

    public Pessoa consulta(int pk) {

          try {

               PreparedStatement comandoSQL;
               
               comandoSQL = Conexao.getInstance().prepareStatement("select * from Pessoa where id=?");
               comandoSQL.setInt(1, pk);
               ResultSet rs = comandoSQL.executeQuery();

               if (rs.next()) {
                  Pessoa pess = new Pessoa();
                  pess.setId(rs.getLong("id"));
                  pess.setNome(rs.getString("nome"));
                  pess.setEmail(rs.getString("email"));
                  pess.setTelefone(rs.getString("telefone"));
                  
                 return pess;
             }
                 } catch (SQLException e) {
                     e.printStackTrace();
                    }
             return null;
   }
}

Agradecendo antecipadamente qualquer ajuda possível,

atenciosamente

Augusto Cesar

Olá Augusto

Então quando você coloca o campo na tabela (serial) ou autoincremente, você não precisa especificar o valor dele no código.
Com isso seu script SQL ficaria assim:

O próprio banco de dados se ajusta para adicionar o valor do ID.
Se você tem curiosidade de saber como ele faz isso, seja no Postgre, uma guia de Seqüêcias (sequence).
Lá você vai ter mais informações de como esta indexado, de que número parte, qual o incremento, o maximo valor que pode alcançar e etc.

Lembrando que não vai precisar mais setar o valor do id via código
Remover essa linha: comandoSQL.setLong(1, pessoa.getId());

Espero ter ajudado.
Até mais

Obrigado aí pela ajuda, Thiago!

Mas para melhor esclarecimento: quando uso o SQL para inserir dados em uma tabela no Postgres, a qual possui um campo tipo Serial, uso a seguinte instrução:

insert into tabela (id, nome) values (default, "augusto");

ou

insert into tabela (id, nome) values (nextval(tabela_de_sequencia), "augusto");

E num código Java? Não existe a necessidade de utilizar o default ou nextval?

Obrigado aí mais uma vez pelas ajudas.

Augusto