Banco de Dados em Disquete

A JDBC da linguagem Java torna possível à conexão com praticamente todos os bancos de dados conhecidos, isto abrange desde o Adabas (banco de grande porte - mainframe) a bancos que cabem em um único disquete. Neste momento imagino que você está pensando que estou me referindo a bancos de dados do tipo TXT sem nenhuma interação. Errou longe, o banco a qual me refiro possui acesso JDBC aceita cláusulas SQL além de possuir integridade relacional, transações e Java Stored Procedures, estou me referindo ao Hypersonic SQL projeto de Thomas Muller, ou melhor, a sua versão Open Source HSQLDB, as tabelas podem ficar em memória ou persistentes no HD. Completamente escrito em Java, pode ser baixado no endereço http://hsqldb.sourcefourge.net.

Se você não conhece nada sobre a JDBC vamos a alguns passos básicos, a sua conexão se processa através da disponibilidade de um Driver de conexão isso é feito com a seguinte instrução:

Class.forName("org.hsqldb.jdbcDriver");

Após este comando utilizamos um gerente para obter a conexão que ficou disponibilizada e a capturamos com um objeto do tipo Connection, do seguinte modo:

Connection con = DriverManager.getConnection("jdbc:hsqldb:file:teste", "sa", "");

31-05pic01.JPG 

No caso do HSQLDB o teste se refere ao nome da database. De posse da conexão necessitamos armar um modo de conversar com o banco, que poderá ser:

1. De maneira direta, através de um objeto Statement – de modo a passar comandos diretos para o banco, do tipo: SELECT * FROM tabela WHERE cod = 2

2. De maneira parametrizada, através de um objeto PreparedStatement – de modo a pré-preparar um comando e em seguida realizando instruções seguidas, do tipo: SELECT * FROM tabela WHERE cod = ?

3. De maneira de chamadas, através de um objeto CallableStatement – de modo a executar uma chamada a uma Stored Procedure do banco de dados (ou a uma função deste), do tipo: call sp30()

31-05pic02.JPG

Neste exemplo vamos colocar um simples statement para criarmos nossa tabela:

Statement stm = con.createStatement();

Temos agora duas possibilidades de executar, através de um comando de modificação (create, drop, alter, insert, update ou delete) que lhe retornará um tipo inteiro indicando quantas linhas foram processadas, ou através de um comando de consulta (select) que neste caso lhe retorna um objeto matrix conhecido por ResultSet. Neste momento vamos realizar o primeiro comando para termos a criação da nossa tabela:

stm.executeUpdate("CREATE TABLE frase(" +
   "numFrase int not null," +
   "desFrase varchar(400)," +
   "autFrase varchar(120)," +
   "PRIMARY KEY(numFrase))");

O código completo é realizado da seguinte maneira, servindo como exercício você deve completar o que falta:

import java.sql.*; // importações necessárias para acesso a JDBC
  public class CriaTabFrase {
    public static void main(String [] args) {
       new CriaTabFrase().criar();
    }
    public void criar() {
       try {
         // coloque aqui a linha de disponibilização do driver
         // coloque aqui a linha de conexão com o banco
         // coloque aqui a criação do modo de conversar com o BD
         // coloque aqui a execução do comando
       } catch (ClassNotFoundException e) {
          System.out.println("Caso o Driver não seja encontrado");
       } catch (SQLException e) {
          System.out.println("Caso aconteça erro de SQL");
       }
    }
}

Faremos agora um exercício mais avançado, crie uma classe para inserir algumas linhas na tabela, como por exemplo, as frases abaixo:

"Alguém jamais concordará em rastejar se sentir um impulso para voar." Hellen Keller
"Cada um pensa em mudar a humanidade, mas ninguém pensa em mudar a si mesmo." Liev Tolstói
"A inteligência é a única coisa que aperfeiçoa." Oscar Wilde
"Diferentes na vida, os homens são semelhantes na morte." Lao Tsé
"Aprendi a contentar-me com o que tenho." Filipenses 4:11
"O homem é mortal por seus temores e imortal por seus desejos." Pitágoras
"Veja as qualidades e elogie; os defeitos logo desaparecerão." Anônimo
"Sabendo sofrer, sofre-se menos." Anônimo
"Cada homem tem a sua hora. Cabe a cada um escolhê-la." Anônimo
"A página aberta da vida é bela; mais bela, porém, é a página lacrada." Anônimo
"A vida bem vivida e aquela que se sobrepõe a morte." Anônimo
"O maravilhoso da fantasia é nossa capacidade de torná-la realidade." Anônimo

Para pesquisarmos no banco, podemos utilizar um comando SELECT do seguinte modo:

ResultSet res = stm.executeQuery(
   "SELECT desFrase, autFrase FROM frase");

O banco poderia ter milhares de linhas que mesmo assim este comando seria a coisa mais rápida jamais vista, simplesmente, pois a única coisa que a JDBC faz é armar um ponteiro de referência sem trazer nenhum dado. Além disso, alguns outros detalhes que você precisa saber:

   • Uma vez aberto um ResultSet você está posicionado no registro BOF, então é necessário a execução do método next() que lhe retornará true se foi possível localizar a próxima linha.
   • Para trazer determinada coluna utilizamos o método get[tipo](posição), sendo que em um ResultSet a primeira coluna é posição 1.
   • Não é boa prática pegar a mesma coluna 2 vezes, se precisar usar uma coluna mais de uma vez coloque seu conteúdo em uma variável e utilize esta.
   • Não é boa prática pegar em ordem errada ao SELECT, se você deseja autFrase primeiro que desFrase troque seu SELECT de ordem.

Com isso exposto temos:

while (res.next())
   System.out.println(res.getString(1) + " (" + res.getString(2) + ")");

E teremos com resultado todas as linhas que foram inseridas. O mais incrível é que isto roda em apenas um único disquete, pois o driver do HSQLDB ocupam exatos 564 Kb, para o banco basta você copiar os arquivos .script e .log além do seus .class, então deixe a imaginação disparar aumentando a coleção de frases e criando uma janela aperfeiçoada de pesquisa.