junho 05, 2011

Como retornar o ID de um objeto que acaba de ser salvo no banco?

Em algumas situações é interessante termos acesso ao ID (autonumerado) gerado pelo banco de dados para um objeto recém persistido.

Por exemplo, se estivermos salvando um agregado, composto por alguns objetos, é importante termos acesso ao ID do objeto raíz, para criarmos os relacionamentos nas tabelas de um banco de dados.
Figura 1. Exemplo de Agregado com raíz em 'Pedido'


Sendo assim, vou mostrar como podemos fazer isso utilizando o JDBC. Neste exemplo, utilizei o banco de dados SQL Server 2005 para testes.

/**
* Método que insere objeto no banco e retorna o ID gerado
*/
public int inserir(MeuObjeto obj) throws Exception{

  int idObjeto = 0;
              
  // Algum código para abrir conexão com o banco

  PreparedStatement statement = conn.prepareStatement("INSERT INTO " +
                "minha_tabela " +
                "(meu_objeto_campo1, " +
                "meu_objeto_campo2, " +
                "meu_objeto_campo3) " +
                "VALUES (?, ?, ?)",
                PreparedStatement.RETURN_GENERATED_KEYS);

  statement.setString(1, obj.getAtributo1());
  statement.setString(2, obj.getAtributo2());
  statement.setString(3, obj.getAtributo3());

  statement.executeUpdate();

  // recupera chave do objeto
  ResultSet rs = statement.getGeneratedKeys();

  while(rs.next()){
   idObjeto = rs.getInt(1);
  }

  conn.close();

  // retorna o id do objeto recém inserido
  return idObjeto;
}

O código acima parece muito com que estamos acostumados a fazer, a diferença está na construção do nosso PreparedStatement. Além da SQL que será executada, passamos também o parâmetro PreparedStatement.RETURN_GENERATED_KEYS. É este parâmetro que faz a "mágica" acontecer.

Ao executarmos o statement, o INSERT é realizado e o id gerado pelo banco é retornado em um ResultSet. Desta forma, temos acesso ao id do objeto, recém cadastrado, em nossa aplicação.

0 comentários: