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:

1
2
3
4
5
6
7
8
9
10
11
12
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).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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: