Para enviar uma declaração SQL para o banco de dados é necessária uma instância de Statement
ou de PreparedStatement
. Uma vez obtida, a consulta pode ser enviada. É retornada uma instância de ResultSet
contendo todo o resultado (veja como alterar este comportamento na
Seção 31.3.1
abaixo). O
Exemplo 31-1
mostra este processo.
Exemplo 31-1. Processamento de consulta simples usando JDBC
Este exemplo envia uma consulta simples e mostra a primeira coluna de cada linha utilizando Statement
.
Statement st = db.createStatement(); ResultSet rs = st.executeQuery("SELECT * " + "FROM minha_tabela " + "WHERE coluna_foo = 500"); while (rs.next()) { System.out.print("Coluna 1 retornada "); System.out.println(rs.getString(1)); } rs.close(); st.close();
Este exemplo usa a mesma consulta anterior, mas utiliza PreparedStatement
e um valor vinculado na consulta.
int valor_foo = 500; PreparedStatement st = db.prepareStatement("SELECT * " + "FROM minha_tabela " + "WHERE coluna_foo = ?"); st.setInt(1, valor_foo); ResultSet rs = st.executeQuery(); while (rs.next()) { System.out.print("Coluna 1 retornada "); System.out.println(rs.getString(1)); } rs.close(); st.close();
Por padrão o driver traz todos os resultados da consulta de uma só vez. Esta forma pode não ser conveniente para conjuntos grandes de dados e, por isso, o driver JDBC fornece uma maneira de basear o ResultSet
em um cursor do banco de dados, e somente trazer um pequeno número de linhas.
Um pequeno número de linhas é armazenado no lado cliente da conexão, e quando exauridas o próximo bloco de linhas é trazido reposicionando o cursor.
Exemplo 31-2. Definição do tamanho de busca para habilitar e desabilitar o cursor
Alterar o código para o modo cursor é tão simples quanto definir o tamanho de busca de Statement
para o valor apropriado. Definir o tamanho de busca novamente como 0 faz com que todas as linhas seja trazidas (o comportamento padrão).
Statement st = db.createStatement(); // Habilitar o uso do cursor. st.setFetchSize(50); ResultSet rs = st.executeQuery("SELECT * FROM minha_tabela"); while (rs.next()) { System.out.print("uma linha foi retornada."); } rs.close(); // Desabilitar o uso do cursor. st.setFetchSize(0); ResultSet rs = st.executeQuery("SELECT * FROM minha_tabela"); while (rs.next()) { System.out.print("muitas linhas foram retornadas."); } rs.close(); // Fechar a declaração. st.close();
Statement
ou PreparedStatement
As seguintes informações devem ser consideradas quando for utilizada a interface Statement
ou PreparedStatement
:
Statement
quantas vezes se desejar. Esta instância pode ser criada tão logo a conexão seja aberta e utilizada durante toda a existência da conexão. Mas deve ser lembrado que pode existir somente um ResultSet
por Statement
ou PreparedStatement
em um determinado momento.
ResultSet
, pode-se simplesmente criar e utilizar outro Statement
.
Statement
para cada fluxo de execução. Consulte a
Seção 31.9
se houver intenção de utilizar threads, uma vez que são cobertos pontos importantes.
Statement
e PreparedStatement
não tiverem mais utilidade, devem ser fechados.
ResultSet
As seguintes informações devem ser consideradas quando for utilizada a interface ResultSet
:
next()
, que retorna verdade se houver um resultado e, mais importante ainda, prepara a linha para ser processada.
ResultSet
deve ser fechado chamando close()
quando não for mais ser utilizado.
Statement
já utilizado para criar um ResultSet
, a instância do ResultSet
aberta no momento é fechada automaticamente.