fig

MySQL e Java

julho 29, 2014 - Banco de Dados / Java / MySQL / Programação

JDBC é a interface do Java para Bancos de Dados padrão. Ela define uma série de objetos para comunicação com diferentes tipos de sistemas de banco de dados, para realizar consultas (queries) e tratar seus resultados, bem como para atualizar as informações contidas no banco. Todas as interações com os bancos de dados são feitas a partir desta API, de forma que a aplicação se torna independente da arquitetura de banco de dados utilizada. O acesso a diferentes tipos de bancos de dados é feito através de drivers específicos para cada tipo de banco de dados, normalmente fornecidos por seus respectivos fabricantes.

Para fazer interface com um banco de dados MySQL, podemos utilizar um driver gratuito, MySQL/J, cujo download pode ser realizado no próprio site do MySQL.

Instalação do Driver

Para instalar o driver  MySQL/J, basta colocar o seu arquivo JAR no caminho de busca do ambiente Java. Por exemplo, no MacOS, esse diretório é /System/Library/Java/Extensions; no Linux pode ser colocado em /usr/lib.

Para usar um caminho de diretório diferente do padrão, devemos alterar a variável de ambiente CLASSPATH, para acrescentar o diretório desejado:

O driver MySQL/J é carregado em tempo de execução, por isso utilizamos o método forName() do objeto Class para criarmos uma instância dele, antes de fazer qualquer outra coisa em nosso programa:-

Além disso, é necessário importar os objetos da API, que estão definidos no pacote java.sql:

Conectar com um Banco de Dados

O objeto Connection é o responsável por manter todas as informações de conexão. Uma conexão é efetuada entre um programa Java e um servidor MySQL, fornecendo-se um nome de usuário e uma senha, que permitirão ao programa ter acesso a um conjunto de bancos de dados, tabelas e a determinadas operações sobre os mesmos, dependendo dos privilégios estabelecidos pelo administrador do MySQL ao usuário em questão.

Para iniciar uma conexão, devemos usar o método getConnection() do singleton DriverManager, que recebe três parâmetros do tipo String: um endereço de um banco de dados, um nome de usuário e sua respectiva senha.

o parâmetro url deve permitir localizar o programa servidor MySQL, que pode estar executando na mesma máquina ou através de uma rede.

A primeira parte do string especifica o protocolo, “jdbc:mysql://”, seguindo-se um url válido que se resolva em um endereço IP existente, podendo ou não incluir o endereço da porta TCP após dois-pontos (“localhost:8889″). A última barra sempre deve estar presente e caso seja especificado em seguida a ela, um nome de banco de dados pode ser aberto com o mesmo comando (“/bdteste”).

Se um banco de dados não foi aberto durante a conexão com o servidor MySQL, você poderá abri-lo posteriormente com o comando SQL “USE “.

Executar Consultas

Para realizar consultas ao banco de dados aberto com o objeto Connection, usa-se o objeto Statement.

Uma consulta que não retorna dados é realizada através do método executeUpdate() do objeto Statement, o qual retorna o número de linhas afetadas pela consulta.

Um objeto Statement é sempre fabricado pelo objeto Connection e deve ser fechado após o seu uso, através do método close().

Consultas podem retornar dados através do objeto ResultSet, que é retornado pelos métodos executeQuery() ou getResultSet() do objeto Statement. getResultSet() retorna o resultado da última consulta realizada com executeQuery().

Vários métodos de ResultSet permitem acessar os resultados da consulta.

Neste exemplo, o método getString() é utilizado para retornar o valor dos campos como strings, o nome do campo desejado especificado como parâmetro.

Além do nome, existe uma versão de getString() que recebe o índice da coluna desejada.

O objeto ResultSet também precisa ser fechado após o seu uso, através do método close().

Obtendo resultados de consultas

Os métodos a seguir convertem os resultados das colunas (campos) de um ResultSet em seus respectivos tipos nativos do Java, e os retornam. Eles possuem um parâmetro que pode ser um inteiro representando o índice da coluna desejada ou um string contendo o nome da coluna.

Método para leitura Método para escrita Tipo Java
getBigDecimal() updateBigDecimal() math.BigDecimal
getBlob() - Blob (binary large object)
getBoolean() updateBoolean() boolean
getByte() updateByte() byte
getBytes() updateBytes() byte[]
getDate() updateDate() java.sql.Date (descendente de java.util.Date)
getDouble() updateDouble() double
getFloat() updateFloat() float
getInt() updateInt() int
getLong() updateLong() long
getShort() updateShort() short
getString() updateString() String
getTime() updateTime() java.sql.Time (descendente de java.util.Date)
getTimestamp() updateTimestamp() java.sql.Timestamp (descendente de java.util.Date)
getURL() - java.net.URL
wasNull() updateNull() -

Além disso, o método getObject() permite retornar um objeto descendente de Object, cujo tipo é automaticamente associado ao tipo da coluna especificada ou um objeto wrapper correspondente a algum dos tipos básicos (Integer, Boolean, etc).

Outro método útil é getArray() que retorna a coluna inteira em um array da linguagem Java.

A coluna pode assumir o valor especial NULL, que não é retornado por nenhum dos métodos para leitura dos dados. Para verificar se o valor do campo lido é NULL deve-se utilizar o método getXXX usual, seguido da consulta ao método wasNull() que retornará true caso o valor da coluna seja NULL. De forma equivalente, para escrever o valor NULL em um campo, é necessário usar o método updateNull().

As tabelas de resultados também podem possuir tipos de dados de tamanho indefinido, como BLOB (Binary Large Object) ou TEXT. O objeto ResultSet permite transformar esses campos em objetos do Java como InputStream, Reader ou mesmo arrays de bytes. Através de Streams, esses campos podem ser lidos como se fossem arquivos.

Selecionando resultados de consultas

Os métodos a seguir permitem navegar por um ResultSet, selecionando diferentes linhas (registros) do resultado da consulta. Observe que nem todos os métodos podem funcionar para todos os drivers de banco de dados.

Método Efeito Retorna
first() Seleciona a primeira linha do ResultSet true se existem resultados
last() Seleciona a última linha do ResultSet true se existem resultados
beforeFirst() A próxima linha será a primeira -
afterLast() A linha anterior será a última -
absolute(i) Seleciona a i-ésima linha do ResultSet true se a linha existe
next() Seleciona a próxima linha do ResultSet false se atingido o final do ResultSet
previous() Seleciona a linha anterior do ResultSet false se atingido o início do ResultSet
relative(i) Pula i linhas a partir da linha atual (valor negativo move para trás) true se a linha existe
getRow() Identifica a linha atual Índice da linha atual
isFirst() Identifica a linha atual true se é a primeira linha
isLast() Identifica a linha atual true se é a última linha
isBeforeFirst() Identifica a linha atual true se a próxima linha é a primeira
isAfterLast() Identifica a linha atual true se a linha anterior é a última

Alterando o Banco de Dados através de um ResultSet

Normalmente, os ResultSets contendo os resultados de uma consulta apenas podem ser lidos. Porém, um objeto ResultSet pode ser criado para também ser alterado pelo programa Java. Para isso, é necessário criar um objeto Statement com essa propriedade, através da chamada Connection.createStatement() com o parâmetro ResultSet.CONCUR_UPDATABLE. Neste caso, o driver para o banco de dados fará com que as modificações realizadas também sejam feitas automaticamente sobre os dados originais no banco de dados, desde que o usuário especificado durante a conexão possua privilégios suficientes para isso.

Três métodos são utilizados para alterar um ResultSet: deleteRow(), insertRow() e updateRow(). O método deleteRow() exclui a linha (registro) atual do banco de dados. updateRow() substitui uma linha (registro) do banco de dados pela linha atual e insertRow() acrescenta os dados da linha (registro) atual ao banco de dados. Para usar insertRow() é necessário selecionar uma linha especial para inserção, usando o método moveToInsertRow().

Para alterar os valores da linha atual do ResultSet, empregam-se os métodos updateXXX() listados anteriormente. Uma vez concluída a alteração, chama-se updateRow() ou insertRow().

Tratamento de Erros

A maioria dos métodos dos objetos Connection, Statement e ResultSet lançam exceções do tipo SQLException, que precisam ser tratadas. Elas vão corresponder a erros ou falhas que podem envolver uma variedade de causas, como problemas de comunicação com o servidor MySQL, erros de sintaxe de comandos SQL, inconsistência de nomes de bancos de dados, tabelas ou campos, insuficiência de privilégios de acesso e erros do próprio SQL, tais como duplicação de chave primária, campo vazio especificado como não-nulo, etc.

Fechar o Banco de Dados

Após realizar as consultas desejadas, a conexão com o banco de dados deve ser fechada, através do método close() de Connection.

Links

Bons livros sobre o assunto

› tags: Java / JDBC / MySQL /

Deixe um comentário

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">