quinta-feira, 3 de julho de 2008

Tutorial - Conexão com banco de dados HSQLDB utilizando JAVA

Este tutorial tem como objetivo apresentar uma classe Java, para efetuar uma conexão com o banco de dados HSQLDB no modo servidor.

A classe demonstra dois métodos importantes, update (inclusão, alteração, exclusão) e query (pesquisas), que são responsáveis por realizar instruções SQL no banco. Os resultados obtidos através de consultas são armazenados em dois vetores (linhas e colunas), que por sua vez são criados na classe VetorPesquisa, que encapsula os atributos para acessos posteriores.

Classe Conexao.java:


import java.sql.*;
import java.util.Vector;

/** Modelo de conexão como o banco de dados.
* Código extraído da documentação oficial do HSQLDB. Com algumas alterações para
* acoplar os resultados da consultas em vetores java (Vector)
* Procedimentos padrões para consulta e updates através de expressões SQL.
*
* @author Rondson
*
*/
public class Conexao {

Connection conn; // conexão

/** Abre conexão com o banco ao instanciar-se um objeto do tipo Conexao */
public Conexao() throws Exception {
Class.forName("org.hsqldb.jdbcDriver"); // carrega driver

// carrega banco de dados
conn = DriverManager.getConnection("jdbc:hsqldb:"
+ "hsql://localhost/data/SRH/", // filenames
"sa", // username
""); // password

} // construtor Conexao

/** Fecha conexão com o banco. */
public void fecharConexao() throws SQLException {
conn.close(); // encerraConexão

} // void fecharConexao

/** Executa comandos SQL (CREATE, DROP, INSERT e UPDATE). */
public synchronized int update(String expression) throws SQLException {
Statement st = null;
st = conn.createStatement(); // statements

int i = st.executeUpdate(expression); // executa Updates

st.close();

return i;
}

/** Realiza consultas no banco (SQL SELECT). */
public synchronized void query(String expression, VetorPesquisa vetor) throws SQLException {
Statement st = null;
ResultSet rs = null; // manipula os dados obtidos numa consulta
st = conn.createStatement();
rs = st.executeQuery(expression); // executa consultas

armazenarDados(rs, vetor); // armazena dados em vetores

st.close(); // fecha Statement
} // void query

/** Armazena resultados da consulta em vetores para o método query(). */
public void armazenarDados(ResultSet rs, VetorPesquisa vetor) throws SQLException {
// vetores locais para armazenar os dados
Vector colunas = new Vector();
Vector linhas = new Vector();

ResultSetMetaData rsmd = rs.getMetaData(); // Armazena informações sobre o banco de dados e a consulta

// Construção dos cabeçalhos das colunas, quantas existirem.
for (int i = 1; i <= rsmd.getColumnCount(); ++i)
colunas.addElement(rsmd.getColumnName(i));

// Construção das linhas
for(; rs.next(); ) { // posiciona no primeiro registro e percorre até não encontrar registros
linhas.addElement(proximaLinha(rs, rsmd));
}

// Seta os vetores da classe VetorPesquisa
vetor.setColunas(colunas);
vetor.setLinhas(linhas);

} //void armazenaDados

/** Este método tem por finalidade percorrer a tabela, usando as informações obtidas no loop anterior.
* Além de verificar o tipo de elemento que há na linha da tabela.
*
* @param rs
* @param rsmd
* @return
*/
private Vector proximaLinha(ResultSet rs, ResultSetMetaData rsmd){
Vector LinhaAtual = new Vector();

// Verifica o tipo de elemento a ser adicionado no vetor
try{
for (int i = 1; i <= rsmd.getColumnCount(); ++i)
switch(rsmd.getColumnType(i)){
case Types.VARCHAR: LinhaAtual.addElement(rs.getString(i));
break;

case Types.TIMESTAMP: LinhaAtual.addElement(rs.getDate(i));
break;

case Types.NUMERIC: LinhaAtual.addElement(new Long(rs.getLong(i)));
break;

case Types.INTEGER: LinhaAtual.addElement(new Integer(rs.getInt(i)));
break;

case Types.REAL: LinhaAtual.addElement(rs.getFloat(i));
break;
}
}
catch(SQLException e){
}
return LinhaAtual;
} // Vector proximaLinha

} // classe Conexao


Classe VetorPesquisa.java:


import java.util.Vector;

/** Esta classe é responsável por amarzenar em linhas e colunas, os
* resultados obtidos através de consultas no banco
*/
public class VetorPesquisa {

// Vetores para captura dos valores de linhas e colunas
private Vector colunas = new Vector();
private Vector linhas = new Vector();


// Encapsulamento dos Vetores para posterior acesso por outras classes
public Vector getColunas() {
return colunas;
}

public void setColunas(Vector colunas) {
this.colunas = colunas;
}

public Vector getLinhas() {
return linhas;
}

public void setLinhas(Vector linhas) {
this.linhas = linhas;
}

}


Com o armazenamento dos resultados capturados no banco de dados, em vetores, é possível criar tabelas e passar como parâmetro os vetores "linhas" e "colunas".

Em breve vou publicar um tutorial de como manipular os dados obtidos, para exibição em tabelas utilizando a interface gráfica através da API Swing.

Um comentário:

Paulo César Viana disse...

Bacana Rondson. Parabéns por dividir o conhecimento. abraço

PC