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

Artigo Java Magazine 41 - JDBC de Ponta a Ponta: Parte 1

JDBC Ponta a Ponta


Parte 1:De conceitos essenciais a configuraes e consultas Aprenda os fundamentos de uma APIs mais importante do Java A tecnologia de bancos de dados relacionais talvez a mais importante em todos os tempos para os Sistemas de Informao. Os bancos de dados mais populares do mercado, desde bancos leves como o HSQLDB, passando pelos livres convencionais como MySQL at os pesos-pesados como Oracle so, com poucas excees, banco de dados relacionais.Desde os primrdios do Java, a importncia dos bancos de dados foi reconhecida,e a verso 1.1 do JDK j trazia como componente padro a API JDBC. Por meio do JDBC,uma aplicao Java pode se conectar a qualquer banco relacional,submeter comandos SQL para execuo e recuperar os resultados gerados pela execuo desses comandos.alm disso,o JDBC permite acesso aos metadados do banco de dados (tambm conhecido como catalogo) permitindo a construo de ferramentas para administrao do prprio banco e apoiando o desenvolvimento de sistemas. Embora verses posteriores do Java tenham trazido alguns novos recursos ao JDBC (veja o quadroVerses da API JDBC),os recursos presentes j nas primeiras verses da API atendem plenamente s necessidades da maioria das aplicaes,mesmo quando h demandas fortes de performance e de suporte a recursos avanados como dados multimdia.O melhor de tudo que a compatibilidade retroativa foi preservado - ao contrrio de APIs como Swing e colees, que mudaram bastante do Java 1.1 para o Java 2.Ento aplicaes Java baseadas nas primeiras verses do JDBC no necessitam de modificaes para adaptao a verses mais recentes da JVM ou do JDK. Mesmo o desenvolvedor que utiliza mecanismo de persistncia objeto-relacional como Hibernate e EJB 3,ou que a prefere frameworks relacionais como iBatis ou Spring JDBC (veja links) necessita de um conhecimento abrangente da API JDBC e de conceitos de bancos de dados relacionais em geral.Afinal, todos esses frameworks e bibliotecas usam o JDBC como base para comunicao com banco de dados. Esta srie sobre JDBC atende a dois pblicos distintos.Para os iniciantes,que nunca tiveram contato com o JDBC,esta primeira parte apresenta os fundamentos da API.J para os desenvolvedores com alguma experincia prvia com JDBC,a segunda parte,na prxima edio,apresenta recursos que fazem a diferena entre uma aplicao de brinquedo e uma aplicao profissional como transaes,o uso

de PreparedStatements,e dicas de segurana. Os exemplos sero todos executados sobre o HSQLDB, para que no seja necessrio instalar e administrar um banco mais sofisticado.Mas funcionam sem alteraes em qualquer outro banco de dados foram testados MySQL,PostgreSQL,FireBird e Oracle.Como no haveria espao suficiente para apresentar os procedimentos para inicializao de todas esses bancos,nesta parte focamos no HSSQLDB, e na segunda mostraremos como executar os exemplos (das duas partes) no MySQL e PostgreSQL,os dois bancos de dados livres mais populares. Drivers JDBC Para acessar um banco relacional, uma aplicao Java necessita,alm da prpria mquina virtual, de um driver JDBC.Este driver em geral fornecido junto com o banco de dados ou com um download separados pelo prprio fornecedor do banco,sem custo adicional. Se voc vem de outros ambientes, como VB e o Delphi, vai se surpreender ao descobrir que o JDBC no necessita de nenhuma configurao prvia, nem que seja instalado um cliente nativo do banco de dados para funcionar. Drivers JDBC so na grande maioria simples biblioteca Java arquivo JAR que podem ser copiados para qualquer sistema operacional. No h necessidade de editar arquivos de configurao nem de executar algum painel de controle administrativo. Drivers JDBC escritos inteiramente em Java so conhecidos como drivers Tipo 4 (Type 4). Existem no mercado alguns drivers que utilizam cdigos nativo (via JNI) para aproveitar cdigo dos clientes nativos proprietrios do banco de dados. Mas eles em geral tm performance inferior, e so mais pesados e menos estveis do que os escritos inteiramente em Java para o mesmo banco. Drivers que usam cdigos nativos tm o overhead de traduzir objetos Java para estruturas de dados e tipos nativos do sistema operacional. J drivers puro-Java pode usufruir dos recursos avanados de conectividade de rede, gerncia de memria e segurana embutidas no Java. A Figura 1 compara um driver JDBC escrito inteiramente em Java com drivers que usam cdigos nativo. A mesma figura compara drivers JDBC com mecanismo nativo de acesso a bancos de dados, tomando como referencia o popular ODBC do Windows. utilizado como exemplo o driver JDBC do Oracle.A figura ficaria praticamente igual se em vez de ODBC fosse utilizado o dbExpress do Delphi, o ADO.NET da Microsoft,ou tecnologia similares. Para compilar uma aplicao Java que acessa um banco de dados via JDBC,no necessrio ter nenhum drivers JDBC, no necessrio ter nenhum driver JDBC instalado nem configurao no seu IDE.Mas para executar a aplicao,as classes do driver devem estar no classpath.Isto significa que uma mesma aplicao pode ser executada utilizando qualquer banco de dados que deseje, contanto que a aplicao seja escrita usando apenas comando SQL padronizados,ou ento encapsulando com cuidado comandos que utilizam sintaxes proprietrias de cada banco.

Figura 1.Drivers JDBC Tipo 4 versus drivers ODBC do (os drivers JDBC OCI e Thin so ambos fornecidos pela Oracle,no mesmo pacote O banco de dados de exemplo Como indicado na introduo, os exemplos os exemplos deste artigo utilizam o HQSLDB,um banco de dados livre escrito inteiramente em Java,mas foram testados e funcionam com vrios bancos.No entraremos em muitos detalhes sobre HQSLDB,pois ele j foi descoberto extensamente em edies anteriores da Java Magazine.Apresentaremos aqui apenas o suficiente para criar o banco de dados de exemplo e executar as aplicaes criadas neste artigo. Baixe o arquivo hqsldb_1_8_0_7.zip de hqsldb.sf.net e descompacte em uma pasta qualquer,por exemplo c:\java ou /home/usurio no Linux.O resultado ser a criao de um diretrio chamado hqsldb,contendo a documentao,classes Java e fontes HQSLDB existe o arquivohsqldb.jar que contm tanto o driver JDBC quanto o prprio servidor do banco de dados.Este um caso raro:em geral o driver JDBC fornecido em um pacote JAR parte,mas o uso embarcado do HQSLDB justifica este empacotamento atpico. O HQSLDB pode ser executado como um servidor de rede, aceitando conexes TCP/IP da mesma forma que o MySQL ou Oracle, ou ento no chamado modo standalone,onde o banco de dados fica embutido dentro da aplicao Java e acessa diretamente os arquivos de dados.Para a aplicao,os dois modos so indiferente.A aplicao apenas indica ou o caminho para um arquivo local,ou a URL para um servidor remoto. Vamos ento configurar o classpath do sistema operacional para incluir o driver do HSQLDB.Usurios Windows podem digitar o comando a seguir em um prompt de comandod do MS-DOS: setCLASSPATH=%CLASSPATH%;c:\java\hsqldb\lib\hsqldb.jar Utilize este mesmo prompt de comando para executar os exemplos deste artigo. Caso a janela seja fechada, a configurao do classpath ser perdida. Usurios Linux podem usar o comando: exportCLASSPATH= $CLASSPATH:/home/lozano/hsqldb/lib/hsqldb.jar E, da mesma forma que no Windows, tambm devem ser executados os exemplos no mesmo shell onde foi configurado o classpath.Em ambos os casos,altere o diretrio de instalao do HSQLDB conforme sua preferncia. O arquivo hsqldb.jar contm ainda um pequeno aplicativo de administrao do banco de dados chamdo DataBase Manager.Todos os bancos de dados fornece uma interface similar para execuo de comandos SQL.Um detalhe que a fornecida pelo HSQLDB escrita em Java e pode ser usada com outros bancos. A Listagem 1 apresenta a seqncia de comando SQL que cria o banco de dados

de exemplo e insere alguns dados de teste.Nosso banco de dados contm um resumo de informaes sobre vendas de produtos de uma rede de lojas varejistas. Para executar os comando da Listagem 1,inicie o DataBase Manager do HSQLDB utilizando o comando a seguir: java.org.hsqldb.util.DataBaseManagerSwing O DataBase Manager ir pedir informaes para a conexo ao banco de dados.Informe como tipo HSQLDB Standlone,URL de conexo jdbc:hsqldb:file:vendas:shutdown=true,usurio as e senha em branco.Como o banco de dados ainda no existe,ele ser automaticamente pelo HSQLDB no caminho especificado que por omisso diretrio corrente. A Figura 2 apresenta a seqncia de telas do DataBase Manager,desde conexo (criao) do banco de dados ate a execuo dos comandos SQL do Script que criam as tabelas e inserem dados de teste.

Figura 2.Usando o DataBase Manager do HSQLDB para criar e inicializar o banco de dados de exemplo.Observe que os arquivos vendas.properties,vendas log e vendas Ick formam o banco de dados em si,enquanto que vendas.sql contm script SQL da Listagem 1. Muito cuidado na digitao do URL de conexo, pois qualquer erro far com que em vez do HSQLDB abrir um banco j existente,ele crie um novo banco.Por este motivo melhor especificar caminhos completos para os arquivos do banco de dados, em vez de usar caminhos relativos como foi feito por exemplo. Os comandos de criao das tabelas podem ser salvos em um arquivo texto, por exemplo, vendas.sql,e este arquivo pode ser aberto e executado pelo DataBase Manager.O script para o exemplo esta disponvel junto com fontes para download deste arquivo. Observe que, depois da execuo dos comandos SQL,a parte esquerda do DataBase Manager se altera,indicando a presena das tabelas recm-criadas.Feche o utilitrio e o abra novamente,para garantir que as tabelas e informaes no foram perdidas com a finalizao do banco de dados.Experimente ainda executar alguns comando SQL para consultar os dados de teste,por exemplo select*from vendas where regio=RJ.O resultado esperado apresentado na Figura 3.

Figura 3.Nova execuo do DataBase Manager,para verificar a correta inicializao do banco de dados. Listagem 1. Comandos SQL para inicializao do banco de dados de exemplo. create table produto ( id integer not null primary key, nome varchar (30) not null, preco decimal (14,2) not null, categoria varchar (20) not null ); insert into produto values ( 1. iPod Nano, 299.00, Eletro Eletrnicos ) ; insert into produto values ( 2. Endredon dupla face , 34.00, Cama e Banho) ; insert into produto values ( 3. Tv de Plasma, 7599.00, Eletro Eletrnico) ; insert into produto values ( 4. Travesseiro anti-alrgico , 49.00, Cama e Banho) ; create table vendas ( regiao char(2) not null , produto integer not null , qtde integer not null , foreign key (produto) references produto (id) ); insert into vendas values (RJ , 1, 322 ) ; insert into vendas values (SP , 1, 518 ) ; insert into vendas values (RJ , 2, 567 ) ; insert into vendas values (SP, 2, 987 ) ; insert into vendas values (RJ , 3, 45 ) ; insert into vendas values (SP , 3, 78 ) ; insert into vendas values (RJ , 4, 67 ) ; insert into vendas values (SP, 4, 75 ) ; Um programa JDBC mnimo A Listagem 2 apresenta um programa JDBC mnimo.Ele conecta ao banco de dados,reduz os preos de todos os produtos da categoria Eletro Eletrnico em 12%, e encerra a conexo.A reduo nos preos inteiramente realizada por um comando SQL update, sem qualquer ajuda de cdigos Java. Para compilar e executar esse programa esse programa, use o comando javac e java no mesmo prompt de comandos onde foi antes configurado o classpath para incluir o driver JDBC do HSQLDB (ou de qualquer outro banco de dados desejado).

$ javac ReduzPreco.java $ java ReduzPrecos 2 produtos tiveram seus preos reduzidos O sinal de $ representa o prompt de comando do sistema operacional e no deve ser digitado. Caso apenas o comando funcione mais no o segundo, ou voc no configurou classpath corretamente ou o banco de dados no foi inicializado de forma correta. Para que confirma que o programa reiniciou o preo dos produtos e eletroeletrnicos, e no os produtos de outras categorias, execute o Database Manager e consulte todos os registros na tabela de produtos, conforme exemplificado pela Figura 4.

Figura 4. Situao do banco de dados de exemplo aps a execuo do programa ReduzPreco.java Sempre encerre o Database Manager do HSQLDB antes de executar qualquer dos programas Java deste artigo, pois no modo stand-alone apenas uma aplicao pode acessar os arquivos do banco de dados.No modo servidor do HSQLDB, esta restrio eliminada,mas no queremos distrair o leitor com configuraes de rede e firewall. Vamos agora seguir programa mnimo, linha a linha, para entender o seu funcionamento: 1. A chamada a Class.forName() garente que o driver JDBC do banco de dados esteja carregado na memria do JVM.H varias outras formas de se fazer isso,mas esta a mais simples. 2. A chamada a DriverManager.getConnection() cria uma conexo (interface Connection) ao banco de dados indicado pela string passada como primeiro argumento.O login e senha para acesso ao banco de dados so passados no segundo e terceiro argumentos do mtodo. 3. O objeto Connection retornado pelo DriverManager utilizado para se criar um comando SQL (objeto do tipo Statement) pela chamada a createStatement(). 4. O objeto Statement ento utilizado para enviar ao banco de dados o comando SQL update que modifica os preos chamando o mtodo executeUpdate() 5. O comando SQL e a conexo ao banco de dados so encerrados pela chamada aos respectivos mtodos close(). Todo programa JDBC segue a mesma seqncia geral de passos: (1) Conexo (2) Execuo de comando SQL e (3) Encerramento. Um mesmo objeto de conexo (Connection) pode ser utilizado para executar vrios comandos. Na verdade, um mesmo objetos de comando (Statement) pode ser utilizado para executar vrios comandos SQL,sendo que a execuo de um novo comando descarta os resultados gerados pela execuo do comando anterior. A forma de conexo ao banco de dados apresentada neste exemplo,

utilizando Class.forName() e DriverManager.getConnection(), adequada para aplicao Java SE,isto , desktop ou em modo texto.Mas no ser a mais eficiente para aplicaes Java EE. Em servlets,pginas JSP EJBs devem utilizados objetos DataSource,configurados dentro do prprio servidor de aplicaes ou container web.Veja as referencias ao final do artigo para mais informaes. A classe DriverManager,alm das interfaces Connection e Statement, so partes da API JDBC. Elas e todas as outras classes e interfaces do JDBC que sero vistas nesse artigo esto dentro do pacote java.sql. Listagem 2: ReduzPrecos.java,programa JDBC mnimo que modifica os preos de vrios produtos no banco de dados exemplo. import java.sql.*; public class ReduzPrecos { public static void main(String[] args) throws Exception { Class.forName(org.hsqldb.jdbcDriver) Connection conexao = DriverManager.getConnection( jdbc:hsqldb:file:vendas;shutdown=true, sa , ) ; Statement commando = conexao .createStatement () ; int registrosAfetados = comando.executeUpdate ( update produto set preco = preco (preco * 0.12) + where categoria = Eletro Eletrnicos ) ; System.out.println(registrosAfetados + produtos tiveram seus preos reduzidos , ) ; comando.close ; conexo.close ; } } Configurando a aplicao para mudar de banco Nosso primeiro exemplo de cdigo Java no na verdade independente do banco de dados, porque ele fixa no cdigo a URL de conexo e o usurio e senha. Desse modo, adaptar a aplicao para outro banco de dados, ou simplesmente modificar o diretrio dos arquivos do banco de dados, exigiria a modificao do cdigo-fonte da aplicao e a sua recompilao. bem melhor deixar estes parmetros de conexo ao banco como informaes de configurao da aplicao. A forma padro de se fazer isto em Java por meio de arquivos e propriedades (arquivos de texto simples contendo linhas no formato nome=valor).Estes arquivos so carregados com recursos da JVM.A vantagem de se tratar arquivos de propriedades como recurso que a aplicao pode ser instalada em qualquer local do disco rgido, pois os recursos so localizados no classpth. A Listagem 3 apresenta um segundo evento de aplicao Java, que desse vez se limita a inserir o novo registro de venda no banco de dados de exemplo.O trabalho do banco realizado pelo comando SQL insert.Mas o que nos interessa agora a forma como utilizada a classe Properties para obter os parmetros para conexo ao banco de dados.(Note que esta classe no faz parte da API JDBC,mas sim um pacote java.util). Note que o arquivo banco.properties deve estar no mesmo diretrio que os arquivos.class do exemplo deste arquivo.Se voc estiver usando o JDK e a linha de comando para compilar e executar os exemplos,isto sera natural.J se voc estiver usando um IDE, a maioria deles ira copiar automaticamente qualquer arquivo noJava nos diretrios de fonte para o diretrio de classe (ou binrios). Um objeto Properties pode ser inicializado a partir de um InputStream qualquer,isto , de um arquivo texto,conexo de rede, arquivo zip ou qualquer outro tipo de stream suportado pela API java.io.No exemplo, foi utilizado a prpria classe que representa o programa (InsereProduto.class)para criar um stream que acessa o contedo do arquivo banco.properties,localizado no classpath da JVM,

pela chamada ao mtodo getResourceAsStream . Outra forma de ser obter uma referencia prpria classe para a carga de recursos usando this.get.Class(). Com o objeto de propriedades inicializado na varivel parametrosConexao, sucessivas chamadas a getPropertie () retornam os parmetros. Que so armazenadas em variveis e depois passadas para a chamada a getConnection).Dai em diante,o exemplo igual ao programa anterior,exceto por executar um comando SQL diferente. Alguns desenvolvedores colocam tambm os comandos SQL nos arquivos de propriedades, para facilitar o porte ou otimizao da aplicao para diferentes banco de dado. Novamente, para verificar os efeitos do programa de exemplo sobre banco de dados, ser necessrio iniciar o Database Manager do HSQLDB e executar um comando SQL select.Afinal ainda no vimos como executar consultas SQL via JDBC.Esse o assunto do prximo tpico. Listagem 3. InsereProduto.java:programa que utiliza JDBC para inserir novos dados de vendas de um produto(foram destacadas as linhas que utilizam um arquivo de propriedades para obter os parmetros de conexo). import java.sql. *; import java.util. *; public class InsereProduto { public static void main(String[] args ) throws Exception { Properties parametrosConexao = new Properties ; parametrosConexao.laod(InsereProduto.class.getResourceAsStream( banco.properties)); String driver = parametrosConexao.getProperty (driver); String url = parametrosConexao.getProperty (url) String login = parametrosConexao.getProperty (login) String senha = parametrosConexao.getProperty (senha) Class.forName(driver); Connection conexao = DriverManager.getConection( url, login, senha ) ; Statement commando = conexao.createStatement ; int resgistrosAfetados = comando.executeUpdate ( insert into produto (id, nome, preco, categoria) values ( + 5, DVD Playerportatil ,799.00, Eletro Eletrnicos )) ; System.out.println(registrosAfetados + produto inserido com sucesso, ) ; comando.close (); conexo.close(); } } Executando consultas SQL A interface Statement do JDBC permite executar um comando SQL qualquer, desde comandos de DDL,como create table,at os comandos de DML,como insert e select. Comandos SQL que retornam dados devem ser executados por meio do mtodo executeQuery(), e os que modificam dados (ou que no retornam dados )devem ser executados via executeUpdate(),como fizemos nos exemplos anteriores. O mtodo executeQuery , retorna um objeto de resultados (interface ResultSet),que permite ler, linha a linha , os resultados da consulta. Assim com o a conexo (connection) e o comando (Statement), o objeto de resultado deve ser fechado pelo mtodo close () quando no estiver mais em uso. Objetos Connection,Statement e ResultSet (alm de sua interfaces especializadas,como PreparedStatement, que ser apresentada na segunda

parte) devem ser fechados o mais cedo possvel, pois esses objetos representam recursos do sistema operacional e do banco de dados. um erro comum supor que o Java, por meio da coleta de lixo ou de mtodos destrutores,ir fazer automaticamente esta limpeza, o que no verdade. Alm disso , quanto mais tempo ele os recursos mais forem mantidos abertos na aplicao, maior ser o peso dela para a rede e para usurio. A Listagem 4 apresenta um programa Java que lista o valor total de vendas de cada produto individualmente,seguido pelo total de todos os produtos somados. Este exemplo exige Java SE 5,0 ou mais recente, pois usa o novo mtodo de formatao(printf ),para gerar uma sada textual alinhada em colunas. Foi usada tambm a interface java.text.numberFormat, para a formatao dos valores monetrio (esta interface existe em verses mais antigas do Java). Observe ainda que os valores monetrios foram armazenados em um BigDecimal (pacote java.math)em vez de em um double. Valores monetrios no devem ser armazenados nem manipulados como doubles seus tipos assemelhados (como float e Double). Para mais informaes, veja o quadro Tipos de dados Java X Tipos de dados SQL. O mtodo next de ResultSet utilizado para acessar a prxima linha do resultado. Note que este mtodo deve ser chamado antes que se possa acessar a primeira linha. Desde forma uma consulta que retorna um resultado vazio pode ser tratada da mesma forma que uma que retorna dados. A interface ResultSet fornece ainda mtodos como getInteger , getString ou getDate para a recuperao dos valores armazenados nas colunas/campos de cada linha do resultado. O JDBC ir converter automaticamente os tipos de dados do SQL para o Java e vice-versa, incluindo converses como de tipos numricas para tipos de texto. A coluna desejada pode ser indicada tanto pela sua posio numrica no resultado, iniciando pela posio 1 (e no a zero) quanto pelo nome da coluna. Em alguns bancos de dados, por exemplo, no MySQL, ser prefervel usar a posio em vez do nome da coluna. Assim haver um pequeno ganho de performance. Listagem 4.Totais Vendidos.java,exemplo que gera um relatrio de totais de vendas por produto.Foram destacadas as linhas que recuperam o resultado da consulta SQL. import java.sql. *; import java.util.*; import java.math.*; import java.text.*; public class TotaisVendidos { public static void main(String[] args ) throws Exception { Properties parametrosConexao = new Properties ; parametrosConexao.load(TotaisVendidos.class.getResourceAsStream( banco.properties)); //... conexo igual InsereProduto.java Statement commando = conexao.createStatement ; ResultSet resultado = commando.executeQuery ( selecione nome, sum(preco * qtde) as total + from produto, vendas + where produto.id = vendas.produto + group by nome ) ; NumberFormat nf = new Decimal Format (##,##,#0.00) ; int registrosLidos = 0 ; BigDecimal totalGeral = new BigDecimal (0); while ( resultado.next ){ String nome = resultado.getString (1) ;

BigDecimal total = resultados.getBigDecimal (2) ; // As duas linhas seguintes so equivalentes s duas anteriores // String nome = resultado.getString (nome) ; System.out.printf (%-30s:\t%15s\n, nome, nf.format (total)) ; totalGeral = totalGeral.add(total) ; registrosLidos++; } System.out.println (\nTotal geral: + registrosLidos + produtos, + R$ + nf.format(totalGeral) ) ; resultado.close ; comando.Close ; conexao.close ; } } Verses da API JDBC Aqui apresentado um resumo das novas funcionalidades introduzidas a cada verso da API JDBC JDBC 1.0 Verso original da API,embutida no Java 1.1,j trazia todas as classes apresentadas neste cargo. JDBC 2.0/Java 2.0 Interface DataSource,para conexes gerenciadas por container Java EE; Suporte a transaes distribudas; Interface RowSet,que permite fazer o cach do resultado de consultas no cliente JDBC 2.1/Java 1.2 Atualizaes em batch, permitindo uma forma independente do banco de enviar vrios comandos SQL de uma s vez; Suporte a resultados rolveis (scrollable) e atualizveis, que permitem a navegao livre por um ResultSet; Atualizao direta do registro corrente em resultados (ResultSet),sem necessidade de enviar comandos SQL update; Mapeamento de tipos definidos pelo usurio. JDBC 3.0/Java 1.4 Save points, que permitem o rollback parcial de uma transao; Parmetros nomeados em procedimentos armazenados; Forma padronizada de ser recuperar o valor das colunas geradas automaticamente pelo banco, por exemplo colunas identity e autoincrement. JDBC 4.0 (proposed final draft) Suporte ao tipo rowid, que identifica fisicamente registro em alguns bancos, como o Oracle; Manipulao de dados XML no banco e suporte a extenses do SQL para dados XML; Maior controle sobre pools de conexes e comandos; Novas excees, de modo que no mais necessrio lidar com o sqlCode nas situaes mais comuns; Novas interfaces Query e DataSet, que apoiadas por anotaes,permitem mapear diretamente operaes sobre o banco de para mtodo e atributos de classes Java. Tipos de dados Java X SQL Seja nos valores lidos de um resultado (ResultSet), ou nos parmetros fornecidos a um PrepareStatement, o programador Java deve se preocupar sempre em usar o tipo certo de dados corretos, ou mais prximo do tipo de dados SQL que foi definida para cada coluna no banco de dados. Na maioria dos casos, a correspondncia intuitiva,como number ou int32 do SQL para int(ou integer) do Java; ou char e varchar do SQL para String do Java.Mas h dois casos especiais aos quais o programador deve estar atento:

Tipos numricos O tipo SQL decimal um numero fracionrio com representao exata. Isto bem diferente de um float ou double do Java, que so nmeros em pontoflutuante. Em particular a aritmtica com decimal no gera erros de arredondamento. O tipo Java correto java.math.BigDecimal. Fazer aritmtica com BigDecimal um tanto trabalhoso, pois exige chamar mtodos como add () e multipy em vez de usar os operadores +e*.Masse for feita a conversao de BigDecimal para double, de modo a simplificar o cdigo, sero introduzidos erros de arredondamento. Em um sistema financeiro, isto pode levar a situao onde o fluxo de caixa de caixa no zera, pois centavos so perdidos de modo aparentemente aleatrio e essas perdas podem se somar e gerar discrepncias significativas. Tipos de Data/Hora Os tipos data e time do SQL so diferentes dos tipos java.util.Date ou java.util.Calendar do Java.Ambos seriam equivalentes ao tipo timestamp do SQL,pois trs armazenam tanto uma data quanto uma hora. Parater um tipo que armazene apenas data ou apenas hora, use java.sqlDate e java.sql.Time, respectivamente. Concluso Nesta parte comeamos a apresentar os fundamentos da API JDBC, uma das mais importantes para aplicaes tanto Java SE como Java EE. Na prxima parte sero vistos tpicos importantes para a produo de aplicao em qualquer das edies do Java, tais como tratamento de erros,transaes e comandos preparados (PreparedStatements), alm de funcionalidades para obteno e utilizao de metade dos do banco. Para saber mais MySQL para programadores Java Fernando Lozano.Edio 40 Fundamentos da administrao. O novo HSQLDB Fernando Lozano. Edio 30 Apresenta em detalhes o HSQLDB, banco de dados livre 100% Java para uso embarcado. Persistncia Turbinada II Osvaldo Doederlein.Edio 26 Recursos avanados do JDBC Persistncia Turbinada I Osvaldo Doederlein.Edio 25 Como usar o JDBC de modo eficiente para criar classes DAO. JDBC 3 Maiko Rocha. Edio 07 Apresenta os novos recursos do JDBC 3. LINKS: jcp.org/em/jsr/detail?od=221 Especificao JDBC 4.0,em estgios finais de aprovao. jcp.org/em/jsr/detail?id=54 Especificao JDBC 3.0, em vigor desde JDK 1.4 java.sun.com/javase/tecnologies/database.jsp Pagina da Sun sobre JDBC java.sun.com/docs/books/tutorial/jdbc/ Trilha sobre JDBC do Java Tutorial hsqldb.org Site Oficial do HSQLDB mysql.com Site oficial do MySQL e do seu driver JDBC postegresql.org Site oficial do PostgreSQL

jdbc.postgresql.org Site oficial do driver JDBC do PostgreSQL

ltima atualizao: quarta, 15 setembro 2010, 00:31

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