quarta-feira, 19 de agosto de 2009

Trabalhando com bancos de dados: Conectando com Mysql

A linguagem Java oferece uma camada para acesso a banco de dados chamada JDBC que busca unificar a forma de acesso a diversos bancos de dados.

A idéia é dinamicamente carregar o driver do banco de dados e então usar a classe Statement para executar as querys. Esta abastração permite uma programação independente do banco de dados.

A maneira mais usual é deixar o sistema operacional se encarregar da conexão real com o banco de dados e usar pelo java a conexão ODBC já criada pelo SO, isso funciona bem em ambiente windows e com bancos de dados pequenos, mas por outro lado é uma solução muito vulnerável, pois o usuário pode apagar a ODBC, mudar o nome, desinstalar o driver pensando que “é um programa que ele não usa”.

Há também dificuldades técnicas na questão de performance além do fato que ODBC é padrão apenas em ambiente windows, em outros sistemas operacionais não existe esse conceito (porque é ruim!).

Se precisarmos usar uma conexão ODBC em Linux por exemplo precisa instalar e configurar o pacote “unixODBC” o que não é trivial.

A melhor solução é não usar ODBC (mesmo que seja mais fácil em windows que é a maioria dos usuários) e preferir pela conexão nativa.

As IDE's Java normalmente já tem o driver JDBC de alguns bancos de dados (conforme interesse do fabricante da IDE) para conexão, o Oracle Jdeveoper possui conexão com BD Oracle por exemplo.

Aqui faremos conexão com Mysql, como ainda não temos o driver, baixamos ele do site do banco de dados. Normalmente a maioria dos bancos de dados em sei site tem ou indicam onde baixar o driver Java para conectar-se ao banco.

Baixamos aqui o driver (do site www.mysql.com) para conectar-se, descompactamos o diretório e neste tem um arquivo “.jar”, um pacote de várias classes Java, esse é nosso driver de acesso nativo ao banco, independente de plataforma ou SO.




Com o projeto aberto, clicamos com o botão auxiliar em “Project Properties”. O que precisamos fazer é que esse driver seja compilado junto com os arquivos do nosso projeto, o detalhe é que ele não é um arquivo original de nosso projeto, por isso temos que indicar em classpath o caminho do driver.



Na tela que foi aberta escolha no menu “Liberaries and Classpath” (item 1). Em seguida aponte onde está o driver para conexão nativa (itens 2, 3 e 4). Aqui também poderiam ser adicionadas bibliotecas, componentes de terceiros como para geração de PDF ou algo do gênero. Por fim, clique em “ok” para gravar as novas configurações do ambiente.



Na página seguinte temos o código de uma classe para conexão e para executar de modo bem básico consultas em banco da dados.

Importante destacar apenas o import nas bibliotecas do Java referentes a SQL, e o bloco try/catch que será discutido mais adiante em outro post possivelmente.

O JDBC possui métodos diferentes para executar consultas (selects) e alterações (insert, update, delete) no banco de dados, por isso criamos também dois métodos para isso. O método de conexão é privado porque é chamado no momento de executar uma instrução, ele retorna um Statement, sobre o Statement é que as operações com o banco de dados acontecem.

O que muda de coenxão entre os diversos bancos de dados é os poucos passos até se conseguir criar um objeto do tipo Statement, no caso  do Mysql temos que apontar o servidor de banco de dados, o banco que queremos trabalhar, qual usuário e senha estão fazendo essa conexão.

O método executeSelect retorna um ResultSet, ou seja, um objeto com a coleção de dado atingida pelo select executado. O método executeUpdate retorna um inteiro apenas indicando quantos dados foram atingidos pelo comando. Observe que nem sempre aqui o resultado 0 (zero) indica que a SQL falhou ou não foi executada, apenas que nenhum dado foi atingido pelo comando DML. Confira a classe na sequencia. (clique para ver ela mais grande)


Nesta classe que usa a anterior apenas temos a chamada dos métodos. Premeiro limpamos a tabela (truncate), depois executamos um select e trazemos para tela o que ele retornou (nada), depois mandamos inserir dados e executamos o select novamente trazendo para tela o que tem nessa tabela no banco de dados.



Como pode perceber trabalhar com banco de dados em sí é fácil, o complicado é ligar a camada de BD com a interface da aplicação e fazer isso de modo OO. Essas duas classes são o básico, com isso e mais um pouco de lógica da para fazer praticamente tudo em BD, o restante são minúcias de pegar valores de uma interface swing, concatenar esses valores dentro da SQL e mandar executar.

Veja a prova do crime na figura abaixo.


Valeu pessoal, nos vemos!