You are on page 1of 4

JDBC – Trabalhando com banco de dados em Java

Leonardo Heidrich
Universidade do Vale do Rio dos Sinos (Unisinos)
Unisinos 950, São Leopoldo, RS, Brasil
leo.alemao@gmail.com.br

Resumo melhor opção, uma vez que ganha em desempenho e


também é a opção multi-plataforma. Na figura 01, pode
Em um primeiro momento, o conceito e a ser visto como é estruturada essa API [1][2]:
estrutura JDBC serão apresentados, citando facilidades
do uso desta API e motivos pelo qual ela é tão
freqüentemente utilizada pela maioria dos
programadores Java.
Em seguida, as principais classes e métodos
serão mostrados juntamente com exemplos de como
acessar registros em um banco de dados.

1. Introdução
JDBC, ou Java Data Base Connectivity
(Conectividade Java com Banco de Dados), é um
conjunto de interfaces e classes em Java que tem como
objetivo padronizar o modo com que um aplicativo
qualquer se conecte com banco de dados. É inspirado no
padrão Microsoft de acesso a banco de dados, ODBC
(Open DataBase Connectivity), porém tem a vantagem de
ser multi-plataforma. Além da independência da
plataforma, o Java também visa obter independência de
banco de dados, conforme será verificado mais adiante.
Isto significa que ao se trocar de banco de dados, espera-
se pouca alteração na aplicação, aumentando o reuso de
um aplicativo.
Figura 01 – Estrutura da API
2. Estrutura
3. Instalando o JDBC
A API JDBC permite utilizar caminhos distintos
para acessar a base de dados, ou seja, podem-se escolher Para instalar o JDBC ou componentes
diferentes drivers de diferentes tipos. O primeiro tipo é a necessários para acessar o banco de dados, deve-se
conexão através de uma ponte jdbc-odbc. Levando em instalar o JDK e logo em seguida o driver específico do
consideração que a ponte jdbc-odbc já vem incorporada banco de dados. Vários fabricantes de banco de dados e
ao JDK, e juntamente com o driver ODBC, esta opção se terceiros disponibilizam gratuitamente os drivers para
torna a mais fácil de se utilizar. No segundo tipo, o driver acessar seus respectivos bancos [1].
é obtido a partir de uma API nativa. Isto significa que o Há dois passos para se instalar qualquer driver
driver Java faz chamadas nativas à C ou C++ para sub- JDBC. Primeiramente, precisa-se descompactar os
rotinas definidas pelo fornecedor do banco de dados. Esta arquivos baixados, e posteriormente, deve-se adicionar o
alternativa exige a instalação de software cliente. O último caminho para as classes desse driver em seu
tipo se dá através de um driver específico JDBC. Esta é a CLASSPATH. É bom saber que todo driver de banco de
dados nada mais é do que classe(s) que contém métodos Na imagem anterior, primeiramente o driver é
de acesso ao banco de dados. carregado. Em seguida, a conexão com a base de dados
escolhida é estabilizada passando como parâmetros o
Outra forma de definir a acessibilidade do driver local onde a base está instalada, o usuário e senha de
para o compilador é gerar o arquivo .jar do driver e acesso ao banco. Caso, por algum motivo, a conexão não
colocar no diretório /jre/lib, diretório onde se encontra o tenha sido estabelecida, a exception adequada é chamada.
JDK. A CLASSPATH diz ao interpretador e ao
compilador Java onde encontrar as classes necessárias
para execução. Para fazer com que a Máquina Virtual
Java encontre o driver e possa utilizá-lo, a variável de 5. Manipulação de Dados
ambiente CLASSPATH precisa ser modificada.
A API do JDBC disponibiliza classes para
trabalhar com a manipulação de registros de banco de
dados. Statements e PreparedStatement são as classes que
4. Conexão facilitam a manipulação de dados nessa API. São as
instâncias dessas classes que enviam suas declarações
O JDBC usa a classe DriverManager e duas SQL para o banco de dados.
interfaces Driver e Connection, para se conectar a um
banco de dados. A classe Driver proporciona à JDBC um
ponto de partida para a conectividade de banco de dados 5.1. Statements
respondendo às requisições de conexão de DriverManager
e fornecendo informações sobre a implementação em Para obter um objeto Statement, deve-se chamar
questão. A classe DriverManager tem como principal o método createStatement() no objeto Connection que foi
responsabilidade manter uma lista de implementações de obtido através do método getConnection(). Na figura 03
drivers. A classe Connection é utilizada para enviar uma pode-se ver como se deve criar um objeto do tipo
série de dados de instruções SQL ao banco de dados e Statement [3]:
controlar o registro ou o aborto dessas instruções. Para
efetuar uma conexão, a primeira ação a ser feita para que
o JDBC funcione é obter um objeto Connection que
representa a conexão de rede para o banco de dados que Figura 03 – Criando uma statement
contém a informação que se deseja trabalhar. A
classe DriverManager gerencia o estabelecimento de Para atualizar dados no banco de dados é
conexões. O DriverManager precisa ser avisado com qual utilizado o método executeUpdate(StringSQL). Este
drivers JDBC ele deve tentar criar conexões. A forma método retorna o número de linhas alteradas pela
mais fácil para fazer isto é usar o método forName() na sentença. Na figura 04 pode-se ver um exemplo de como
classe que implementa a interface Driver. Na figura 02, dados são atualizados utilizando o método
pode-se ver um exemplo de como criar uma conexão com executeUpdate():
JDBC [2]:

Figura 04 – Atualizando dados utilizando statement

Comandos SQL que criam, alteram ou apagam


tabelas são todos exemplos de declarações DDL e são
executadas com o método executeUpdate. O método
executeUpdate() também deve ser usado em comandos
SQL que atualizam dados de uma tabela.

Figura 02 – Criando uma conexão com JBDC


5.2. PreparedStatements Com objetos da classe ResultSet é possível
realizar operações no banco de dados, como inserir,
A classe PreparedStatement herda de Statement, alterar ou deletar um registro. Na figura 06, pode-se ver
mas difere do fato que o SQL que se deseja utilizar é um exemplo de como se utiliza um resultSet para atualizar
especificado somente uma vez, no um registro em um determinada tabela [3]:
método preparedStatement(), como pode ser visto no
exemplo da figura 05:

Figura 05 – Atualizando dados utilizando


preparedStatement Figura 06 – Utilização do resultSet

Quando um PreparedStatment é criado, utiliza-se No exemplo anterior, após a criação de um


interrogações ("?") como marcadores para parâmetros que objeto do tipo Statement, executa-se um select na tabela
serão utilizados através dos métodos setXXX(). Algumas CIDADES para trazer ao ResultSet alguns registros do
vezes é mais conveniente ou mais eficiente usar um objeto banco de dados. Logo em seguida o cursor é posicionado
PreparedStatement para enviar sentenças SQL, porque na primeira registro com o método first(). Com o método
essa sentença já foi analisada pelo o banco de dados updateInt() o primeiro campo é alterado. O mesmo
acontece com updateString() que altera o segundo campo
Quando se deseja executar um objeto Statement da tabela. Os dois métodos seguintes enviam o novo
várias vezes, o tempo de execução será reduzido se for registro ao banco e posicionam o cursor em uma posição
utilizado um objeto PreparedStatement. A principal válida na tabela [3].
característica de um objeto PreparedStatement é que, Como foi visto anteriormente o
diferente do objeto Statement, é dada uma sentença SQL método next() move o cursor para a próxima linha, na
quando é criado. A vantagem para isto é que na maioria qual ele poderá operar. Uma vez que o cursor é
dos casos, esta sentença SQL será enviada ao banco de inicialmente posicionado antes da primeira linha de um
dados sempre, onde será compilada. No entanto, o objeto objeto ResultSet, a primeira chamada ao
PreparedStatement contém não somente uma sentença método next() move o cursor para a primeira linha.
SQL, mas uma sentença SQL que foi pré-compilada. Isto Invocações sucessivas do método next() movem o cursor
significa que quando o PreparedStatement é executado, o adiante uma linha por vez. Este ResultSet só rola num
banco de dados pode simplesmente executar a sentença único sentido, para o próximo registro. Não podemos
sem ter que compilá-la primeiro. movimentar o cursor para uma determina linha, ou
navegar em sentido inverso.
Apesar dos objetos PreparedStatement poderem ser
utilizados com sentenças SQL sem parâmetros, é mais A partir da JDBC 2.0, introduziu-se o conceito
freqüente a sua utilização com sentenças que adotam de ResultSet rolável, ou seja, o cursor pode se
parâmetros. A vantagem disso é que se pode usar o movimentar entre as linhas em qualquer sentido ou dando
mesmo parâmetro e supri-los com diferentes valores cada saltos aleatórios. Além da vantagem de se navegar em
vez que são executados. qualquer sentido, esse novo ResultSet também permite
atualizações diretas ao conjunto de valores armazenados
por ele, evitando o uso de chamadas ao método
6. ResulSet executeUpdate() para atualizar cada linha de dados a ser
alterada. Ambas as classes Statements e
PreparedStatements possuem construtores que aceitam
ResultSets representam as linhas retomadas como resultSets roláveis ou atualizáveis [3].
uma resposta a uma consulta. Uma vez se possui um
ResultSet, pode-se obter valores de qualquer campo na As opções para a criação de um cursor rolável
linha, ou mover para a próxima linha no conjunto. são definidas através de constantes da classe ResultSet. A
ResultSets são sempre posicionados antes da primeira constante TYPE_FORWARD_ONLY é o padrão desde a
linha (se ela existe), portanto você precisa chamar next() e JDBC 1.0. Ela não permite cursores roláveis e somente é
verificar se foi retomado true (você está posicionado na possível acessar os dados do ResulSet avançando registro
próxima linha) ou false (não há mais linhas). por registro para frente. Outra constante é a
TYPE_SCROLL_INSENSITIVE. Ela permite cursores
roláveis e é possível navegar pelo ResultSet para frente
para trás, para uma posição específica e para uma posição
relativa à posição atual. A TYPE_SCROLL_SENSITIVE
é rolável da mesma forma que a anterior, porém alterações
em registros no banco de dados são refletidos no
ResultSet.

Já para a criação de um cursor atualizável, outras


constantes são definidas. A CONCUR_READ_ONLY não
é atualizável, ao contrário da constante
CONCUR_UPDATABLE que é atualizável [3].

7. Conclusão
Neste artigo foi apresentada uma das maneiras de
como se comunicar com uma base de dados na linguagem
de programação Java.
Algumas facilidades são evidentes quanto à sua
utilização. Uma delas é o fato de não se ficar preso a um
tipo de banco de dados, deixando com que o programador
possa migrar para outras bases de dados apenas com
algumas modificações. Isso também acarreta em uma
grande reusabilidade de código.
Outra facilidade é que os comandos de acesso ao
banco são na linguagem SQL, já muito bem difundida e
de fácil aprendizagem.

8. Referências Bibliográficas.

[1] B. Jepson. “Programando Banco de Dados em Java”.


Afiliada, 1997, pg 27-58.

[2] G. Reese. “Database Programming with JDBC and


Java”. O`Reilly, 2000, pg 25-56.

[3] Revista Mundo Java, “O Futuro do Java Corporativo”.


Mundo, n 31, ano VI, 2008, pg 15-17.

You might also like