Pode parecer estranho falar em JDBC quando existem os frameworks e as APIs para o mapeamento objeto relacional (ORM), mas sempre é bom lembrar que apesar de ocasionar um maior tempo de desenvolvimento o JDBC, quando usado corretamente, proporciona uma maior velocidade de execução.
Sempre que uma consulta SQL é enviada para um banco de dados sua String passa por um processo de compilação, onde é verificado se existem erros de sintaxe e é gerado um plano de execução que é executado.
O processo de executar uma consulta SQL tem um custo de tempo e processamento, mas quase todos os bancos de dados fornecem um recurso que permite que uma consulta seja enviada para o banco de dados, seu plano de execução seja compilado e esse possa ser executado diversas vezes, sendo necessário apenas passar os parâmetros para a consulta. Esse recurso é chamado de SQL preparada.
O JDBC fornece a interface PreparedStantement que estende Stantement e é a forma de acessar o recurso de consultas preparadas em Java. Vamos observar um exemplo de uso do PreparedStantement:
Situação: é necessário inserir em um banco de dados um arquivo de um sistema legado que possui os dados de 50.000 clientes da empresa.
1. A classe Cliente possui a seguinte implementação:
public class Cliente {
private Integer codigo;
private String nome;
private String telefone;
private String endereco;// Métodos gets e sets
}
2. A classe que acessa os dados do arquivo é uma implementação da interface Iterator:
import java.io.File;
import java.util.Iterator;
public class Dados<Cliente> implements Iterator<Cliente> {
private File arquivo;
public Dados(File arquivo) {
this.arquivo = arquivo;
}
@Override
public boolean hasNext() {
// Informa se existe outro cliente no arquivo;
}
@Override
public Cliente next() {
// código que retorna um cliente;
}
@Override
public void remove() {
throw new RuntimeException("Não foi implementado.");
}
}
Ob.: foi implementado Iterator pois não aconselharia a construção de um método que retornasse uma lista com 50.000 clientes - afinal tudo ficaria em memória.
3. Finalmente a classe alvo desse post o DAO que insere os dados dos clientes no banco:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class ClienteDao {
private Connection connection;
public ClienteDao(Connection connection) {
this.connection = connection;
}public int inserirRegistros(Dados<Cliente> dados)
throws SQLException {PreparedStatement ps = null;
int quantidade = 0;String consulta = "insert into tbcliente(id, nome, " +
"endereco, telefone) values(?, ?, ? ?)";ps = connection.prepareStatement(consulta);
while (dados.hasNext()) {
Cliente cliente = dados.next();
ps.setInt(1, cliente.getCodigo());
ps.setString(2, cliente.getNome());
ps.setString(3, cliente.getEndereco());
ps.setString(4, cliente.getTelefone());quantidade += ps.executeUpdate();
ps.clearParameters();
}
return quantidade;
}
}
Na primeira linha a definição da consulta SQL que desejamos executar:
String consulta = "insert into tbcliente(id, nome, endereco, telefone) values(?, ?, ? ?)";
Em seguida é executado o comando que solicita que a consulta seja compilada:
ps = connection.prepareStatement(consulta);
O while serve para adquirir todos os clientes do arquivo:
while (dados.hasNext()) {
Cliente cliente = dados.next();
...
Os parâmetros são inseridos a cada iteração:
ps.setInt(1, cliente.getCodigo());
ps.setString(2, cliente.getNome());
ps.setString(3, cliente.getEndereco());
ps.setString(4, cliente.getTelefone());
Limpa os parametros depois de inseridos no banco.
ps.clearParameters();
Sempre que possível faça uso das consultas preparadas em seus sistemas afinal os benefícios são grandes.
Referências:
REESE, George. JDBC e Java. Programação para banco de dados. Capítulo 4. JDBC Avançada. Editora Berkeley. 2001.
0 comentários: