terça-feira, 26 de agosto de 2008

Consultas preparadas com JDBC

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:

Seguidores

Total de visualizações

Tecnologia do Blogger.
Evandro Santos © 2016 Suporte Blogger Templates