BLOBs com JDBC e Swing: Aprenda a lidar com campos binários em Java

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (0)  (0)

Como armazenar e recuperar de forma eficiente e portável imagens e documentos em bancos relacionais, usando threads com Swing para não deixar sua aplicação com aparência de congelada.

Esse artigo faz parte da revista Java Magazine edição 44. Clique aqui para ler todos os artigos desta edição

BLOBs com JDBC e Swing

Aprenda a lidar com campos binários em Java

Como armazenar e recuperar de forma eficiente e portável imagens e documentos em bancos relacionais, usando threads com Swing para não deixar sua aplicação com aparência de congelada

Um dos recursos mais chamativos dos bancos de dados modernos é o suporte a informações não-estruturadas, que fogem aos tipos de dados simples como inteiros, datas e strings. Bancos de dados com capacidade de armazenar imagens, planilhas e outros tipos de documentos, lado a lado com informações estruturadas em campos e registros, ganharam até nomes pomposos: “bancos de dados multimídia” e “universal databases”. Estes bancos têm inúmeras aplicações em comércio eletrônico, sistemas de segurança, recursos humanos, entre outras possibilidades.

Mas lidar com dados não-estruturados na maioria dos bancos relacionais não é tarefa trivial. A programação em geral foge ao estilo usual do SQL, e obter performance adequada exige conhecimento avançado tanto do desenvolvedor de aplicações quando do administrador do banco de dados. Na essência, dados multimídia são armazenados em bancos de dados como grandes “campos binários”, os BLOBs – Binary Large Objects. Eles não estão restritos pelas limitações de tamanho de campos decimal e varchar tradicionais; por outro lado estes campos não podem ser utilizados livremente para compor índices ou cláusulas where.

Felizmente a linguagem Java torna as coisas mais fáceis, ao oferecer como parte do padrão JDBC alguns métodos e classes especialmente criados para a manipulação dos BLOBs.

Este artigo apresenta uma aplicação de visualização de imagens, que permite ler imagens em qualquer formato suportado pelo Java (como GIF, PNG e JPEG), oriundas tanto de arquivos em disco quando de um banco de dados. A aplicação de exemplo também demonstra melhores práticas no desenvolvimento Swing, ao garantir que a interface com o usuário não fique “congelada” durante a carga das imagens.

Os exemplos foram testados com três bancos de dados: HSQLDB, MySQL e PostgreSQL. Já as fotos que ilustram os exemplos foram obtidas no site do jornal italiano La Republica, em matéria onde a agência de notícias Reuters elege as melhores fotos do ano no jornalismo europeu: www.repubblica.it/2006/05/gallerie/esteri/reuters-foto-anno/2.html.

Para acompanhar este artigo, é importante que o leitor tenha conhecimentos básicos de Swing, APIs de E/S do Java (pacote java.io) e configuração do banco de dados utilizado. A série de artigos sobre os fundamentos do JDBC, publicados nas edições 42 e 43, servem como ponto de partida.

Inicializando o BD

A forma mais simples de se lidar com campos BLOB é simplesmente tratá-los da mesma forma que seriam tratados outros tipos de dados pelo JDBC: eles podem ser manipulados como se fossem simples valores passados como parâmetros para comandos SQL e recuperados como parte de resultados de consultas.

Mais especificamente, as interfaces ResultSet e PreparedStatement (em java.sql) fornecem os métodos getObject() e setObject(), que permitem ler e salvar objetos Java quaisquer, fazendo automaticamente as conversões necessárias.

Entretanto, muitos drivers JDBC irão serializar e desserializar automaticamente objetos Java passados para estes métodos, o que pode causar problemas de portabilidade dos dados para aplicações não-Java. Para evitar problemas, coloque a informação desejada em seu formato “nativo”, dentro de um array de bytes (byte[]). Assim é evitado o uso da serialização com o banco de dados. Será responsabilidade da aplicação converter este array de bytes no objeto Java desejado.

A Listagem 1 apresenta o código de um programa simples (InsereImagem.java) que recebe o nome de um arquivo e uma descrição deste arquivo pela linha de comando. O arquivo e a sua descrição são então inseridos no banco de dados da aplicação de exemplo. A mesma listagem mostra exemplos da execução deste programa, utilizando as imagens inclusas junto com os fontes para download deste artigo.

 

Listagem 1. InsereImagem.java – programa mínimo para uso de BLOBs em Java

import java.sql.*;

import java.io.*;

import java.util.*;

 

class InsereImagem

{

  public static void main(String args[]) throws Exception {

  

  // valida a linha de comando

  if (args.length != 2) {

    System.err.println("Uso: InsereImagem <arquivo> <descr>");

    System.exit(-1);

  }

  

  // lê a imagem para um byte[]

  File img = new File(args[0]);

  byte[] imagem = new byte[(int)img.length()];  

  System.out.println("Lendo " + img.length() + " bytes...");

 

  DataInputStream is = new DataInputStream(

    new FileInputStream(args[0]));

  is.readFully(imagem);

  is.close();

  

  // obtém parâmetros de conexão via arquivo de propriedades

  Properties parametrosConexao = new Properties();

  parametrosConexao.load(InsereImagem.class.getResourceAsStream(

    "banco.properties"));

    

  String driver = parametrosConexao.getProperty("driver");"

A exibição deste artigo foi interrompida :(
Este post está disponível para assinantes MVP

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?