Wednesday, January 16, 2013

Insert em table c/ id auto incremento utilizando JdbcTemplate do Spring JDBC

A classe JDBCTemplate é parte do Spring JDBC, utilizada para reduzir o volume de instruções/código na definição dos comandos para o banco de dados, executado via JDBC.

A seguir um trecho de código com um DAO para entidade Cliente, que demonstra como é simples utilizar o insert via JdbcTemplate:

import org.springframework.jdbc.core.JdbcTemplate;

public class ClienteDAO {
  
  private JdbcTemplate jdbcTemplate; //set p/ injecao...

  public void insert(Cliente clie) {
    final String sql = "INSERT INTO CLIENTES(NOME, CPF) VALUES (?, ?)";

    jdbcTemplate.update(sql, new Object[] { clie.getNome(), clie.getCpf() });
  }
}

É muito comum que o ID (chave primária) de um registro seja gerado pelo banco de dados. No MySQL isso é possível com o auto incremento, no caso do Oracle é possível via SEQUENCE.

A versão do método insert a seguir, demonstra como realizar o comando com JdbcTemplate e recuperar o ID gerado pelo banco através do KeyHolder. Utilizo a sobrecarga do método update, informando o PreparedStatementCreator do Spring MVC (gerador de PreparedStament).

  public void insert(final Cliente clie) {
    final String sql = "INSERT INTO CLIENTES(NOME, CPF) VALUES (?, ?)";

    PreparedStatementCreator psc = new PreparedStatementCreator() {
      @Override
      public PreparedStatement createPreparedStatement(Connection con)
        throws SQLException {
        //indico a coluna com valor gerado pelo banco de dados
        PreparedStatement ps = con.prepareStatement(sql, new String[] { "id" });

        //preencho os parametros (?, ?)
        ps.setString(1, clie.getNome());
        ps.setString(2, clie.getCpf());

        return ps;
      }
    }
    //recupera o valor gerado para o id
    KeyHolder keyHolder = new GeneratedKeyHolder();

    jdbcTemplate.update(psc, keyHolder);

    //atualizo a informacao do id, no objeto cliente
    cliente.setId(keyHolder.getKey().intValue());

  }

O detalhe é que durante a criação do PreparedStament, em Connection, eu passo o argumento com o nome da coluna gerada via auto incremento/SEQUENCE, nesse caso o "id". Esse código funciona com Oracle e MySQL.

@edermag

No comments: