Sie sind auf Seite 1von 12

Driver JDBC Para Consultas em Bancos de Dados

Distribudos e Fragmentados Horizontalmente


Adilson Vahldick1, Jacson Gonalves1
1

Departamento de Sistemas e Computao


Universidade Regional de Blumenau (FURB) Blumenau, SC Brasil
adilsonv@furb.br, ja_ko@terra.com.br

Resumo. Este artigo descreve um driver JDBC desenvolvido para suportar


consultas a bancos de dados distribudos. Podem ser acessados bancos de
dados de diferentes fabricantes garantindo a propriedade de heterogeneidade.
A fragmentao horizontal ocorre quando uma relao particionada em
subconjuntos e cada um desses possui linhas da relao original. O driver
aqui proposto trata diferentes tabelas como uma unidade lgica, utilizando-se
da fragmentao horizontal. Para que o driver reconhea os bancos de dados
e possa tratar diferentes tabelas como uma s, necessrio que haja um
mapeamento, que nesse trabalho feito via um editor visual. Esse artigo
apresenta o resultado de um projeto de concluso de curso de graduao em
Cincias da Computao.

1. Introduo
A utilizao de bancos de dados distribudos (BDD) motivada pela possibilidade de
integrar fontes de dados em pontos geogrficos distintos, permitindo com que o usurio
visualize o conjunto de dados como uma nica unidade. As consultas em BDD so
executadas distintamente em cada stio do BD e os resultados agrupados para formar um
nico conjunto dando a impresso ao usurio que existe somente um BD lgico.
Esse trabalho prope a utilizao de drivers JDBC como responsvel pelo
gerenciamento das consultas em BDD. Com isso pode-se desenvolver uma aplicao
que tradicionalmente acessaria um nico BD e utiliz-la para acesso em BDD.
O driver JDBC uma camada de abstrao que permite a um programa Java
utilizar uma interface padro para acessar um BD relacional atravs da SQL (Ramon,
2001). Essa camada composta por classes e interfaces que as aplicaes Java
instanciam para enviar expresses SQL ao BD e obter resultados dessas requisies. Os
fabricantes de BD que desejarem ter seus sistemas acessveis por aplicaes feitas em
Java devem desenvolver um driver JDBC para seu BD. A abstrao que o driver oferece
permite que uma aplicao seja independente do fabricante de BD. No momento de
executar a aplicao que se decide que driver de fabricante utilizar e estabelece-se a
conexo com esse BD.
O mesmo acontece ao utilizar o driver proposto nesse trabalho: a aplicao que
foi desenvolvida acessando um nico BD, ao definir que utilizar o driver desse trabalho
poder acessar BDD.

Para que possam ser executadas consultas em BDD se faz necessrio identificar
os stios de cada BD, assim como as equivalncias entre os esquemas, ou seja, o nome
das tabelas e colunas podem ser distintos em cada BD e uma consulta, ao ser distribuda
entre os stios, precisa ser alterada para acessar as tabelas e as colunas equivalentes. Para
criar essa equivalncia preciso fazer o mapeamento entre os BD, que zsu e Valduriez
(2001) denominam de Esquema Conceitual Global (ECG).
Nesse trabalho foi desenvolvido um editor de ECG, onde se criam os
mapeamentos entre os BD. Esse editor salva o esquema num arquivo, de formato XML,
que deve ser acessvel ao driver JDBC. Baseado nesse ECG o driver transforma as
consultas para atender cada BD. Com esse ECG possvel para o driver tratar a
fragmentao horizontal, ou seja, as linhas das tabelas de BD distintos formam uma
nica tabela lgica para o usurio.
Esse artigo estruturado da seguinte forma: primeiro apresentada uma breve
fundamentao sobre BDD, ECG e fragmentao horizontal; em seguida descrita a
API JDBC; na seo subsequente apresentado o driver JDBC e o editor de ECG
desenvolvido para depois mostrar um exemplo de sua utilizao. Por ltimo so feitas as
consideraes finais onde so evidenciadas as vantagens e limitaes do driver, assim
como sugestes para trabalhos futuros.

2. Bancos de Dados Distribudos


Segundo Date (2000), [...] um banco de dados distribudo aquele que no
armazenado em sua inteireza em uma nica localizao fsica mas, ao contrrio, est
espalhado por uma rede de localizaes geograficamente dispersas e ligadas por meio de
links de comunicao. Um sistema de gerenciamento de banco de dados distribudo
(SGBDD) que gerencia essa distribuio e a torna transparente para o usurio.
Os projetos de BD so criados de forma independente, com a finalidade de
atender os requisitos de um patrocinador. Quando surge a necessidade de integrar BD,
seja pela necessidade de integrao de sistemas distintos numa rede local, ou
distribudos geograficamente, normalmente existem divergncias quanto nomenclatura
e estrutura das relaes desses BD. zsu e Valduriez (2001), afirmam que a integrao
de bancos de dados envolve o processo pelo qual as informaes de bancos de dados
participantes podem ser integradas conceitualmente para formar uma nica definio
coesa de um banco de dados mltiplo.
Para criar essa integrao conceitual entre as diferentes relaes so
estabelecidas equivalncias entre as relaes de cada BD. O Esquema Conceitual Global
(ECG) o conjunto de todos os BD envolvidos, com seus stios e relaes, e
equivalncias dessas relaes. Com isso se criam as relaes globais, ou seja, um nome
nico para um conjunto de uma ou mais relaes em cada BD envolvido. As relaes de
cada BD so chamadas de relaes locais. Na relao global tambm constam as colunas
globais, que tem equivalncias com colunas das relaes locais.
Por exemplo, dados dois BD, um deles com uma relao de nome CLIENTE,
com as colunas ID, DESCRICAO e ENDERECO, e outro BD com a relao de nome
CLIENTES com as colunas CD_CLIENTE, DS_NOME e DS_EMAIL. Pode-se criar
uma relao global chamada TABCLIENTES com as colunas CODIGO, NOME,

ENDERECO e E_MAIL, e fazer as associaes da coluna CODIGO com as colunas


CLIENTE.ID
e
CLIENTES.CD_CLIENTE,
da
coluna
NOME
com
CLIENTE.DESCRICAO e CLIENTES.DS_NOME, e assim por diante.
As consultas so feitas utilizando as relaes globais. Segundo zsu e Valduriez
(2001), o processo de execuo de uma consulta distribuda dividida em quatro fases:
1. decomposio da consulta: o sistema decompe o consulta em objetos do BD
(relaes e colunas);
2. localizao dos dados: nessa fase o sistema determina para cada BD envolvido
uma nova verso da consulta, utilizando os nomes das relaes e colunas locais;
3. otimizao das consultas globais: visa diminuir o custo de enviar uma consulta e
receber a resposta. O sistema pode-se utilizar de cache, ou reconstruir a consulta
para atender as especificidades de cada fabricante de BD;
4. otimizao das consultas locais: diz respeito otimizao realizada por cada BD
localmente, o que foge do escopo de um SGBDD.
O resultado das consultas locais so ento agrupadas e formatadas para atender o
mapeamento global. Esse processo resulta na unio e juno dos fragmentos. A unio
ocorre na fragmentao horizontal, ou seja, quando uma relao dividida em linhas
que so distribudas em diferentes stios (Elmasri e Navathe, 2005). A juno ocorre
quando uma relao dividida em colunas distribudas pelos stio.
No exemplo anterior, os dados dos clientes de uma empresa esto fragmentados
em duas tabelas nos BD. No caracterizado uma fragmentao vertical pois os
atributos de um cliente no esto divididos entre os stios mas, os clientes por inteiro.

3. API JDBC
A API JDBC a interface de programao de aplicaes que prov acesso de dados
nico para a linguagem de programao Java (Sun, 2002). Essa API responsvel por
intermediar a comunicao entre a aplicao e o SGBD. O fabricante de SGBD que
deseja disponibilizar seu sistema para aplicaes na linguagem Java devem desenvolver
um driver que siga a especificao da API JDBC.
Existem quatro categorias de tecnologias para a API JDBC:
1. JDBC-ODBC: a comunicao ocorre atravs de drivers ODBC instalados nas
mquinas clientes;
2. API Nativa: converte as chamadas do JDBC em chamadas s API nativas do
SGBD, por exemplo, usando DLLs;
3. JDBC-Net: se comunica atravs de um protocolo de rede genrico, ou seja, as
solicitaes so feitas a um intermedirio, que redireciona para o SGBD;
4. Protocolo Nativo: vai diretamente ao banco de dados, utilizando o protocolo de
rede do prprio SGBD.
As duas ltimas alternativas so consideradas as melhores na utilizao da API
JDBC, pois no exigem instalaes e configuraes nas mquinas clientes.

A Figura 1 apresenta o relacionamento bsico entre algumas interfaces e classes


da API JDBC. A classe DriverManager responsvel pelo registro e gerenciamento dos
drivers, assim como selecionar o driver e estabelecer a conexo com o BD.

Figura 1. Relacionamento entre interfaces e classes da API JDBC

O fabricante do SGBD precisa implementar classes que realizam as interfaces


apontadas na Figura 1. A classe que realiza a interface Driver deve ser responsvel pelo
registro dele junto ao DriverManager. Alm disso, o DriverManager invoca o mtodo do
Driver para a conexo com o BD. Um objeto Connection a conexo com o BD. Os
objetos Statement, assim como PreparedStatement que no consta na Figura 1, so
responsveis pela interpretao de expresses SQL, assim como sua execuo junto ao
BD. Os objetos ResultSet gerenciam os resultados de uma consulta.
O Quadro 1 apresenta um exemplo de utilizao da API JDBC. Na linha 1 feito
o carregamento do driver do fabricante do SGBD. Na linha 2 estabelecida a conexo
com o BD. Na linha 3 criado um objeto (Statement) responsvel pela execuo de
expresses SQL. Esse objeto instanciado atravs da conexo feita na linha 2. Na linha
4 enviada ao SGBD um expresso e recebido um objeto (ResultSet) que controla o
retorno dessa expresso. Entre as linhas 5 a 8 acontece a iterao sobre o resultado da
consulta. E nas trs ltimas linhas so liberados os recursos alocados tanto na execuo
da consulta quanto na conexo com o SGBD.
Quadro 1. Exemplo de utilizao da API JDBC
1
2
3
4
5
6
7
8
9
10
11

Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306",
"root", "root");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM CLIENTES");
while (rs.next()) {
System.out.print("Cdigo : " + rs.getInt(1));
System.out.println("Nome : " + rs.getString("DS_NOME"));
}
rs.close();
st.close();
con.close();

4. Trabalho Desenvolvido
Nessa seo ser apresentada a estrutura e o funcionamento do driver JDBC
desenvolvido nesse trabalho, assim como a ferramenta para edio do ECG.

4.1. Driver JDBC Proposto


A Figura 2 apresenta as classes desenvolvidas nesse trabalho que realizaram as
interfaces citadas na Figura 1. Para melhorar a leitura, os parmetros dos mtodos foram
excludos do diagrama.

Figura 2. Classes JDBC do trabalho

A classe JGDriver (o prefixo JG vem das iniciais de Jacson Gonalves, o aluno


que desenvolveu esse trabalho) realiza a interface java.sql.Driver. Ela tem duas
responsabilidades:
1. registrar-se invocando o mtodo registerDriver() de DriverManager. Essa
chamada acontece num bloco esttico da classe, como apresentado no Quadro 2;
Quadro 2. Fase de Registro do JGDriver
1
2
3
4
5

static {
try {
java.sql.DriverManager.registerDriver(new JGDriver());
} catch (SQLException E) {
throw new RuntimeException("Falha ao registrar o driver!");
}
}

2. estabelecer conexo com os bancos de dados, com a implementao do mtodo


connect(), atravs dos seguintes passos:
a. verificar se a URL passada como parmetro est consistente com o
exigido pelo driver. A URL exigida pelo driver deve estar no seguinte
formato:
jdbc:jg//<nome do arquivo ECG>
b. executa o carregamento do ECG, atravs de um objeto da classe JGXml.
Esse objeto responsvel pela leitura e povoamento do objeto
CadastroECG, que por sua vez conter os mapeamentos entre as relaes

globais e locais. A criao do arquivo com o ECG feita num momento


anterior, atravs de uma ferramenta descrita na prxima seo;
c. se conecta a cada banco de dados identificado no ECG. Nessa fase o
objeto executa as linhas 1 e 2 do Quadro 1 para cada um dos bancos de
dados.
A classe JGConexao realiza a interface java.sql.Connection. A responsabilidade
dela manter a lista de conexes feitas durante a execuo do mtodo connect() de
JGDriver. Alm disso, ela cria objetos JGStatement quando for necessrio executar
consultas, ou seja, no mtodo createStatement().
A classe JGStatement, que realiza a interface java.sql.Statement, responsvel
por preparar a execuo de uma consulta global no mtodo executeQuery(). Esse
processo dividido nas seguintes fases:
1. analisar a expresso identificando as tabelas e colunas envolvidas. A partir da
definio de uma gramtica da expresso SELECT, executa uma anlise
semntica para identificar esses itens;
2. criar uma nova verso da expresso SQL para cada BD mapeado, considerando o
nome das tabelas e das colunas, e ainda se existem ou no, esses itens em cada
BD. A nova expresso gerada simplesmente trocando o nome das tabelas e
colunas de acordo com o BD. Se a coluna utilizada em uma restrio,
agrupamento ou ordenao no existir no BD, ento a nova verso
simplificada;
3. criar um objeto JGResultSet com a lista de expresses convertidas no passo
anterior.
O mtodo executeUpdate() da classe JGStatement no foi implementado nesse
trabalho, uma vez que o propsito desse driver a realizao de consultas e no
incluses ou alteraes.
A interface java.sql.PreparedStatement tem propsitos semelhantes Statement.
A diferena essencial entre elas que na primeira se cria o objeto j associado a uma
expresso SQL, alm de poder construir essa expresso como parametrizvel, ou seja,
monta-se a expresso deixando os valores para serem atribudos num momento
posterior. A interface PreparedStatement no foi implementada nesse trabalho.
A classe JGResultSet, que realiza a interface java.sql.ResultSet, que coordena a
execuo das expresses transformadas pelo JGStatement. Essa coordenao feita no
mtodo next(). O objeto JGResultSet executa uma consulta por vez. Esse objeto mantm
a lista de consultas a serem executadas, e a qual BD foi requisitada a ltima consulta e
que est retornando atualmente os resultados dessa consulta. Toda vez que o mtodo
next() invocado ele captura uma linha de resultado do BD remoto. No momento que
alcanar o fim da iterao desse BD, executada a consulta no BD seguinte, e assim
ocorre sucessivamente at que toda a lista de BD foi percorrida. No resultado final,
devolvido como NULL nas projees das colunas da consulta global que no existem
nas locais.

importante frisar que essa soluo faz com que a consulta processe
independente e sequencialmente em cada BD. Com isso, junes, agrupamentos e
ordenaes so executadas localmente e no globalmente.
4.2. Edio do ECG
Como comentado na seo anterior, o driver necessita de um arquivo com a
identificao dos BD envolvidos e o mapeamento das relaes globais com as locais.
Esse arquivo, que denominado como ECG, est no formato XML nesse trabalho.
Nesse arquivo so definidos os bancos de dados, as tabelas globais, e o
relacionamento entre as tabelas de cada banco com as tabelas globais. Em cada banco de
dados mantido um apelido (um nome de batismo), o nome da classe driver do JDBC, a
URL de conexo, o nome de um usurio e senha para conexo. Em cada tabela global
mantido o nome da tabela e uma lista de nomes das colunas. Em cada relacionamento
existe o nome do banco que ser mapeado, e o mapeamento entre as tabelas. Para cada
uma dessas tabelas est a equivalncia entre o nome das tabelas globais e locais, e a
equivalncia entre os nomes das colunas das tabelas globais e locais.
Para edio desse arquivo foi desenvolvida uma ferramenta visual para o
desenvolvedor da aplicao que utilizar o driver. Essa ferramenta foi dividida em trs
guias: a primeira para cadastrar os bancos de dados, a segunda para criar as tabelas
globais e a terceira para os relacionamentos.
A Figura 3 apresenta a guia onde so cadastrados os bancos de dados. Pode-se
observar nessa tela que na grade existem trs bancos de dados cadastrados.

Figura 3. Cadastro dos bancos de dados

A Figura 4 mostra a guia onde so cadastradas as tabelas globais. Na lista da


esquerda esto as tabelas globais e na lista da direita esto as colunas da tabela marcada
na lista da esquerda.

Figura 4. Cadastro das tabelas globais

A Figura 5 ilustra o mapeamento entre as tabelas globais e locais. No lado


esquerdo est a lista de bancos de dados. Para cada banco de dados a ferramenta carrega
a lista de tabelas, e para cada tabela carregada a lista de colunas. No lado direito esto
listadas as tabelas globais (a partir de uma caixa de seleo) e as colunas dessas tabelas.
Para fazer o mapeamento, clica-se (1) numa coluna da tabela local e em uma (2) coluna
da tabela global, e em seguida clica-se (3) no boto [Relacionar colunas]. Na parte
inferior da janela esto enumeradas a relao entre as colunas.

Figura 5. Mapeamento das tabelas globais com as locais

5. Avaliao
Com o intuito de experimentar e provar a funcionalidade do driver foi elaborada uma
aplicao que possui uma nica janela com uma caixa de edio onde digitada uma
expresso SQL e uma grade para mostrar os resultados dessa consulta.
Alm disso, foram projetados trs bancos de dados em trs diferentes
fabricantes: Oracle, Firebird e MySQL. Os esquemas de cada banco de dados esto
apresentados na Figura 6. O nome de todas as tabelas difere, alm do nome e a
quantidade das colunas entre as tabelas de mesmo propsito. Por exemplo, as vendas
esto representadas por uma tabela VENDA no Oracle, TAB_VENDAS no Firebird e
VENDAS no MySQL.

Figura 6. Modelo fsico dos bancos de dados usados para testes e validao

O Quadro 3 apresenta o ECG parcial exemplificando o mapeamento do banco de


dados que foi utilizado com o MySQL.
Quadro 3. ECG parcial utilizado para testes e avaliao
<?xml version="1.0" encoding="ISO-8859-1" ?>
<jg:ecg xmlns:jg="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="C:/Temp/JGComplexTypes.xsd">
<jg:bancosDados>
<jg:bancoDado>
<jg:nome>Filial do estado do Amap</jg:nome>
<jg:driver>com.mysql.jdbc.Driver</jg:driver>
<jg:url>jdbc:mysql://localhost:3306/mp</jg:url>
<jg:usuario>jaco</jg:usuario>
<jg:senha>jaco</jg:senha>
</jg:bancoDado>
</jg:bancosDados>
<jg:mapeamentoGlobal>
<jg:tabela>
<jg:nomeTabela>PRODUTOS</jg:nomeTabela>
<jg:colunas>
<jg:coluna>NOME_PRODUTO</jg:coluna>
</jg:colunas>
</jg:tabela>
</jg:mapeamentoGlobal>
<jg:mapeamentoLocal>
<jg:relacionamento>
<jg:banco>Filial do estado do Amap</jg:banco>
<jg:tabelas>
<jg:tabela>
<jg:nomeTabelas>
<jg:tabelaGlobal>PRODUTOS</jg:tabelaGlobal>
<jg:tabelaLocal>PRODUTO</jg:tabelaLocal>
</jg:nomeTabelas>
<jg:colunas>
<jg:coluna>
<jg:colunaGlobal>NOME_PRODUTO</jg:colunaGlobal>

<jg:colunaLocal>NM_PRODUTO</jg:colunaLocal>
</jg:coluna>
<jg:coluna>
<jg:colunaGlobal>VALOR_PRODUTO</jg:colunaGlobal>
<jg:colunaLocal>VL_PRODUTO</jg:colunaLocal>
</jg:coluna>
</jg:colunas>
</jg:tabela>
</jg:tabelas>
</jg:relacionamento>
</jg:mapeamentoLocal>
</jg:ecg>

Os testes foram feitos tanto em mquinas locais, quanto distribuindo os


servidores dentro de uma rede local.
A Figura 7 apresenta o resultado da execuo da expresso SELECT
CODIGO_CLIENTE, NOME_CLIENTE, NUMERO_CNPJ, SIGLA_ESTADO FROM
CLIENTES WHERE CODIGO_CLIENTE < 5. Na coluna CODIGO_CLIENTE
observa-se que as chaves se repetem. Isso acontece porque essa chave isolada para
cada BD. A coluna NUMERO_CNPJ das primeiras linhas est em branco, assim como
SIGLA_ESTADO para as ltimas linhas. Isso aconteceu porque essas colunas no
existem nas linhas dos BD que resultaram em branco, ou seja, nos BD I e II no existe a
coluna para CNPJ, e nos BD II e III no existe a coluna para a sigla do estado.

Figura 7. Grade da aplicao de validao com o resultado de uma consulta

O Quadro 4 apresenta o cdigo fonte da aplicao de avaliao. Na linha 1


acontece o registro do driver. Na linha 2 executa a conexo com os bancos de dados. O
nome do arquivo ECG baseado no valor de um campo da tela, e o prefixo jdbc:jg//
exigido pelo driver, como j mencionado nesse artigo. As linhas 3 e 4 so responsveis
pela execuo da expresso SQL. Essa expresso tambm vem de um campo da tela. Na
linha 5 obtido um objeto (ResultSetMetaData) que contm todas as colunas resultantes
da consulta. A linha 6, que foi abreviada no quadro, utiliza as colunas do metadados
para criar as colunas da grade que mostrar o resultado da consulta. Esse resultado
obtido entre as linhas 7 a 9 onde ocorre a iterao sobre a resposta da consulta. Entre as
linhas 10 a 12 acontecem a liberao dos recursos alocados para a execuo da consulta.
Quadro 4. Cdigo fonte da aplicao de validao
1
2
3
4
5
6
7
8
9

Class.forName("br.furb.jdbc.JGDriver");
Connection con =
DriverManager.getConnection("jdbc:jg//"+nomeArquivo);
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
ResultSetMetaData meta = rs.getMetaData();
...
while (rs.next()) {
...
}

10
11
12

rs.close();
st.close();
con.close();

6. Consideraes finais
Ao concluir esse trabalho pde se perceber uma maior facilidade em utilizar um driver
JDBC do que um middleware na utilizao de uma aplicao. O middleware exige
instalaes adicionais na mquina do cliente, e alm disso, representa uma nova
aplicao sendo executada. Com o uso do driver JDBC proposto nesse trabalho, o
programador Java desenvolve as consultas como j vinha fazendo antes com BD no
distribudos. No caso do middleware, ao programador exigiria um aprendizado de uma
nova API, assim como a insero de cdigo especfico para dar suporte ao middleware.
Uma caracterstica nata na utilizao de drivers JDBC, que a aplicao fica
independente do BD, ou seja, se o desenvolvedor implementou uma aplicao utilizando
o driver desse trabalho, para utilizar outro driver, por exemplo para acessar uma BD
local, basta ele informar a classe do driver e montar a URL de conexo com o BD.
claro que as consultas dependem da existncia das tabelas, que esto no SELECT, no
BD local. Comparando-se os Quadros 1 e 4, verifica-se que a forma de utilizar o driver
JDBC implementado nesse trabalho no varia com a utilizao de outros drivers.
O driver aqui proposto possui limitaes na execuo das consultas no uso de
agrupamentos e ordenaes, por considerar as consultas isoladamente. Devido a esse
isolamento, tambm no possvel juntar linhas de bancos de dados diferentes.
Como sugesto de trabalhos futuros, alm de resolver esse problema, (i) precisa
ser implementada uma classe que realiza a interface PreparedStatement; (ii) quando
reconstruir uma consulta global para uma consulta local, utilizar recursos especficos do
BD, com intuito de otimizar a consulta; (iii) executar as consultas locais
concorrentemente; (iv) tratamento de linhas com mesmo significado representarem a
mesma linha, por exemplo, o mesmo cliente cadastrado em dois BD diferentes; (v) ter a
possibilidade de utilizar colunas de BD distintos nas projees, permitindo clculos
nessas consultas.

Referncias
Date, C. J. (2000) Introduo a sistemas de bancos de dados, Editora Campus.
Elmasri, R.; Navathe, S. B. (2005) Sistemas de Banco de Dados, Pearson Addison
Wesley.
zsu, T.; Valduriez, P. (2001) Princpios de sistemas de bancos de dados distribudos,
Editora Campus.
Ramon, F. (2001) JDBC 2: acesso a banco de dados utilizando a linguagem Java,
Editora Novatec.
Sun Microsystems. JDBC. (2002). http://java.sun.com/javase/6/docs/technotes/guides/jdbc/.

Das könnte Ihnen auch gefallen