Вы находитесь на странице: 1из 10

Ciência da

Computação

Utilização da Linguagem de Programação Java com Bancos de Dados Relacionais

Sérgio Luís Pedron *

Carlos Henrique Gremelmeier **

 
Resumo: Este trabalho estuda a linguagem de programação Java, suas características, recursos, e o modo como acessa e 
manipula informações armazenadas em um banco de dados relacional. É pesquisada a biblioteca de funções JDBC – Java 
DataBase Connectivity que possui os métodos necessários para efetuar a conexão com o banco de dados e a manipulação 
das informações nele armazenadas, através de comandos SQL.

Utilizando  os  recursos  de  Java,  será  possível  desenvolver  aplicações  independentes  de  plataforma  e  de  fornecedor, 
acessando um banco de dados corporativo.

Palavras Chaves: Java, Aplicação Independência de Plataforma, Banco de Dados.

Abstract: This work aims to study programming in Java’s language, its features, resources and the way that the Information 
are accessed,  manipulated  and  stored  on a relational  Database with  Java.  A function library of JDBC is researched – Java 
Database  Connectivity  - that  have  the  necessary  methods  to  make  the  connection  with  the  database  and  manipulate  the 
information  through  SQL  commands.  Using  the  resources  of  Java,  is  possible  to  develop  applications  independent  of 
plataform and supplier, acessing a corporate database.

Keywords: Java, Plataform Independent Aplications, Database.

1 Introdução

Em  tempos  onde  o  bem  mais  precioso  é  a  informação  rápida  e  precisa,  a  informática  torna-se  a  principal  ferramenta  para  o 
armazenamento  e  o  acesso  aos  dados  necessários  para  qualquer  processo  de  tomada  de  decisões.  A  democratização  do  acesso  à 
informação vem se consolidando ao longo do tempo, aumentando o número de usuários e aplicações que acessam um mesmo dado. Isto 
é observado desde o momento em que os sistemas legados passaram a ser substituídos pelos sistemas Cliente/Servidor. 

Não  é  mais  admissível  que  apenas  um  programa  ou  linguagem  de  programação  acesse  um  conjunto  de  dados.  Atendendo  a  este 
requisito, as corporações estão convertendo seus arquivos legados para aplicações em sistemas gerenciadores de bancos de dados, que 
podem ser acessados por diversos meios e por diferentes linguagens de programação, utilizando-se da arquitetura Cliente/Servidor.

Os componentes básicos de uma arquitetura Cliente/Servidor são uma parte cliente e outra parte servidor, conectados por uma rede local. 
O  software  localizado  no  cliente  é  normalmente  chamado  de  software  front-end,  e  o  software  localizado  no  servidor  é  chamado  de 
software back-end.

Um  sistema  gerenciador  de  banco  de  dados  relacional  (SGBDR)  é  um  software de  back-end,  que  se  ocupa  unicamente  das  atividades 
diretamente  relacionadas  aos  dados  que  ele  contém,  como  segurança,  integridade,  otimização,  recuperação  e  atualização  dos  dados, 
entre outras. Um SGBDR pode ser acessado por software cliente, utilizando SQL, uma linguagem não procedimental usada para definição 
de dados, consultas, controle de acesso e manipulação dos dados. 

A evolução das linguagens de programação está permitindo a construção de aplicativos front-end de alta qualidade em um curto intervalo 
de  tempo.  Entre  essas  ferramentas  para  desenvolvimento  front-end,  encontra-se  Java,  uma  linguagem  de  programação  utilizada  em 
sistemas  Cliente/Servidor,  e em  aplicações para Internet ou Intranet.  Java é uma  linguagem de desenvolvimento de aplicativos  simples, 
genérica,  orientada  a objetos,  robusta  e segura. Através  de sua  máquina virtual (Java  Virtual  Machine) portátil, java  resolve  o problema 
interplataforma, fazendo com que os aplicativos possam ser executados em qualquer plataforma. Se a aplicação estiver na Internet ou em 
uma Intranet, o software front-end não precisa estar instalado na máquina cliente. Ele é carregado e executado na máquina local apenas 
quando  sua  utilização  for  necessária,  podendo  estar  armazenado  em  qualquer  servidor  da  rede.  Desta  forma  é  possível  romper  as 
barreiras da arquitetura Cliente/Servidor e dar maior flexibilidade aos aplicativos.

file://\\76.12.86.138\Drawloop Data\Site Data\Output\darlanpenedo@bol.com.br_utilizacao.htm.html
A conexão de um  aplicativo front-end ou uma  applet escrita em  Java com  um  banco  de dados  relacional , é realizada através  do JDBC 
(Java  DataBase  Connectivity)  utilizando  SQL.  O  JDBC  é  um  padrão  para  acesso  a  bancos  de  dados  SQL.  Sua  API  representa  uma 
interface  uniforme  para  que  programadores  JAVA  desenvolvam  aplicativos  para  acessar  uma  ampla  variedade  de  bancos  de  dados 
relacionais.

2 Características

Segundo  a  Sun,  Java  foi  estruturado  para  ser:  "Orientado  a  objetos,  robusto,  seguro,  independente  de  arquitetura,  portável,  de  alto 
desempenho, interpretável, com linhas de execução (threads) e dinâmico."

Java  se  tornou  mais  simples  pois  retirou  de  sua  sintaxe  algumas  características  presentes  no  C++,  como  arquivos  de  cabeçalho, 
aritmética de ponteiros, estruturas, uniões, etc. Algumas destas características são confusas e podem ocasionar problemas na execução 
de um aplicativo, se o programador não tiver pleno conhecimento do que está fazendo. 

No que diz respeito a orientação  a objeto, a principal diferença entre Java e C++,  é a herança múltipla.  Java suporta  herança, mas  não 


herança múltipla. A ausência de herança múltipla pode ser compensada pelo uso de herança e interfaces.

Aplicativos  escritos  em  Java  são  mais  robustos,  pois  a  linguagem  impõem  mais  restrições  ao  programador.  A  presença  de  coleta 
automática  de  lixo,  evita  erros  comuns  que  os  programadores  cometem  quando  são  obrigados  a  gerenciar  diretamente  a  memória.  A 
eliminação  do  uso  de  ponteiros,  em  favor  do  uso  de  vetores,  objetos  e  outras  estruturas  substitutivas  traz  benefícios  em  termos  de 
segurança.  O  programador  é  proibido  de  acessar  a  memória que  não  pertence ao  seu  programa,  além  de  não  ter  chances  de  cometer 
erros comuns tais como uso indevido de aritmética de ponteiros. O mecanismos de tratamento de exceções também torna as aplicações 
mais robustas, não permitindo que elas abortem, mesmo quando rodando sob condições anormais.

Como Java foi criado para ambientes de rede, os recursos de segurança receberam muita atenção. Um programa Java não corrompe a 
memória fora de seu próprio processo, não lê nem escreve em arquivos locais quando é chamado em um carregador de classes seguro 
como um browser Web, e evita erros de stack overflow.

Um  programa  fonte  escrito  em  linguagem  Java  é  traduzido  pelo  compilador  para  os  bytecodes,  isto  é,  o  código  de  máquina  de  um 
processador  virtual,  chamado  Java  Virtual  Machine  (JVM).  A  JVM  é  um  programa  capaz  de  interpretar  os  bytecodes  produzidos  pelo 
compilador, fazendo com que um programa Java possa ser executado em qualquer plataforma, desde que esteja dotada de uma JVM. A 
vantagem desta técnica é evidente: garantir uma maior portabilidade para os programas Java em código-fonte e compilados. 

Java  também  tira  proveito  dos  padrões  IEEE  para  os  tipos de  dados  comuns em  vários tipos  de  computadores.  Por  exemplo,  em  Java 
uma estrutura de dados float sempre estará de acordo com o padrão IEEE 754 para números de ponto flutuante, enquanto o tipo de dado 
int será sempre um inteiro de 32 bits com complemento de dois sinalizado. 

O  interpretador  de  Java  pode  executar  os  bytecodes  do  Java  diretamente  em  qualquer  máquina  para  o  qual  o  interpretador  tenha  sido 
transportado. Esta é uma vantagem enquanto desenvolvemos uma aplicação, mas ela é claramente mais lenta que um código compilado. 
A vantagem é que ela diminui a preocupação dos desenvolvedores com problemas de versões erradas, comuns na maioria dos ambientes 
de desenvolvimento. Compiladores específicos para Java não estão disponíveis. Ao invés disso, há compiladores Just-in-Time (JIT). Eles 
trabalham compilando uma vez  os bytecodes em  código  nativo.  Em seguida lêem o resultado e repetem a compilação caso necessário. 
Ainda que mais lento que compiladores nativos, os compiladores Just-in-Time podem aumentar de 10 a 20 vezes a velocidade de muitos 
programas e são quase sempre significativamente mais rápidos que o interpretador Java.

Outra característica da linguagem, é a mutithread, onde um programa pode fazer mais de uma coisa ao mesmo tempo, como por exemplo, 
gravar um arquivo e imprimir outro.

De  diversas  maneiras,  Java  é  uma  linguagem  mais  dinâmica  do  que  C  ou  C++.  Ela  foi  projetada  para  adaptar-se  a  um  ambiente  em 
evolução. As bibliotecas podem adicionar livremente novos métodos e variáveis de instância sem qualquer efeito sobre seus clientes. Em 
Java,  a  descoberta  do  tipo  de  dado  em  tempo  de  execução  é  imediata.  Esta  é  uma  característica  importante  nas  situações  em  que  o 
código precisa ser adicionado a um programa em execução. Um exemplo é o código que é transferido da Internet para ser executado no 
browser. 

Para a construção de interfaces gráficas, Java possui uma biblioteca de classes para a programação básica da GUI (Interface Gráfica do 
Usuário)  chamada  Abstract Window Toolkit  ou  AWT  (Guia  de  ferramentas  de  janelas  abstratas).  A  AWT  é  um  tanto  primitiva,  pouco 
documentada  e  sem  muito  poder.  Porém,  ela  independe  de  plataforma,  pois  aceita  apenas  as  funções  comuns a  todos  os  sistemas  de 
janelas. Todos os objetos presentas na maioria dos sistemas de janelas podem ser colocados em uma interface gráfica construída com a 
AWT: botões, entradas de texto, labels, frames, caixas de verificação, listagens drop-down, menus, etc. 

3 Conexão de Java com Bancos de Dados Relacionais

Sem  dúvida  o  maior  incremento  à  programação  Java,  é  a  possibilidade  de  acesso  a  bancos de  dados  relacionais,  juntamente  com  sua 
independência de plataforma. Programas desenvolvidos em Java, são independentes de plataforma e de fornecedor. O mesmo programa 
de  banco  de  dados  desenvolvido  com  Java  pode  rodar  em  um  PC,  uma  estação  de  trabalho  ou  um  terminal  de  Java  ("NC  – network 

file://\\76.12.86.138\Drawloop Data\Site Data\Output\darlanpenedo@bol.com.br_utilizacao.htm.html
computer"). É possível mover os dados de um banco de dados a outro, por exemplo do Microsoft SQL Server ao Oracle, e ainda assim o 
programa lerá os dados. Para atender a estes requisitos, a primeira biblioteca que a Sun forneceu após o Java Development Kit (JDK), foi 
o Java DataBase Connectivity (JDBC).

3.1 JDBC

Para entender melhor o funcionamento do JDBC, é necessário saber os princípios básicos do ODBC, que deu origem ao JDBC.

A ODBC é uma API que permite aos programas em C fazer chamadas no servidor SQL e receber seus resultados. ODBC significa Open 
Database Connectivity. É uma especificação de interface para acesso a dados, estabelecida por grupos de padronização como X/Open e 
SQL  Access  Group.  Essa  especificação  provê  funções  para  conectar  e  desconectar  fontes  de  dados,  preparar  e  executar  comandos, 
processar erros  e processar transações.  Para executar as consultas SQL,  basta passá-las como  parâmetros em  funções específicas do 
ODBC, ou seja, a consulta pode ser definida em tempo de execução(SQL Dinâmico), utilizando características próprias do banco ao qual a 
aplicação está conectada no momento.

A  interface  ODBC,  permite  que  os  programas  sejam  escritos  sem  que  se  tenha  qualquer  preocupação  com  protocolos  específicos  de 
comunicação  dos  bancos  de  dados,  é  necessário  apenas  criar  as  consultas  SQL  e  executar  as  funções  do  ODBC,  de  forma  a  criar  e 
terminar uma conexão, realizar consultas, e tratar os resultados.

JDBC é uma API(Biblioteca de funções) da Linguagem Java, que permite uma conexão genérica com diferentes tipos de banco de dados 
de forma idêntica a interface ODBC. Com JDBC, os programadores podem escrever comandos SQL de forma única para tipos de banco 
de dados totalmente diferentes, sendo que os fabricantes dos bancos devem prover o Driver de JDBC para seus produtos. 

A  idéia  por  trás  do  JDBC  é  criar  suporte  para  utilização  do  SQL  padrão  em  Java.  Assim  como  é  feito  com  o  ODBC,  pode-se  passar 
comandos  em  forma  de  string  para  o  driver  do  banco  de  dados  e  receber  deste  os  resultados  de  forma  que  toda  a  operação  seja 
transparente  ao  programador.  Este  precisa  apenas  processar  os  comandos  SQL  e  receber  os  seus  resultados,  ficando  toda 
particularidade do banco, gerenciada pelo driver do fabricante e comandada pelas rotinas internas do JDBC. O programador precisa saber 
apenas SQL e as rotinas de Java para executar comandos SQL a partir do JDBC.

3.1.1 Conexão com o Banco de Dados

Para fazer a conexão de um programa Java com  um banco de dados, é necessário a instalação de um driver que se comunique com o 
JDBC no lado cliente, e possa se comunicar no dialeto do banco no lado servidor. Este driver traduz os comandos JDBC para comandos 
nativos do banco de dados do fabricante. Caso o fornecedor do banco de dados ainda não tenha disponibilizado um driver escrito em Java 
para acessar o banco, será necessário utilizar uma ponte entre o JDBC e o ODBC, já que existem drivers de ODBC para a maioria dos 
bancos de dados. 

A  ponte  JDBC-ODBC  converte  chamadas  JDBC  em  chamadas  ODBC.  Assim,  ela  permite  que  o  JDBC  comunique-se  com  um  driver 
ODBC servindo como front-end de um banco de dados. 

Para realizar a conexão, é preciso informar ao gerenciador de drivers JDBC, quais drivers estarão disponíveis. Quando utilizada a ponte 
JDBC-ODBC, o registro é feito da seguinte forma: 

Class.forName("jdbc.odbc.JdbcOdbcDriver");

Para registrar um driver JDBC, utilize a seguinte sintaxe: 

DriverManager.registerDriver(new

Oracle.jdbc.driver.OracleDriver());

Após  registrar  os  drivers,  já  é  possível  iniciar  uma  conexão  com  o  banco  de  dados,  especificando  a  origem  dos  dados  com  alguns 
parâmetros  adicionais.  Esta  origem  é  especificada  utilizando  uma  sintaxe  similar  às  URLs  normais  de  rede.  A  conexão  é  feita  por 
DriverManager.getConnection(). Ele analisa o URL e pergunta a cada um dos drivers registrados, se são ou não capazes de lidar com ele. 
Se  encontrar  um  driver  adequado,  então  faz  a  conexão,  caso  contrário  lança  uma  exceção.  A  sintaxe  para  uma  URL  da  ponte  JDBC-
ODBC é a seguinte:

String url= "jdbc:odbc:FonteDados";

String user = "Sergio";

String password = "luis";

Connection con =

file://\\76.12.86.138\Drawloop Data\Site Data\Output\darlanpenedo@bol.com.br_utilizacao.htm.html
driverManager.getConnection(url, user, password);

A conexão com um driver JDBC escrito em Java é feito da seguinte forma:

Connection con =

DriverManager.getConnection("jdbc:oracle:oci7:@", "Sergio", "Luis");

A formação da URL varia de acordo com cada driver. 

O objeto  connection que é obtido  em  retorno  através da chamada a  getConnection permite usar driver’s JDBC para executar consultas, 


instruções de atualização, construir ou abortar transações.

3.1.2 Instruções de Atualização

JDBC fornece um método para enviar instruções de atualização. O Objeto  Statement, que é fornecido pelo objeto Connection, provê um 
método  executeUpdate().  Para  executá-lo,  é  preciso  obter  antes  um  objeto  Statement,  através  de  um  objeto  Connection já  instanciado. 
Ex.:

Connection con = 

DriverManager.getConnection(url, user, password);

Statement Stmt = 

con.createStatement(); 

Em seguida é possível  emitir  qualquer instrução de  atualização  através  do método  executeUpdate do objeto  Stmt da classe  Statement.
Ex.:

Stmt.executeUpdate("CREATE TABLE 

Clientes 

( CLI_CODI NUMBER(5,0) PRIMARY KEY,

CLI_NOME VARCHAR(50) NOT NULL,

CLI_CIDA NUMBER(5,0) NOT NULL, 

FOREIGN KEY (CLI_CIDA) REFERENCES 

Cidades ");

Stmt.executeUpdate( "INSERT INTO 

Cidades(CID_CODI, CID_DESC,CID_UF)

VALUES(1, ‘Erechim’,’RS’)" );

3.1.3 Consultas

O  método  utilizado  para  realizar  uma  consulta  é  o  executeQuery(),  que  se  assemelha  muito  ao  executeUpdate(),  exceto  pelo  valor 
retornado. De forma diferente de executeUpdate(), o método executeQuery() retorna um objeto ResultSet. Ex.:

Connection con = 

DriverManager.getConnection(url, 

file://\\76.12.86.138\Drawloop Data\Site Data\Output\darlanpenedo@bol.com.br_utilizacao.htm.html
user, password);

Statement Stmt = 

con.createStatement(); 

ResultSet rs =

Stmt.executeQuery("SELECT CLI_CODI,

CLI_NOME FROM CLIENTES");

Para buscar a primeira linha da consulta, utiliza-se o método next().

rs.next();

Se houver mais linhas, pode ser utilizado next() para buscá-las e prepará-las para serem recuperadas com um dos métodos  get. Desde 


que next() responda com um valor booleano e não lance uma exceção quando não há mais linhas, é possível utilizar next() com segurança 
para  testar  a  existência  de  mais  linhas  em  um  loop  while  ou  situação  similar.  Após  utilizar  next()  para  recuperar  uma  linha,  é  possível 
utilizar um dos métodos get para retornar um campo. Ex.:

While (rs.next()) { 

int Codigo =

rs.getString("CLI_CODI");

String Nome =

rs.getString("CLI_NOME");

System.out.println(Codigo + " " 

+ Nome);

Não é  permitido  ler mais de  uma  vez  um  campo  da mesma linha.  É preciso  armazenar o  conteúdo  em  uma  variável  ou objeto  para  ser 
utilizado posteriormente.

Também é possivel utilizar instruções preparadas, que são uma característica avançada dos drivers de JDBC para servidores de bancos 
de dados, tais como: Sysbase, SQL Server, Ingres, Informix, Oracle, entre outros. As instruções preparadas possibilitam pré-compilar uma 
instrução SQL que está freqüentemente sendo utilizada, proporcionando um melhor desempenho, pois não é necessário compilá-la a cada 
vez. Também permite definir parâmetros posicionais que podem tornar o código mais legível. Sempre que o banco de dados executa uma 
consulta, ele primeiramente processa uma estratégia de como executá-la de maneira eficiente. Ao preparar a consulta e reutilizá-la, essa 
etapa de planejamento é feita apenas uma vez. Vale lembrar que esta estratégia utilizada pelo banco, se altera conforme a quantidade de 
dados armazenados. Portanto, deve-se combinar as instruções preparadas, com outras formas de otimização do banco. Cada variável em 
uma consulta preparada é indicada  por  um "?".  Se houver  mais de uma  variável,  um  registro  de posições  do "?"  deverá  ser  mantido ao 
definir os valores.

String query = "SELECT 

CLIENTES.CLI_NOME, CIDADES.CID_DESC 

FROM CLIENTES, CIDADES 

WHERE CLIENTES.CLI_CIDA = 

CIDADES.CID_CODI AND 

CIDADES.CID_DESC = ?";

file://\\76.12.86.138\Drawloop Data\Site Data\Output\darlanpenedo@bol.com.br_utilizacao.htm.html
PreparedStatement pstmt =

con.prepareStatement(query);

Como o objeto Statement (instrução), um objeto PreparedStatement é obtido a partir do objeto Connection.

Observe  que  há um ponto de interrogação  ("?") na instrução. Antes  de executar a consulta  preparada, deve-se fazer links das variáveis 


representadas por "?" a valores reais. Isso é feito através do método set. Assim como os métodos get de ResultSet, há diferentes métodos 
set para os vários tipos. Neste exemplo é definida uma String, utilizando o método SetString. Para inteiros utiliza-se o método setInt.

Pstmt.setString(1, "Erechim");

O  primeiro  argumento  é  a  variável  a  ser  definida.  A  posição  1  denota  o  primeiro  "?".  O  segundo  argumento  é  o  valor  a  ser  atribuído  a 
variável.

Ao reutilizar uma consulta preparada que já foi executada, e a consulta tiver mais de uma variável, todas as variáveis permanecem prontas 
com os mesmos valores, a menos que as altere com um método set. Isso significa que só é preciso chamar set para aquelas variáveis que 
são alteradas de uma consulta para outra.

Uma vez que todas as variáveis estejam vinculadas aos valores, é possível executar a consulta.

ResultSet rs = Pstmt.executeQuery();

Instruções  preparadas  podem  ser  utilizadas  tanto  para  consultas  como  para  a  linguagem  de  manipulação  de  dados,  em  comandos 
INSERT ou UPDATE. A única diferença da consulta, é que em uma alteração ou inclusão o método a ser chamado é executeUpdate(), em 
vez de executeQuery().

3.1.4 Procedimentos Armazenados

Procecimentos  armazenados  também  podem  ser  criados  e  executados  a  partir  do  JDBC.  A  API  JDBC  possui  um  método  da  classe 
connection,  chamado  CallableStatement  (instrução  chamável)  que  permite  trabalhar  facilmente  com  procedimentos  armazenados  que 
podem ou não retornar valores.

Abaixo segue um exemplo de como criar e executar um procedimento armazenado através de Java.

// Criação do Procedimento Armazenado

String Proc = ("CREATE PROCEDURE IncluiCidade(Codi IN NUMBER,

Nome IN VARCHAR2)

UF IN CHAR)

IS BEGIN

INSERT INTO CIDADES (CID_CODI, 

CID_DESC, CID_UF)

VALUES (Codi, Nome, UF);"+

END;");

stmt.executeUpdate(Proc);

// Chamada ao Procedimento

String ChamaProc = "{call IncluiCidade(?,?,?)}";

CallableStatement cstmt = con.prepareCall(ChamaProc);

cstmt.setInt(1,40);

file://\\76.12.86.138\Drawloop Data\Site Data\Output\darlanpenedo@bol.com.br_utilizacao.htm.html
cstmt.setString(2,"Erechim");

cstmt.setString(3,"RS");

cstmt.executeUpdate();

3.1.5 Metadados

O  JDBC  pode  proporcionar  informações  adicionais  sobre  a  estrutura  das  tabelas  de  um  determinado  banco  de  dados  ou  os  nomes  de 
colunas e tipos de uma tabela. Em SQL, os dados que descrevem o banco de dados ou alguma de suas partes são chamados metadados. 
O  JDBC  possui  dois  tipos  de  metadados:  sobre  um  banco  de  dados  e  sobre  um  resultado  de  consulta.  Para  isso  utiliza-se  o  método 
DatabaseMetaData a partir da conexão do banco de dados. Ex.:

DatabaseMetaData md = con.getMetaData();

Para saber o nome de todas as tabelas de um banco de dados, utiliza-se o método getTables(). Ex.:

String[] types = { "TABLES" };

ResultSet rs = md.getTables("null, %, "%", types);

Esta chamada retorna um objeto ResultSet que contém informações sobre todas as tabelas. 

Um  objeto  DatabaseMetaData,  além  de  conter  informações  sobre os  metadados,  também  possui  informações  a  respeito  do  driver e  do 
servidor do banco de dados.

Na maior parte dos casos, applets e aplicações são desenvolvidas com um total conhecimento de seu conjunto de resultados. Porém, em 
alguns  casos,  especialmente  quando  as  instruções  SQL  tenham  sido  feitas  de  maneira  improvisada  ou  quando  for  usado  componentes 
genéricos reutilizáveis, algumas das informações relacionadas com o conjunto de resultados podem não estar disponíveis imediatamente. 
Em  situações  como  essa,  pode  ser  muito  prático  ter  acesso  aos  metadados.  Os  metadados  de  um  conjunto  de  resultados  são  obtidos 
através da seguinte instrução (onde rs é um objeto ResultSet):

ResultSetMetaData rsmd = 

rs.getMetaData();

Em  seguida  é  possível  obter  o  número  de  colunas,  nome  e  tamanho  das  colunas  do  conjunto  de  resultados,  através  dos  seguintes 
métodos:

Int getColumnCount(); Retorna o número de colunas no objeto ResultSet atual.

int getColumnDisplaySize(int coluna); Informa qual é a largura máxima da coluna especificada pelo parâmetro.

 String getColumnName(int coluna); Retorna o nome de coluna associado ao índice de coluna especificado. 

Entre outras  coisas, estas  informações podem  ser  interessantes para por  exemplo, formatar um  label e um campo de texto de tamanho 


suficiente para cada valor.

3.1.6 Sintaxe de Escape do JDBC

Uma vez que cada banco de dados pode prover uma implementação de SQL que tenha suas próprias particularidades, o JDBC (como o 
ODBC) fornece uma sintaxe de escape que mapeia uma sintaxe padrão JDBC para a sintaxe específica do fabricante. Quando é utilizado 
um  driver  que  dá  suporte  a  essa  sintaxe,  não  é  preciso  mudar  o  modo  em  que  o  programa  utiliza  a  API  JDBC;  somente  é  alterada  a 
maneira pelo qual as instruções SQL são geradas. A sintaxe de escape do JDBC oferece meios padronizados para mapear chamadas de 
procedimentos armazenados, funções escalares, expressões de data e hora, e especificações externas de ligação para SQL específica do 
fabricante. Por exemplo, a sintaxe de escape para uma expressão escalar tem o seguinte aspecto: 

{ fn expressão_da_função }

A seguir é exibido um exemplo que utiliza a função agregada COUNT() com um finalizador de escape:

SELECT { fn COUNT(*) } AS Total 

file://\\76.12.86.138\Drawloop Data\Site Data\Output\darlanpenedo@bol.com.br_utilizacao.htm.html
FROM TESTE GROUP BY Nome

A sintaxe de escape JDBC para chamar um procedimento armazenado é:

{ CALL Nome_Procedimento [Parâmetro1, Parâmetro2, ...] }

Alguns drivers com finalidades apenas didáticas e não comerciais, podem não aceitar suporte a transações, sintaxe de escape, chamadas 
a procedimentos armazenados, consultas preparadas e outros recursos avançados de bancos de dados. Portanto, ao adquirir um driver de 
JDBC,  verifique  se  o  driver  possui  implementação  para  todos  os  métodos  estabelecidos pelo  JDBC.  De  preferência  adquira  o  driver  do 
próprio fabricante do banco, ou de empresas autorizadas.

4 Usos Típicos do JDBC

Assim como é possível usar Java tanto para aplicativos quanto para applets, é possível usar a versão JDBC de Java tanto em aplicativos 
quanto em applets. Quando usada em uma applet, todas as restrições normais de segurança são mantidas.

As  applets  Java  que  usam  JDBC  seriam  capazes  apenas  de  abrir  uma  conexão  a  bancos  de  dados  a  partir  do  servidor  do  qual  são 
carregadas. Elas não podem, nem explícita nem implicitamente, fazer uso de informações locais. Embora as extensões JDBC do modelo 
de  segurança  permitam  que  se  descarregue  e  registre  um  driver  JDBC  com  o  gerenciador  de  drivers JDBC no  servidor,  esse driver só 
pode ser usado para conexões a partir do mesmo servidor de onde a applet veio. Isso significa que o servidor Web e o servidor de banco 
de dados devem estar na mesma máquina, o que não é uma configuração típica. Obviamente, o servidor Web pode ter um serviço proxy 
que roteia o tráfego de banco de dados para outra máquina. Portanto, é possível usar JDBC com applets, porém o servidor terá que ser 
gerenciado com cuidado.

Outra limitação ao uso do JDBC em applets, é o fato de que uma applet Java pode não estar carregando código nativo. Como os drivers 
JDBC, como a ponte JDBC-ODBC, exigem bibliotecas nativas, isto pode ser uma restrição significativa. Porém, os fabricantes dos bancos 
já estão fornecendo drivers JDBC 100% em Java, o que facilitará a implementação de applets. 

Por outro lado, os aplicativos têm total liberdade. É possível dar aos aplicativos acesso total aos arquivos e servidores remotos.

Há um terceiro uso possível para uma versão aperfeiçoada do JDBC. A idéia é às vezes chamada como "three tier model" (modelo de três 
camadas).  Isso  significa  que  um  aplicativo  (ou  applet)  Java  chama  uma  camada  intermediária,  que  por  sua  vez  acessa  os  dados.  Isso 
funcionaria melhor  com RMI (objetos  remotos) para a comunicação entre  o cliente e a camada intermediária,  e o JDBC entre a camada 
intermediária  e  um  banco  de  dados  back-end.  Portanto,  as  chamadas  aos  métodos  do  JDBC  são  feitas  na  camada  intermediária. 
Especialmente  por  meio  do  uso  de  melhores  técnicas  de  compilação  (compilação  just-in-time  e  compiladores  nativos),  o  Java  está  se 
tornando rápido o suficiente para ser usado na escrita da camada intermediária.

Camadas  de  acesso  a  bancos  de  dados,  nada  tem  a  ver  com  quantos  drivers  e  gerenciadores  de  drivers  existem  na  cadeia  entre  o 
aplicativo  e  o  banco  de  dados.  Tem  a  ver  com  como  o  código  do  aplicativo  foi  particionado.  Antes  do  cliente/servidor,  era  preciso  se 
conectar  diretamente  ao  sistema  que  possuia  o  banco  de  dados  e  executar  o  programa  nele.  Tal  mainframe  pode  ter  centenas  de 
terminais, como IBM 3270, ligados a ele. Isso representava uma solução de uma camada.

Nos tempos remotos do cliente/servidor, havia uma divisão simples entre código no cliente e dados no servidor. Isso era então chamado 
de "cliente-gordo" ou uma abordagem de duas camadas sem middleware. Agora o modelo foi mais do que aperfeiçoado: freqüentemente o 
cliente somente possui o código da GUI, e existe uma lógica de aplicativo separada em um servidor, chamado servidor de aplicativos, o 
qual o cliente  acessa. A lógica do aplicativo por  sua vez conversa com  um  servidor  de banco  de dados  em um  outro  sistema. O  cliente 
nunca conversa diretamente com o banco de dados.

Portanto,  um  servidor  de  aplicativos  é  uma  plataforma  para  compartilhamento  de  lógica  de  aplicativos.  Ao  passar  essa  lógica  para  um 
ambiente de camada intermediária que hospeda e executa aplicativos empresariais, as organizações podem reduzir significativamente o 
custo e a dificuldade de proporcionar acesso a bancos de dados corporativos e serviços de transações. Os usuários conectam-se a esses 
serviços  por  meio  de  um  simples  browser,  enquanto  o  servidor  de  aplicativos  gerencia  serviços  vitais  como  segurança  integrada, 
confiabilidade  e  escalabilidade.  Para  proporcionar  serviços  completos  de  aplicativos  aos  clientes  de  rede,  um  servidor  de  aplicativos 
poderá englobar os recursos de Java e a tecnologia JDBC.

Conclusão

O  desenvolvimento  de  produtos  relacionados  a  Java  está  em  amplo  crescimento,  e  se  continuar  neste  ritmo,  deverá  em  poucos  anos, 
chegar  aos  índices  atuais  de  linguagens  como  Delphi  e  Visual  Basic.  Os  mais  otimistas  afirmam  que  Java  poderá  superar  o  Windows 
como a plataforma de software com maior base instalada no mundo até a virada do século, ou seja, haverá mais software desenvolvido 
para ser  usado  em  uma  máquina  virtual  Java e conseqüentemente  para todas  as plataformas,  do que  para  outra  plataforma  específica, 
seja ela Windows ou qualquer outra. Java deixou de ser uma ferramenta utilizada apenas para construir páginas bonitas na Web. Está se 
estabelecendo  como  uma  linguagem  de  programação  séria,  à  altura  das  aplicações  empresariais  mais  sofisticadas.  Porém,  antes  de 

file://\\76.12.86.138\Drawloop Data\Site Data\Output\darlanpenedo@bol.com.br_utilizacao.htm.html
decidir pela utilização de Java, deve-se deixar de lado as desavenças entre as grandes empresas possuidoras de tecnologias alternativas, 
e as preferências pessoais. Deve-se sim, avaliar a real contribuição da tecnologia Java para a informática no aumento da produtividade e 
competitividade.  Chegou-se a conclusão que  Java é uma poderosa linguagem de programação,  parecida com  C++ mas  com vantagens 
significativas, altamente portável  e reutilizável. Porém existem  outros pontos importantes a serem analisados  antes de adotar essa nova 
tecnologia. 

O  pacote  JDK  precisa  incorporar  um  gerador  de  GUI  que  permita  ao  programador  desenhar  a  tela  e,  em  seguida,  gerar  o  código  para 
implementá-la.  Pois  codificar  toda  uma  janela  gráfica  com  a  AWT  sem  a  ajuda  de  uma  ferramenta,  é  algo  extremamente  cansativo  e 
demorado.  É  claro,  que  se  for  utilizado  algum  dos  diversos  ambientes  de  programação  Java  disponíveis  no  mercado,  esta  dificuldade 
ficará  mais  amena.  Outras  questões  importantes  relacionadas  a  interfaces  gráficas e  que  são  fonte  de  críticas  dos  maiores  inimigos  da 
linguagem,  são  as  limitações  de  funcionalidade  quando  applets ou  aplicativos  stand-alone  escritos  em  Java  são  portados  de  uma 
plataforma para outra: suporte à somente quatro tipos diferentes de fontes; ausência de recursos ligados ao botão direito de mouse; falta 
de  suporte  a  recursos  multimídia  e  rigidez  no  layout  de  interface  gráfica.  Outro  recurso  da  AWT  necessário  mas  que  está  um  pouco 
esquecido, é a impressão.

No que se refere ao acesso aos bancos de dados relacionais, o pacote JDBC é muito prático e de fácil aprendizado. A conexão é feita de 
forma simples, e com poucos métodos é possível executar todos os comandos SQL ANSI 92 passando-os como parâmetros, desde que o 
driver utilizado para a conexão implemente o método utilizado. A única dificuldade se encontra no objeto ResultSet que permite apenas a 
leitura sequêncial dos registros oriundos de um SELECT. O método next somente posiciona um registro à frente. Não há um método que 
retorne ao registro anterior. Outro aspecto que se apresenta pouco  produtivo, é a apresentação de informações de tabelas do banco de 
dados.  Na  recuperação  através  do  SELECT  não  houve  problemas.  O  que  prejudica  a  produtividade  é  que  o  desenvolvedor  não  possui 
componentes para colocar na janela, informando apenas o que quer consultar, deixando a apresentação de forma automática. É preciso 
mover as tuplas para algum componente para em seguida adicionar a uma janela. A velocidade de execução de um programa interpretado 
está bem abaixo do que programas compilados em C ou C++. Quando a performance é importante, não há como negar que o byte code 
Java interpretado é lento. Porém, há várias linguagens que se tornaram populares porque possuem apenas a velocidade suficiente para 
determinada  tarefa.  Até  certo  ponto,  esse  problema  se  solucionará  à  medida  que  os  computadores  e  conexões  ficarem  mais  velozes. 
Outra solução que já está sendo utilizada, são os compiladores just-in-time (JIT), que convertem o bytecode em código nativo em tempo 
real, mantendo na memória cache o código convertido enquanto o programa estiver rodando. 

É importante salientar que os aspectos acima analisados, são técnicos, sujeitos a avanços tecnológicos. A JavaSoft, empresa responsável 
pelos  progressos  do  Java,  já  está  preparando  novas  versões  do  JDK  que  vão  preencher  as  lacunas  deixadas  nas  versões  anteriores. 
Espera-se  que  a  compatibilidade  com  todo  o  código  já  escrito  seja  mantida,  assegurando  a  continuidade  da  linguagem.  Várias  outras 
empresas  estão  desenvolvendo  ferramentas  que  proporcionarão  o  mais  importante  no  desenvolvimento  de  software  atualmente: 
produtividade e software integrado à Internet.

Bibliografia

[ 1] BOBROWSKI,  Steven  M.  Dominando  o 


Oracle  7  &  Cliente/Servidor.  São  Paulo: 
Makron Books, 1995.
[ 2] BOCHENSKI,  Bárbara.  Implementando 
Sistemas  Cliente/Servidor  de  Qualidade.
São Paulo: Editora Makron Books, 1995.
[ 3] BRIAN,  Jepson.  Programando  Banco  de 
Dados em Java. São Paulo: Editora Makron 
Books, 1997.
[ 4] CERÍCOLA,  Vicent  Oswald.  Oracle  Banco 
de  Dados  Relacional  e  Distribuído: 
Ferramentas  para  Desenvolvimento.  São 
Paulo: 
[ 5] CORNELL,  Gary  &  HORSTMANN,  Cay  S. 
Core  Java.  São  Paulo:  Editora  Makron 
Books, 1998.
[ 6] LINDEN,  Peter  van  der.  Just  Java.  São 
Paulo: Editora Makron Books, 1998.
[ 7] Manuais  do  JDK  1.0.2.  Sun  Microsystems, 
1997.
[ 8] SIGNORE.  Robert;  Creamer,  John; 
Stegman,  Michael  O.  The  ODBC  Solution.
Editora McGraw-Hill, 1994.

file://\\76.12.86.138\Drawloop Data\Site Data\Output\darlanpenedo@bol.com.br_utilizacao.htm.html
Voltar
  

file://\\76.12.86.138\Drawloop Data\Site Data\Output\darlanpenedo@bol.com.br_utilizacao.htm.html

Вам также может понравиться