Java and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. in the U.S.
and other countries.
Interface Grfica e Banco de Dados em Java Acesso a bancos de dados com JDBC Agosto 2! Interface "r#fica e $anco de %ados em Java 2 Licena para uso e distribuio &ste material est# dis'on(vel 'ara uso n)o- comercial e 'ode ser derivado e*ou distribu(do, desde +ue utili,ando uma licen-a e+uivalente. Atribui-)o-Uso .)o-/omercial- /om'artilhamento 'ela mesma licen-a, vers)o 2.0 htt'1**creativecommons.org*licenses*by-nc-sa*2.0*deed.'t 2oc3 'ode co'iar, distribuir, e4ibir e e4ecutar a obra, al5m de criar obras derivadas, sob as seguintes condi-6es1 7a8 voc3 deve dar cr5dito ao autor original, da forma es'ecificada 'elo autor ou licenciante9 7b8 voc3 n)o 'ode utili,ar esta obra com finalidades comerciais9 7c8 Se voc3 alterar, transformar, ou criar outra obra com base nesta, voc3 somente 'oder# distribuir a obra resultante sob uma licen-a id3ntica a esta. Agosto 2! Interface "r#fica e $anco de %ados em Java 3 Objetivos desta parte Introdu,ir conceitos b#sicos de 'ersist3ncia em bancos de dados relacionais 7$%:s89 A'resentar a linguagem S;< de forma a 'ermitir a mani'ula-)o sim'les de dados em $%:s9 &4'licar como conectar em $%:s e enviar comandos S;< em Java com a A=I J%$/9 A'resentar o 'adr)o de 'ro>eto %A? como uma forma organi,ada de 'ersist3ncia de ob>etos. Agosto 2! Interface "r#fica e $anco de %ados em Java 4 Armazenamento persistente A grande maioria das a'lica-6es 'recisa arma,enar informa-6es em m(dia 'ersistente9 =ersistente @ n)o se a'aga a'As terminado o 'rocesso +ue a criou9 Bi'os de arma,enamento1 Ar+uivos bin#rios 7seriali,a-)o89 Ar+uivos te4to 7e4.1 CM<89 $ancos de dados. Agosto 2! Interface "r#fica e $anco de %ados em Java 5 Banco de dados /ole-)o organi,ada de dados9 S"$% D Sistema "erenciador de $anco de %ados1 &m ingl3s, Database Management System 7%$MS89 SoftEare +ue gerencia o arma,enamento e recu'era-)o de dados em ar+uivos9 =rov3 uma linguagem 'ara mani'ula-)o dos dados9 Usu#rio n)o 'recisa saber como os dados s)o arma,enados em disco. Agosto 2! Interface "r#fica e $anco de %ados em Java 6 Paradimas de !GBDs S"$%s :elacionais 7S"$%:s81 $aseados em #lgebra relacional 7efic#cia matematicamente 'rovada89 Forte indGstria 'romovendo seu uso. S"$%s ?rientado a ?b>etos 7S"$%??s81 =aradigma com'at(vel com o desenvolvimento9 IndGstria em crescimento. S"$%s ?b>eto*:elacional 7S"$%?:s81 :elacional com e4tens6es ??. Agosto 2! Interface "r#fica e $anco de %ados em Java 7 "oco na tecno#oia re#aciona# &ste curso foca na tecnologia de bancos de dados relacionais9 ? acesso a S"$%?:s 5 feito de forma semelhante, adicionando algumas facilidades9 ? acesso a bancos ?? 5 muito mais sim'lificado, visto +ue o 'aradigma 5 o mesmo 7'ersist3ncia trans'arente89 =ersist3ncia trans'arente 'ode ser alcan-ada tamb5m com frameworks de ma'eamento ob>eto*relacional. Agosto 2! Interface "r#fica e $anco de %ados em Java 8 Abstrao de armazenamento &m S"$%:s, os dados s)o arma,enados em tabelas1 /ada tabela re'resenta uma classe de entidades do sistema9 /ada coluna da tabela re'resenta 'ro'riedades da+uela classe de entidades9 /ada linha da tabela re'resenta uma entidade 7ob>eto8 e4istente no sistema9 Uma ou mais colunas identificam univocamente cada linha da tabela 7s)o as chaves 'rim#rias89 :elacionamentos entre tabelas s)o 'oss(veis 'or trans'osi-)o de chaves. Agosto 2! Interface "r#fica e $anco de %ados em Java 9 $%emp#o de banco de dados Id Gravadora Artista Nome Preo Duplo? 1 1 1 Crash R$ 24,90 No 2 2 2 Construo R$ 42,90 No 3 1 1 Under the Table and Dreamin R$ 2!,90 No 4 3 3 "#si$a %ara &$am%amentos R$ 4',00 (im /%1 Nome 1 2 3 )"* Id (on+ "usi$ Uni,ersal "usi$ "ravadora1 Nome Banda? 1 (im 2 No 3 -eio Urbana (im Id Da,e "atthe.s /and Chi$o /uar0ue Artista1 Agosto 2! Interface "r#fica e $anco de %ados em Java 10 Linuaem de manipu#ao de dados Um S"$% 'rov3 tr3s linguagens 'ara mani'ula-)o de dados1 %%< 7Data Definition Language81 linguagem 'ara defini-)o dos dados D define a estrutura do banco9 %M< 7Data Manipulation Language81 linguagem de mani'ula-)o de dados D 'ermite inserir, atuali,ar, recu'erar e e4cluir dados do banco9 %/< 7Data Control Language81 linguagem de controle de dados D controla as'ectos de autori,a-)o. A grande maioria dos S"$%:s atuais utili,a a linguagem S;< 'ara tudo isso. Agosto 2! Interface "r#fica e $anco de %ados em Java 11 !&L ' Structured Query Language /riada 'ela I$M, 'adroni,ada 'ela A.SI em HIJ!, IS? em HIJK, revis6es em I2, II e 2L9 =ermite e4tens6es 'ro'riet#rias9 =rov3 comandos de %%<, %M< e %/< 'ara bancos de dados relacionais9 A'esar do nome ser M<inguagem &struturada de /onsultaN, 'ermite todo o ti'o de mani'ula-)o. Fortemente baseada em #lgebra relacional9 F#cil de escrever e entender 7'rinci'almente 'ara +uem fala ingl3s8. Agosto 2! Interface "r#fica e $anco de %ados em Java 12 !GBDs (ue usam !&L A'ache %erby9 /ach59 %$29 Ingres9 Inter$ase9 MyS;<9 ?racle9 =ostgreS;<9 Microsoft S;< Server9 S;<ite9 Sybase9 Informi49 Firebird9 OS;<%$9 =oint$ase. Fonte1 Piki'edia Agosto 2! Interface "r#fica e $anco de %ados em Java 13 !&L )*) 2eremos conceitos b#sicos de bancos de dados relacionais com S;<9 &4'erimentaremos a'enas o suficiente 'ara arma,enamento*recu'era-)o sim'les de dados9 Usaremos o banco de dados OS;<%$ 7EEE.hs+ldb.org81 $anco de dados totalmente feito em Java9 .)o 5 robusto, 'or5m 5 'e+ueno 7JA: de !2Q R$8, ideal 'ara a'lica-6es deskto'. Agosto 2! Interface "r#fica e $anco de %ados em Java 14 Iniciando o +!&LDB ? OS;<%$ 'ode funcionar em diversos modos1 Servidor 7'rotocolo de comunica-)o 'ro'riet#rio89 Servidor Web 7OBB=89 Servlet 7OBB=89 Standalone * In-Process 7acesso direto89 Somente memAria 7acesso direto8. =ara iniciar o OS;<1 Servidor1 java -cp hsqldb.jar org.hsqldb.Server Peb1 java -cp hsqldb.jar org.hsqldb.WebServer Standalone ou memAria1 basta usar o driver. Agosto 2! Interface "r#fica e $anco de %ados em Java 15 Ar(uivos de confiurao A configura-)o do OS;<%$ em modo servidor e Web 'ode ser 'assada como argumento ou em ar+uivos de configura-)o9 server.properties1 webserver.properties1 server.database.0=file:javadiscos server.dbname.0=javadiscos server.port=8090 server.database.0=file:javadiscos server.dbname.0=javadiscos Agosto 2! Interface "r#fica e $anco de %ados em Java 16 "erramenta de erenciamento ? OS;<%$ 'ossui uma ferramenta de gerenciamento bastante rudimentar9 =ara inici#-la1 java -cp hsqldb.jar org.hsqldb.til.!atabase"anager Agosto 2! Interface "r#fica e $anco de %ados em Java 17 ,onectando ao +!&LDB Servidor normal1 Bi'o1 #S$% !atabase &ngine Server9 U:<1 jdbc:hsqldb:hsql:''localhost'javadiscos. Servidor Web1 Bi'o1 #S$% !atabase &ngine Web Server9 U:<1 jdbc:hsqldb:http:''localhost:8090'javadiscos. Agosto 2! Interface "r#fica e $anco de %ados em Java 18 ,riao do banco de dados =ara criar as tabelas, utili,amos comandos de linguagem de defini-)o de dados da S;<9 ()&*+& !*+*,*S&9 ()&*+& +*,%&9 *%+&) +*,%&9 !)-. +*,%&. S mais f#cil se utili,armos uma ferramenta de 'ro>eto de banco de dados1 %$%esigner, &:Pin, "lom, =O=MyAdmin, ferramentas 'ro'riet#rias do 'rA'rio S"$%, etc. O# v#rias em Java1 htt'1**EEE.>ava-source.net*o'en-source*s+l-clients Agosto 2! Interface "r#fica e $anco de %ados em Java 19 -ode#aem das tabe#as Babelas re'resentam entidades do dom(nio9 &m sistemas ??, s)o as classes de negAcio1 /ada atributo 5 uma coluna da tabela9 %efine-se a chave-'rim#ria 7=R89 :elacionamentos s)o feitos 'or trans'osi-)o de =R. %efini-)o da chave-'rim#ria1 /on>unto de atributos +ue identificam um ob>eto univocamente 7/=F 'ara 'essoa, IS$. 'ara livro, ...89 /ria-)o de um atributo es'ec(fico 'ara a =R 7recomendado8. Agosto 2! Interface "r#fica e $anco de %ados em Java 20 !istema e%emp#o. Java Discos Usaremos uma lo>a de /%s como e4em'lo1 Agosto 2! Interface "r#fica e $anco de %ados em Java 21 O banco de dados da Java Discos Ma'eamento de classes 'ara tabelas1 Agosto 2! Interface "r#fica e $anco de %ados em Java 22 O banco de dados da Java Discos ()&*+& +*,%& /ravadora 0 id ,1/12+ 2-+ 23%% 1!&2+1+45 nome 6*)(#*)07008 2-+ 23%%5 .)1"*)4 9&40id8 8: ()&*+& +*,%& 6enda 0 id ,1/12+ 2-+ 23%% 1!&2+1+45 data6enda !*+&+1"& 23%%5 .)1"*)4 9&40id8 8: ()&*+& +*,%& *rtista 0 id ,1/12+ 2-+ 23%% 1!&2+1+45 nome 6*)(#*)07008 2-+ 23%%5 banda ,1+ 23%%5 pais 6*)(#*)0;08 2-+ 23%%5 .)1"*)4 9&40id8 8: Agosto 2! Interface "r#fica e $anco de %ados em Java 23 O banco de dados da Java Discos ()&*+& +*,%& (! 0 id ,1/12+ 2-+ 23%% 1!&2+1+45 id/ravadora ,1/12+5 id*rtista ,1/12+ 2-+ 23%%5 nome 6*)(#*)07008 2-+ 23%%5 fai<as %-2/6*)(#*) 23%%5 preco =%-*+ 2-+ 23%%5 foto ,12*)4 23%%5 dplo ,1+ 23%%5 .)1"*)4 9&40id85 =-)&1/2 9&40id*rtista8 )&=&)&2(&S *rtista0id8 -2 !&%&+& 2- *(+1-2 -2 3.!*+& 2- *(+1-2 8: Agosto 2! Interface "r#fica e $anco de %ados em Java 24 O banco de dados da Java Discos ()&*+& +*,%& 1tem6enda 0 id6enda ,1/12+ 2-+ 23%%5 id(! ,1/12+ 2-+ 23%%5 .)1"*)4 9&40id6enda5 id(!85 =-)&1/2 9&40id6enda8 )&=&)&2(&S 6enda0id8 -2 !&%&+& 2- *(+1-2 -2 3.!*+& 2- *(+1-25 =-)&1/2 9&40id(!8 )&=&)&2(&S (!0id8 -2 !&%&+& 2- *(+1-2 -2 3.!*+& 2- *(+1-2 8: Agosto 2! Interface "r#fica e $anco de %ados em Java 25 Insero de dados /omando S;< I.S&:B1 ?nde1 tabela @ nome da tabela na +ual ser)o inseridos os dados9 coluna @ nome de uma das colunas da tabela9 e4'ress)o @ valor a ser inserido na coluna es'ecificada. 12S&)+ 12+- tabela >0colna >5 ...?8? 6*%3&S 0e<press@o >5 ...?8: Obs.: SQL no case sensitive (no die!encia "ai#sc$%as de "in#sc$%as&. Agosto 2! Interface "r#fica e $anco de %ados em Java 26 $%press/es Formato de'ende do ti'o1 .Gmero inteiro1 0, 700, -;09 .Gmero real1 0.;, -A.9, B9.909 $ooleano1 7, +)3&, 0, =*%S&9 String1 C*bcC, CC, C(om CCaspasCC simplesC9 %ata1 CB00D-70-0EC, C7987-0D-7;C9 Oora1 C78:A9:00C, C0E:7;:7DC. Agosto 2! Interface "r#fica e $anco de %ados em Java 27 $%perimente. -- 1nsere as gravadoras SonF5 3niversal e &"1: 12S&)+ 12+- /ravadora 0nome8 6*%3&S 0CSonF "sicC8: 12S&)+ 12+- /ravadora 0nome8 6*%3&S 0C3niversalC8: 12S&)+ 12+- /ravadora 0nome8 6*%3&S 0C&"1C8: -- 1nsere !ave "atthews5 (hico ,arqe e %egi@o: 12S&)+ 12+- *rtista 0nome5 banda5 pais8 6*%3&S 0C!ave "atthews ,andC5 +)3&5 C&3*C8: 12S&)+ 12+- *rtista 0nome5 banda5 pais8 6*%3&S 0C(hico ,arqeC5 =*%S&5 C,rasilC8: 12S&)+ 12+- *rtista 0nome5 banda5 pais8 6*%3&S 0C%egi@o 3rbanaC5 +)3&5 C,rasilC8: -- 1nsere G(rashH5 da !",5 por )I B7.905 n@o dplo: 12S&)+ 12+- (! 0id/ravadora5 id*rtista5 nome5 preco5 dplo8 6*%3&S 005 05 C(rashC5 B7.905 =*%S&8: Agosto 2! Interface "r#fica e $anco de %ados em Java 28 0ecuperao de dados /omando S;< S&<&/B sim'les1 ?nde1 colunas @ nomes das colunas cu>os dados ser)o recu'erados, se'arados 'or v(rgulas9 tabela @ nome da tabela da +ual ser)o recu'erados os dados. S&%&(+ colnas =)-" tabela: 'ode"os $ti%i(a! * )a!a !e)!esenta! todas as co%$nas. Agosto 2! Interface "r#fica e $anco de %ados em Java 29 $%perimente. -- -btJm todos os dados de todas as gravadoras. S&%&(+ K =)-" /ravadora: -- -btJm o nome e o paLs de todos os artistas'bandas. S&%&(+ nome5 pais =)-" *rtista: -- -btJm o nome e o preMo de todos os (!s. S&%&(+ nome5 preco =)-" (!: :es'onda Ts 'erguntas1 ;ual 5 o cAdigo da gravadora Sony MusicU ;uais /%s foram gravados 'ela Sony MusicU ;uais /%s do /hico $uar+ue s)o vendidos 'ela Java %iscosU Agosto 2! Interface "r#fica e $anco de %ados em Java 30 ,rit1rios de se#eo /l#usula PO&:&1 ?nde1 condi-)o @ e4'ress)o lAgica 7resulta em verdadeiro ou falso8. S&%&(+ colnas =)-" tabela W#&)& condiM@o: Agosto 2! Interface "r#fica e $anco de %ados em Java 31 Operadores 2 constantes <Agicos1 2-+, -), *2!9 :elacionais1 =, N, N=, O, O=, NO, P=9 String1 %19& Cpadr@oC9 Uso de coringas1 Q ou R. ?utros1 1S 23%%, 1S 2-+ 23%%9 ,&+W&&2 < *2! F9 12 0<75 <B5 ...5 <n8. Agosto 2! Interface "r#fica e $anco de %ados em Java 32 $%perimente. -- /ravadora com chave-primSria = 0. S&%&(+ K =)-" /ravadora W#&)& id = 0: -- *rtistas cjo nome termina com a letra e. S&%&(+ K =)-" *rtista W#&)& nome %19& CQeC: -- (!s qe cstam entre )I B0500 e )I T0500. S&%&(+ K =)-" (! W#&)& preco ,&+W&&2 B0 *2! T0: :es'onda Ts 'erguntas1 ;uais os /%s de /hico $uar+ue e Marisa MonteU ;uais /%s custam menos de :V 20,U ;uais /%s foram feitos de forma inde'endente 7sem gravadora8U Agosto 2! Interface "r#fica e $anco de %ados em Java 33 Ordenao de resu#tados /l#usula ?:%&: $W1 ?nde1 colunas @ nomes das colunas usadas na ordena-)o e o crit5rio 7*S( @ ascendente, !&S( @ descendente8. S&%&(+ colnas =)-" tabela W#&)& condiM@o -)!&) ,4 colnas: Agosto 2! Interface "r#fica e $anco de %ados em Java 34 $%perimente. -- (!s em ordem crescente de nome. S&%&(+ K =)-" (! -)!&) ,4 nome *S(: -- (!s em ordem decrescente de nome. S&%&(+ K =)-" (! -)!&) ,4 nome !&S(: -- *rtistas em ordem crescente de paLs5 depois nome. S&%&(+ K =)-" *rtista -)!&) ,4 pais5 nome: Bente ordenar1 $andas em ordem crescente de nome, de'ois artistas em ordem crescente de nome9 /%s 'or 're-o 7ascendente e descendente8. Agosto 2! Interface "r#fica e $anco de %ados em Java 35 Juno de tabe#as %ados de entidades diferentes ficam em tabelas diferentes 'ara evitar redundXncia9 Muitas ve,es gostar(amos de recu'erar dados de diversas tabelas ao mesmo tem'o9 =recisamos fa,er >un-)o de tabelas, utili,ando as chaves-'rim#rias trans'ostas9 ;uando houver conflito dos nomes das colunas, devemos usar o nome +ualificado1 +abela.colna Agosto 2! Interface "r#fica e $anco de %ados em Java 36 Juno de tabe#as Jun-)o com PO&:&1 &4'erimente1 Bente >untar tamb5m a tabela "ravadora 'ara mostrar a gravadora dos /%s. S&%&(+ colnas =)-" +75 +B W#&)& +7.id = +B.id+7: -- 2ome5 preMo e artista dos (!. S&%&(+ (!.nome5 preco5 *rtista.nome =)-" (!5 *rtista W#&)& (!.id*rtista = *rtista.id: Agosto 2! Interface "r#fica e $anco de %ados em Java 37 Juno de tabe#as Jun-)o com I..&: J?I.1 &4'erimente1 Bente >untar tamb5m a tabela "ravadora 'ara mostrar a gravadora dos /%s. S&%&(+ colnas =)-" +7 122&) U-12 +B -2 +7.id = +B.id+7: -- 2ome5 preMo e artista dos (!. S&%&(+ (!.nome5 preco5 *rtista.nome =)-" (! 122&) U-12 *rtista -2 (!.id*rtista = *rtista.id: Agosto 2! Interface "r#fica e $anco de %ados em Java 38 0enomeando tabe#as e co#unas =ara sim'lificar nossas consultas, 'odemos criar aliases 'ara tabelas ou colunas1 -- 2ome5 preMo e artista dos (!. S&%&(+ (!.nome5 preco5 *.nome *S artista =)-" (! 122&) U-12 *rtista *S * -2 (!.id*rtista = *.id: -- .odemos omitir o G*SH. S&%&(+ (!.nome5 preco5 *.nome artista =)-" (! 122&) U-12 *rtista * -2 (!.id*rtista = *.id: Agosto 2! Interface "r#fica e $anco de %ados em Java 39 "un/es 3teis do +!&LDB *,S0nm81 valor absoluto9 *6/0colna81 m5dia dos valores9 S3"0colna81 soma dos valores9 (&1%12/0nm8, =%--)0nm81 teto e 'iso9 (-2(*+0str75 strB81 concatena-)o9 %&2/+#0str81 tamanho da string9 (3))&2+R!*+&1 data atual9 !*4-="-2+#0data81 dia do m3s9 %entre muitas outras... Agosto 2! Interface "r#fica e $anco de %ados em Java 40 Atua#izao de dados /omando S;< U=%AB&1 &4'erimente1 Bente dar HY de desconto em todos os /%s da %ave MattheEs $andZ 3.!*+& tabela S&+ col7 = e<pr75 colB = e<prB5 ... W#&)& condiM@o: -- *ltera o nome de C(! !emoC para C!emo (!C. 3.!*+& (! S&+ nome = C!emo (!C W#&)& id = A: Agosto 2! Interface "r#fica e $anco de %ados em Java 41 $%c#uso de dados /omando S;< %&<&B&1 &4'erimente1 Bente a'agar os /%s gravados 'ela Universal e &MI 7dica1 use o o'erador ?: ou I.8. !&%&+& =)-" tabela W#&)& condiM@o: -- *paga os (!s com preMos abai<o de )I B0500. !&%&+& =)-" (! W#&)& preco N B0.0: Agosto 2! Interface "r#fica e $anco de %ados em Java 42 0ecapitu#ando444 $ancos de dados relacionais s)o o 'adr)o do mercado9 A linguagem de defini-)o e mani'ula-)o de dados 'adr)o 5 a S;<9 A'rendemos os seguintes as'ectos da S;<1 /riar as tabelas9 Inserir e atuali,ar dados9 /onsultar dados 7com crit5rio, com ordena-)o89 &4cluir dados. =rosseguindo1 onde Java entra na histAriaU Agosto 2! Interface "r#fica e $anco de %ados em Java 43 Java Database ,onectivit5 J%$/ 5 a A=I 'adr)o da 'lataforma Java 'ara acesso a bases de dados9 "eralmente usada 'ara bancos de dados relacionais. ? J%R e a J:& da Sun im'lementam o b#sico, voltado 'ara a'lica-6es desktop1 =acote java.sql9 =acote java<.sql e sub'acotes. Agosto 2! Interface "r#fica e $anco de %ados em Java 44 Insta#ao =ara 'rogramar em Java com acesso a bancos de dados 5 'reciso1 Instalar o kit de desenvolvimento Java 7o'cionalmente, uma I%&89 Instalar o S"$% de sua 'refer3ncia9 ?bter o driver J%$/ do seu S"$%. Agosto 2! Interface "r#fica e $anco de %ados em Java 45 6so =ara consultas 7S&<&/B8, s)o 0 'assos1 H[8 ?btenha uma cone4)o a 'artir do driver9 2[8 /rie um statement a 'artir da cone4)o9 L[8 &nvie uma consulta S;< 'or meio do statement9 Q[8 Mani'ule o con>unto de resultados da consulta9 0[8 Feche o statement e a cone4)o. =ara outros comandos, 'ule o 'asso Q. Agosto 2! Interface "r#fica e $anco de %ados em Java 46 O driver JDB, /ada $% 'ossui um 'rotocolo diferente de comunica-)o1 A A=I J%$/ define somente as interfaces 'ara cone4)o com o banco9 ? driver do fornecedor im'lementa o acesso. Bi'os de driver1 Bi'o H1 'onte J%$/-?%$/ 7Microsoft89 Bi'o 21 drivers 'ara A=I nativa 7J.I89 Bi'o L1 clientes 'ara servidores de dados Java9 Bi'o Q1 cone4)o direta ao banco, im'lementada em Java 'uro. Agosto 2! Interface "r#fica e $anco de %ados em Java 47 Passo ). obtendo uma cone%o Usaremos a classe java.sql.!river"anager9 ?bteremos uma java.sql.(onnection9 =r5-re+uisitos1 S"$% instalado e funcionando9 $anco de dados criado9 Ber um login*senha com 'ermiss)o de acesso9 &star com o driver J%$/ no /<ASS=ABO9 Saber a U:< de cone4)o com o banco 7consulte a documenta-)o do driver8. Agosto 2! Interface "r#fica e $anco de %ados em Java 48 Passo ). obtendo uma cone%o (onnection conn = nll: '' 3)% de cone<@o com o banco de dados. String rl=Vjdbc:hsqldb:hsql:''localhost'javadiscosV: '' (arrega o driver do #S$%!, e conecta. (lass.for2ame0Vorg.hsqldb.jdbc!riverV8: conn = !river"anager.get(onnection0rl5 VsaV5 VV8: =rocedimento1 /arregar o driver1 (lass.for2ame0nome89 /onectar1 !river"anager.get(onnection0rl5 login5 senha8. Agosto 2! Interface "r#fica e $anco de %ados em Java 49 Passo 7. criao do statement ? statement 5 um ob>eto +ue 'ermite a e4ecu-)o de S;< no banco de dados9 =ara obt3-lo, usaremos o m5todo createStatement08 do ob>eto (onnection9 :etorna java.sql.Statement. '' (ria o statement. Statement stmt = conn.createStatement08: Agosto 2! Interface "r#fica e $anco de %ados em Java 50 Passo 8. e%ecuo da !&L A classe Statement 'ossui dois m5todos 'rinci'ais 'ara e4ecu-)o de comandos S;<1 e<ecte3pdate0sql81 retorna o nGmero de linhas afetadas 'elo comando9 e<ecte$erF0sql81 retorna os dados de uma consulta 7S;< S&<&/B8. '' "onta o comando S$%. String sql = V12S&)+ 12+- /ravadora 0nome8 6*%3&S 0CUava )ecordsC8:V: '' &<ecta o comando no banco de dados. stmt.e<ecte3pdate0sql8: Agosto 2! Interface "r#fica e $anco de %ados em Java 51 Passo 9. obtendo dados de consu#tas ? m5todo e<ecte$erF08 retorna um ob>eto +ue im'lementa java.sql.)esltSet9 ? result set 7con>unto de resultados8 funciona como um iterador 'elas linhas retornadas1 &le come-a A.B&S da 'rimeira linha9 ? m5todo ne<t08 movimenta 'ara a 'rA4ima linha ou retorna false se n)o h# mais linhas9 ?s m5todos getString08, get1nt08, get!ate08, get,oolean08, etc. retornam os dados9 Bais m5todos 'odem receber o nome da coluna ou seu (ndice 7come-ando 'or H8. Agosto 2! Interface "r#fica e $anco de %ados em Java 52 Passo 9. obtendo dados de consu#tas '' "onta a conslta S$%. String sql = VS&%&(+ (!.nome5 preco5 *.nome *S V W Vartista5 /.nome *S gravadora =)-" (! V W V122&) U-12 *rtista * -2 (!.id*rtista = *.id V W V122&) U-12 /ravadora / -2 (!.id/ravadora = /.id:V: '' &<ecta o comando no banco de dados. )esltSet rset = stmt.e<ecte$erF0sql8: '' 2avega pelos resltados. while 0rset.ne<t088 X String nome = rset.getString0VnomeV8: doble preco = rset.get!oble0VprecoV8: String artista = rset.getString0VartistaV8: String gravadora = rset.getString0VgravadoraV8: SFstem.ot.println0nome W V ' V W preco W V ' V W artista W V ' V W gravadora8: Y Agosto 2! Interface "r#fica e $anco de %ados em Java 53 Passo 9. obtendo dados de consu#tas '' "onta a conslta S$%. String sql = VS&%&(+ (!.nome5 preco5 *.nome *S V W Vartista5 /.nome *S gravadora =)-" (! V W V122&) U-12 *rtista * -2 (!.id*rtista = *.id V W V122&) U-12 /ravadora / -2 (!.id/ravadora = /.id:V: '' &<ecta o comando no banco de dados. )esltSet rset = stmt.e<ecte$erF0sql8: '' 2avega pelos resltados. while 0rset.ne<t088 X String nome = rset.getString078: '' &qivalenteP doble preco = rset.get!oble0B8: String artista = rset.getString0T8: String gravadora = rset.getString0A8: SFstem.ot.println0nome W V ' V W preco W V ' V W artista W V ' V W gravadora8: Y Agosto 2! Interface "r#fica e $anco de %ados em Java 54 Passo :. fec;ando Sem're feche o statement e a cone4)o, 'ara n)o ocu'ar recursos do sistema. .)o 5 'reciso fechar o result set. &le 5 fechado automaticamente 'elo statement9 SA 'ode haver um result set 'or statement. =ara efetuar outra consulta, crie outro statement. '' =echa o statement e a cone<@o. stmt.close08: conn.close08: Agosto 2! Interface "r#fica e $anco de %ados em Java 55 $%perimente< /rie um 'rograma +ue im'rima o nome de todos os /%s de bandas americanas9 /rie um 'rograma +ue calcule +uanto custa com'rar todos os /%s de cantores 7n)o inclua bandas8 brasileiros9 /rie um 'rograma +ue receba como 'arXmetros nome e 're-o do /%, nome do artista e nome da gravadora e cadastre o /% no banco de dados 7o artista e a gravadora devem e4istir8. Agosto 2! Interface "r#fica e $anco de %ados em Java 56 6so avanado Alguns recursos avan-ados do J%$/1 Prepared statements9 Meta-dados do con>unto de resultados9 Bi'os de cursores e concorr3ncia do result set9 /on>unto de resultados naveg#vel9 Uso de stored procedures9 A interface )owSet9 Bransa-6es. Agosto 2! Interface "r#fica e $anco de %ados em Java 57 Prepared statements Interface .reparedStatement, estende Statement9 =r5-com'ila a S;<, agili,ando sua e4ecu-)o9 \til 'ara comandos e4ecutados re'etidas ve,es9 Uso1 stmt = conn.preparedStatement0sql89 setString0id<5 str8, set1nt0id<5 nm8, etc.9 stmt.e<ecte3pdate08. Agosto 2! Interface "r#fica e $anco de %ados em Java 58 Prepared statements '' (ria o statement. .reparedStatement stmt = conn.prepareStatement0V12S&)+ V W V12+- *rtista 0nome5 banda5 pais8 6*%3&S 0Z5 Z5 Z8:V8: '' "onta o vetor de dados. -bject>?>? dados = new -bject>?>? X XVUamiroqaiV5 ,oolean.+)3&5 V1nglaterraVY5 XV2orah UonesV5 ,oolean.=*%S&5 V&3*VY5 XV2irvanaV5 ,oolean.+)3&5 V&3*VY Y: '' 1nsere todos os dados no banco. for 0int i = 0: i N dados.length: iWW8 X stmt.setString075 0String8dados>i?>0?8: boolean banda = 00,oolean8dados>i?>7?8.boolean6ale08: stmt.set,oolean0B5 banda8: stmt.setString0T5 0String8dados>i?>B?8: int qtd = stmt.e<ecte3pdate08: SFstem.ot.println0qtd W V linha0s8 afetada0s8V8: Y Agosto 2! Interface "r#fica e $anco de %ados em Java 59 -eta=dados do result set Ao reali,ar uma consulta, 5 'oss(vel obter meta- dados sobre a mesma1 .Gmero de colunas retornadas9 .omes das colunas retornadas9 Bi'o de dado 7classe Java8 de cada coluna9 &tc. Uso1 M5todo get"eta!ata08 de )esltSet9 ?b>eto da classe )esltSet"eta!ata. Agosto 2! Interface "r#fica e $anco de %ados em Java 60 -eta=dados do result set '' -btJm meta-dados. )esltSet"eta!ata meta = rset.get"eta!ata08: int col(ont = meta.get(olmn(ont08: int>? spacing = new int>col(ont?: '' 1mprime m cabeMalho para os resltados. for 0int i = 0: i N col(ont: iWW8 X SFstem.ot.print0C[C8: String col2ame = meta.get(olmn2ame0i W 78: spacing>i? = meta.get(olmn!isplaFSi\e0i W 78: SFstem.ot.print0col2ame8: for 0int j = col2ame.length08 W 7: j N spacing>i?: jWW8 SFstem.ot.print0C C8: Y SFstem.ot.println08: Agosto 2! Interface "r#fica e $anco de %ados em Java 61 >ipos de cursores Um result set utili,a um cursor interno +ue navega 'elos resultados9 &4istem ti'os diferentes de cursores, re'resentados 'or constantes de )esltSet1 +4.&R=-)W*)!R-2%41 sA navega 'ara frente9 +4.&RS()-%%R12S&2S1+16&1 navega em +ual+uer dire-)o9 +4.&RS()-%%RS&2S1+16&1 navega em +ual+uer dire-)o e atuali,a os dados se houver altera-)o. Agosto 2! Interface "r#fica e $anco de %ados em Java 62 -odo de concorr?ncia do result set ?utras constantes de )esltSet1 (-2(3)R)&*!R-2%41 n)o 'ode ser atuali,ado9 (-2(3)R3.!*+*,%&1 altera-6es no con>unto refletem no banco de dados. Ao criar o statement, 'odemos es'ecificar o ti'o do cursor e o modo de concorr3ncia1 '' Statement qe obtJm reslt sets qe navegam em '' qalqer direM@o e podem ser atali\ados. stmt = conn.createStatement0 )esltSet.+4.&RS()-%%RS&2S1+16&5 )esltSet.(-2(3)R3.!*+*,%& 8: Agosto 2! Interface "r#fica e $anco de %ados em Java 63 ,onjunto de resu#tados naveve# /onfigurando o result set como +4.&RS()-%%, 'odemos navegar em +ual+uer dire-)o1 ne<t081 'rA4ima linha9 previos081 linha anterior9 absolte0linha81 linha es'ec(fica9 first081 'rimeira linha9 last081 Gltima linha9 get)ow081 nGmero da linha. Agosto 2! Interface "r#fica e $anco de %ados em Java 64 Desafio< /onstrua uma "UI 'ara consultas S;<1 Im'lemente um BableModel +ue res'onda aos m5todos usando um result set e seus meta-dados. Agosto 2! Interface "r#fica e $anco de %ados em Java 65 6so de stored procedures S)o 'rocedimentos arma,enados no banco de dados e e4ecutados a 'artir de uma chamada9 Use o m5todo prepare(all0nome8 da classe (onnection9 :etorno 5 ob>eto +ue im'lementa java.sql.(allableStatement9 (allableStatement estende .reparedStatement. Agosto 2! Interface "r#fica e $anco de %ados em Java 66 A interface RowSet /riada no Java H.Q e melhorada no Java 0., facilita a cone4)o e consultas em $%s9 %ois ti'os 'rinci'ais1 Udbc)owSet1 result set automaticamente rol#vel e atuali,#vel9 (ached)owSet1 result set desconectado D l3 os dados do banco, desconecta e arma,ena em cache. )owSet com cache1 =ode ser seriali,ado 7enviado 'ela redeZ89 Bem limite de +uantidade 7limite da memAria8. Agosto 2! Interface "r#fica e $anco de %ados em Java 67 A interface RowSet '' (ria e e<ecta o )owSet. Udbc)owSet rowSet = new Udbc)owSet1mpl08: rowSet.set3rl0(onfig.,!R3)%8: rowSet.set3sername0(onfig.,!R%-/128: rowSet.set.assword0(onfig.,!RS&2#*8: rowSet.set(ommand0sql8: rowSet.e<ecte08: '' 2avega pelos resltados. while 0rowSet.ne<t088 X 'K 1gal ao )esltSet... K' Y Agosto 2! Interface "r#fica e $anco de %ados em Java 68 >ransa/es J%$/ funciona 'or 'adr)o com commit autom#tico de transa-6es9 =ara desabilitar, use set*to(ommit0false8 no ob>eto (onnection9 Bransa-6es s)o iniciadas automaticamente. =ara confirmar, use commit08 em (onnection9 =ara cancelar, use rollbac]089 ? seu S"$% e seu driver devem ter su'orte T transa-6es 'ara funcionar. Agosto 2! Interface "r#fica e $anco de %ados em Java 69 0ecapitu#ando444 2imos muitos conceitos sobre J%$/1 ? b#sico 7drivers, cone4)o, statement, result set, ...89 Meta-dados9 Bi'os de navega-)o e concorr3ncia do result set9 Prepared statement e stored procedures9 Facilitando o acesso com :oESet. =rosseguindo... /omo utili,ar J%$/ de forma organi,adaU /omo reali,ar a 'ersist3ncia dos meus ob>etos de negAcioU Agosto 2! Interface "r#fica e $anco de %ados em Java 70 O padro de projeto DAO %elega-se a uma classe se'arada a tarefa de 'ersist3ncia de uma classe de negAcio9 =ara cada classe de dom(nio h#1 Uma interface +ue define as o'era-6es do %A? 'ara a+uela classe9 Uma im'lementa-)o 'ara cada tecnologia de 'ersist3ncia 7J%$/, Oibernate, etc.8. =ode ser combinado com o 'adr)o de 'ro>eto F#brica 'ara desaco'lar a tecnologia. Fonte1 htt'1**>ava.sun.com*blue'rints*core>2ee'atterns*=atterns*%ataAccess?b>ect.html Agosto 2! Interface "r#fica e $anco de %ados em Java 71 $%emp#o Agosto 2! Interface "r#fica e $anco de %ados em Java 72 ,onc#us/es 2imos nesta 'arte do curso1 /onceitos b#sicos de S"$%:s e S;<9 /one4)o a banco de dados em Java com J%$/9 ? 'adr)o de 'ro>eto %A?. =rA4imos 'assos1 /onhecer os frameworks de ma'eamento ob>eto*relacional 7?:M8 D ainda neste curso9 A'render mais sobre S;< e S"$%:s9 Investigar a tecnologia de bancos de dados orientada a ob>etos.