You are on page 1of 30

10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

www.devmedia.com.br
[versoparaimpresso]
Linkoriginal:http://www.devmedia.com.br/articles/viewcomp.asp?comp=33273

Criando um CRUD RESTful com Jersey,


JPA e MySQL
Aprenda neste artigo a implementar servios para um CRUD RESTful
para cadastro de clientes.

Fiquepordentro
Esteartigotilpordemonstrar,passoapasso,comodesenvolverumservioRESTfulcomas
operaesdeumCRUDparaumcadastrodeclientestotalmentewebatravsdeumprojetoJavaEE
comMaven.Paraquevocpossacompreendereaprendercomoutilizlas,esteprojetoirenvolver
umagamadetecnologiasdaplataformaJavacomoobjetivodecriarumasoluodequalidadee
escalvel.

Paraisso,serapresentadaaconstruodeumDERparaobancodedadosMySQLseguidopelo
desenvolvimentodeumservioRESTutilizandooJersey,implementaoderefernciada
especificaoJAXRS.

Almdisso,serutilizadaaespecificaoJPAeoHibernatecomoferramentaORMparafazero
mapeamentoobjetorelacionalentreastabelasdobancodedadoseasclassesJava.

Aofinal,vocsabercomoimplementarseusprimeirosserviosweb,recursocadavezmaiscomum
nomercadodesoftware,quebuscasoluescapazesdeproverdiferentesinterfacescomousurioe
defcilintegrao.

DurantemuitotempooswebservicesbaseadosemSOAPforampraticamenteanicasoluoparaa
comunicaoeimplementaodesistemasdistribudos.

Devidoaissoevisandoaqualidadedosservios,essaopopassouporvriasmelhoriasaolongodos
anos,principalmenterelacionadassegurana.

Noentanto,oswebservicesSOAPacabaramficandocomplexos,dedifcilimplementaoecomcustos
elevadosdeadoo.Apartirdeento,aopoporessetipodewebservicepassouaserinvivelem
algunscenrios,sejapelocusto,porrecursosdehardwareedesoftwareoumesmopelograndeconsumo
debandadarede,principalmenteporpartedosdispositivosmveis,queaindanotmumaconexode
altavelocidadeapreosacessveis.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 1/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

OprotocoloSOAPnecessitadeumasriedeparmetroseconfiguraesnoformatoXMLparaviabilizara
trocadedadosentreclienteeservidoreissotornaasmensagenslongastantoparatrfegonarede
quantoparaodispositivoclienteprocessararesposta.

Ousodewebservicessurgedanecessidadedeseterumaaplicaodistribudaeescalvel,necessidade
estaqueseespalhapelosmaisdiversossetoresdenegcioportodoomundo,sejaparaintegrar
sistemasemdiferentesplataformas,comoosdispositivosmveis,sejaparaconectarsistemasweba
sistemaslegados,exporumcanaldecomunicaoparaclientesouparceiros,dentreoutras
necessidades.

Nestecenrio,comointuitodefacilitaracomunicaoentresistemas,podemosfazerusodoprotocolo
HTTPeusufruirdopadroarquiteturalRESTparaimplementarosserviosweb,simplificandoassima
trocadedadosentreclienteeservidor.

Comoumgrandediferencial,oRESTsuportaosprincipaisformatosparacomunicaoetrocade
informaes(JSONeXML),popularmenteutilizadosnodesenvolvimentodesistemasdistribudoseem
outrasaplicaes.

Conhecidoporserumestilohbridoderivadodevriosestilosarquiteturaisbaseadosemrede,oREST
temcomoidealizaoepilaraimplementaodeservioswebbaseadosnoprotocoloHTTP.Otermo
surgiunosanos2000,nadissertaodocoautordoprotocoloHTTP,Dr.RoyThomasFielding,para
obtenodottulodePhD,comadissertaoArchitecturalStylesandtheDesignofNetworkbased
SoftwareArchitectures.

NesteartigoiremosdesenvolverumservioRESTfulresponsvelporviabilizarumcadastrodeclientes
comtodasasfuncionalidadesdeumCRUD.Odesenvolvimentodessecadastroconsistena
implementaodeumwebserviceparaqueumclientepossaconsumirerealizarasoperaesbsicas
deacessoaobancodedados.

Instalando o Eclipse Luna


ParaodesenvolvimentodoprojetocadastrodeclientesiremosutilizaroEclipseLuna.Sendoassim,
baixeestaversonapginadoEclipseeentodescompacteoarquivoemumdiretriodesua
preferncia.

AoexecutarestaIDEpelaprimeiravezsolicitadoaousurioqueinformeumdiretrioparaservircomo
ambientedetrabalho.OworkspacenadamaisdoqueumapastaadotadapeloEclipseparasalvaros
projetosqueeleestgerenciando.

Criando o projeto com Eclipse e Maven


ParacriaroprojetonoEclipse,cliquenomenuFile>New>Other.Logoaps,serexibidaumanova
janela,conformeaFigura1,paraquesejaselecionadoowizardqueauxiliarnacriaodoprojeto.
Nestecaso,selecioneaopoMaven>MavenProjectecliqueemNext.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 2/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Figura1.SelecionandoowizardMavenProject.

Naprximatela,decriaodoprojetoMaven,deixemarcadaaopoUsedefaultworkspacelocation
paraquesejautilizadooworkspaceconfiguradoaoexecutaroEclipsepelaprimeiravez.Emseguida,
cliquemaisumavezemNext(videFigura2).

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 3/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Figura2.Setandooworkspaceparaoprojeto.

Agora,conformeapresentadonaFigura3,deveserselecionadooArchetypedoMavenaserutilizado
paracriaroprojeto.Nestecaso,selecioneaopomavenarchtypewebapp,poisiremoscriarumprojeto
JavaEE.

OArchetypeumaespciedetemplatequeviabilizaacriaodeprojetoscombaseemumatecnologia
ouespecificao,comoJSF,JPA,Spring,Struts,dentreoutras.Feitoisso,cliqueemNext.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 4/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Figura3.SelecionandooArchetypedoMavenparaoprojetocadastrodeclientes.

Altimateladowizard,apresentadanaFigura4,mostraalgunscamposquedevemserpreenchidos
parafinalizaracriaodoprojeto.Nela,deveserinformadoogroupid(geralmenteinformaseositeda
organizao),oiddoartefato(identificadordoprojeto),aversodesteeonomecompletodopacote
base.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 5/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Figura4.Definiodosdadosparaidentificaodoprojeto.

ApsclicaremFinish,emalgumasocasiespodeocorrerumerrodeacessopastadorepositriolocal
doMaven,informandoquenofoipossveldefiniresserepositrio.Parasolucionlovocdevedeletara
pastarepositoryparaqueoEclipsepossacrilanovamentecomaspermissesdeacessocorretas.

OlocaldorepositriopodeserverificadonaopoLocalRepository,conformeapresentadonaFigura5,
nasprefernciasdoEclipse.

OrepositrionadamaisqueumapastanamquinalocalondeoMavenirbaixardeseuservidorou
servidorpersonalizadotodasasdependnciasdoprojeto,comoframeworks,pluginsebibliotecas.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 6/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Figura5.Definindoanovapastarepository.

Configurando as dependncias e plugins no pom.xml


ParaquepossamosconstruiroprojetosernecessrioutilizarvriasbibliotecasJava,referentesao
Jersey,Hibernate,MySQLeplugindoTomcat.Sendoassim,devemosinformaressasbibliotecasesuas
respectivasversesnopom.xml.

Feitoisso,oMavenseresponsabilizarporbaixlasegerencilasapartirdeento.NaListagem1
apresentadoocdigodoarquivopom.xmldonossoprojeto.

Listagem1.Arquivopom.xmlcomasdependnciasdoprojeto.

01<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
02xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/mavenv4_0_0.xsd">
03<modelVersion>4.0.0</modelVersion>
04<groupId>br.com.devmedia</groupId>
05<artifactId>crud_cadastro_cliente</artifactId>
06<packaging>war</packaging>
07<version>0.0.1SNAPSHOT</version>
08<name>crud_cadastro_clienteMavenWebapp</name>
09<url>http://maven.apache.org</url>
10<dependencies>
11<dependency>
12<groupId>junit</groupId>
13<artifactId>junit</artifactId>

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 7/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

14<version>3.8.1</version>
15<scope>test</scope>
16</dependency>
17<dependency>
18<groupId>com.sun.jersey</groupId>
19<artifactId>jerseyserver</artifactId>
20<version>1.8</version>
21</dependency>
22<dependency>
23<groupId>com.sun.jersey</groupId>
24<artifactId>jerseyjson</artifactId>
25<version>1.8</version>
26</dependency>
27<dependency>
28<groupId>org.hibernate</groupId>
29<artifactId>hibernatevalidator</artifactId>
30<version>4.2.0.Final</version>
31</dependency>
32<dependency>
33<groupId>org.hibernate.common</groupId>
34<artifactId>hibernatecommonsannotations</artifactId>
35<version>4.0.1.Final</version>
36<classifier>tests</classifier>
37</dependency>
38<dependency>
39<groupId>org.hibernate.javax.persistence</groupId>
40<artifactId>hibernatejpa2.0api</artifactId>
41<version>1.0.1.Final</version>
42</dependency>
43<dependency>
44<groupId>org.hibernate</groupId>
45<artifactId>hibernateentitymanager</artifactId>
46<version>4.0.1.Final</version>
47</dependency>
48<dependency>
49<groupId>mysql</groupId>
50<artifactId>mysqlconnectorjava</artifactId>
51<version>5.1.6</version>
52<scope>compile</scope>
53</dependency>
54</dependencies>
55<build>
56<finalName>crud_cadastro_cliente</finalName>
57<plugins>
58<plugin>
59<groupId>org.apache.tomcat.maven</groupId>
60<artifactId>tomcat7mavenplugin</artifactId>
61<version>2.0</version>
62<configuration>
63<path>/</path>
64<port>8080</port>
65</configuration>
66</plugin>
67</plugins>
68</build>
69</project>

Vejamosaseguiralgumasconsideraessobrealistagem:

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 8/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Linhas4a8:NestetrechosodefinidasalgumasinformaesreferentesaoprojetoparaqueoMaven
possarealizarocontroledociclodevidadodesenvolvimento.Assimsendo,informadooidentificador
dogrupo,oidentificadordoartefato,aversoeonomedoprojeto

Linhas11a16:AquifoiinseridaumadependnciaaoJUnitparatestesdeunidadenoprojeto.OMaven
defineamesmaautomaticamentenoatodacriaodoprojeto

Linhas17a21:NesteblococonstaadependnciaaoservidorJersey,frameworkresponsvelpor
tratarasrequisiesrealizadasaoservio.SeucdigoassumeopapeldeServletContainerparareceber
etratartodasasrequisiesrealizadasviaprotocoloHTTP.Nesteprojetoiremosimplementaras
requisiesHTTPcomosverbosGET,POST,PUTeDELETEparaasrespectivasoperaesdeumCRUD.
AssimserpossvelinserirerealizaramanutenodosdadosnobancoMySQL

Linhas22a26:Nesteblocodefinidaadependnciaparaosuportetrocadedadosnoformato
JSON.DestaformaserpossvelenviarereceberdadosnoformatoJSONentreasrequisiese
respostasdoclienteaoservidor

Linhas27a47:NesteintervalosoinformadastodasasdependnciasdoHibernate.OHibernateum
frameworkqueviabilizaomapeamentoobjetorelacionalentreastabelasdobancodedadoseasclasses
Java.LembresequeasclassesJavarepresentamasentidadesdomundorealnosistema.importante
frisaraindaqueemboratenhamosadotadooHibernate,programaticamenteiremosutilizarasinterfaces
daespecificaoJPAparaacessoaobanco

Linhas48a53:AquidefinidaadependnciadabibliotecadoMySQL.OHibernatefarusodestapara
acessarobancodedados.

Definidasasdependncias,vamosconfigurarumservidorwebquerodeaplicaesJavaEE.Paraisso,
podemosusaroWildFly,GlassFish,dentreoutros,porm,nesteartigoseradotadooTomcat7.

ComoaApachedisponibilizaomesmoatravsdeumpluginparaprojetosdesenvolvidoscomoMaven,a
suainstalaonoEclipsebastantesimples.Bastaadicionaroblocodecdigoreferenteaoplugindo
Tomcatnopom.xmleexecutaroprojetodefinindoocampoGoalscomovalortomcat7:run,como
podemosverificarnajanelaRunConfigurationsdoEclipse(videFigura6).

FeitoissooMavenirbaixartodososarquivosnecessriosparaorepositriolocaledepoisirlevantaro
servidornoendereolocalhost:8080.Aslinhas68a78mostramcomoconfiguraresseplugin,onde
informamosoGroupId,ArtifactId,versioneopathparaformaraURLaseracessadapelasrequisies
HTTP.

Realizadasasconfiguraes,executeoprojetoparaverificaroresultadonobrowser.Durantea
compilaodoprojetovocpodeacompanharodownloaddoplugindoTomcat7atravsdoconsoledo
Eclipse.AofinalserapresentadaaURLdoservidor.Apartirdeentopodemosinformaramesmano
browserparaverificaraaplicaorodando,comodemonstraaFigura7.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 9/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Figura6.Configurandoobuilddoprojeto.

abririmagememnovajanela

Figura7.Projetocadastrodeclientesemexecuonobrowser.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 10/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Diagrama Entidade Relacionamento da aplicao


ParadesenvolveroDiagramaEntidadeRelacionamento(DER)daaplicaoeposteriormentegerara(s)
tabela(s)nobancodedados,iremosutilizaraferramentaCASEDBDesignerFork,umasoluogratuita
quegerascriptsSQLparadiversosSGBDs,comoMySQL,SQLServer,Oracle,SQLite,PostgreSQL,dentre
outros.VocpoderealizarodownloaddoDBDesigneratravsdoendereoindicadonaseoLinks.

AFigura8apresentaoDERdanossaaplicaosendocompostoporapenasumatabela,denomecliente,
responsvelporarmazenarosdadosdosclientesaseremcadastrados.

ParageraroscriptSQLparaoMySQL,cliquenomenuFile>Export>SQLCreateScript.Feitoisso,ser
abertaumanovatelaconformeapresentadonaFigura9.Ento,selecioneaopoMySQLnoTarget
DataBaseecliquenobotoCopyscripttoClipboardparacopiaroscript.Logoaps,abraalguma
ferramentadegernciadobancodedados,comooMySQLWorkbench,crieumbancodedadoschamado
bd_clienteeexecuteoscriptdaListagem2,geradopeloDBDesignerFork.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 11/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Figura8.DERdobancodedadoscadastrodeclientes.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 12/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Figura9.GerandoscriptSQL.

Listagem2.ScriptSQLparacriaratabelacliente.

CREATETABLEcliente(
id_clienteINTEGERUNSIGNEDNOTNULLAUTO_INCREMENT,
nomeVARCHAR(100)NULL,
cpf_cnpjVARCHAR(14)NULL,
rgVARCHAR(20)NULL,
enderecoVARCHAR(100)NULL,
bairroVARCHAR(60)NULL,
cidadeVARCHAR(60)NULL,
estadoVARCHAR(50)NULL,
telefoneVARCHAR(12)NULL,
emailVARCHAR(50)NULL,
data_cadastroDATENULL,
PRIMARYKEY(id_cliente));

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 13/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Criando a entidade cliente


Paratornarpossvelamanipulaodeclientesnaaplicaonecessriaterumaclassequeviabilize
essaabstrao.Apartirdelapodemosreceberosdadosdoclientearmazenadosnobancodedados,
exibirnainterfacedousurioeviceversa.

Sendoassim,vamoscriarumaclassedenomeClienteModelpararepresentaraentidadecliente.Nesta
classedeclararemososatributosreferentesscolunasdatabelaclientedobancodedados,processo
estequeconhecidocomomapeamentoobjetorelacional.Paraisso,primeirocriaremosumapasta
chamadajavadentrodapastamaindoprojeto.

importanteseguirestasinstruesporquecasovoccrieumapastacomumnomediferentedejava,o
JerseyeoHibernatepodemnoencontrarasclassesClienteModeleClienteService,queserocriadas
paraexporoservioRESTcomasoperaesdoCRUD.

Paracriarapastajava,cliquecomobotodireitonapastamainedepoisnaopoNew>Folder.Em
seguida,definaonomecomojavaecliqueemFinish.

Agora,cliquecomobotodireitonapastasrc/main/javaedepois,aoselecionaraopoNew>Class,
definaonomedaclassecomoClienteModel,nopacotebr.com.devmedia.model,ecliqueemFinish.

Realizadoesteprocedimento,teremosoprojetocomaestruturaapresentadanaFigura10.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 14/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Figura10.Estruturadoprojeto.

CriadaaclasseClienteModel,vocdeveimplementlaconformeocdigoapresentadonaListagem3.

Listagem3.CdigodaclasseClienteModel.

01packagebr.com.devmedia.model;
02
03importjava.util.Date;
04importjavax.persistence.Column;
05importjavax.persistence.Entity;
06importjavax.persistence.GeneratedValue;
07importjavax.persistence.GenerationType;
08importjavax.persistence.Id;
09importjavax.persistence.Table;

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 15/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

10importjavax.persistence.Temporal;
11importjavax.persistence.TemporalType;
12
13@Entity
14@Table(name="cliente")
15publicclassClienteModel{
16@Id
17@GeneratedValue(strategy=GenerationType.IDENTITY)
18intid_cliente;
19
20@Column(name="nome")
21Stringnome;
22
23@Column(name="cpf_cnpj")
24Stringcpf_cnpj;
25
26@Column(name="rg")
27Stringrg;
28
29@Column(name="endereco")
30Stringendereco;
31
32@Column(name="bairro")
33Stringbairro;
34
35@Column(name="cidade")
36Stringcidade;
37
38@Column(name="estado")
39Stringestado;
40
41@Column(name="email")
42Stringemail;
43
44@Column(name="data_cadastro")
45@Temporal(TemporalType.TIMESTAMP)
46Datedata_cadastro;
47
48publicintgetId_cliente(){
49returnid_cliente;}
50
51publicvoidsetId_cliente(intid_cliente){
52this.id_cliente=id_cliente;}
53
54publicStringgetNome(){
55returnnome;}
56
57publicvoidsetNome(Stringnome){
58this.nome=nome;}
59
60}

Comopodemosverificar,essecdigotemalgumasparticularidadeseanotaesdaJPAquemerecem
destaque.Assim,aseguiranalisamososdetalhesdessaimplementao:

Linha13:Nestalinhainformadaaanotao@EntitydaJPA.Elaresponsvelpordefinirquea
classeClienteModelumaestruturademapeamentoobjetorelacionalecorrespondeaumarefernciaa
umatabelanabasededados

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 16/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Linha14:Aquidefinidaaanotao@Tablecomapropriedadenameespecificadacomovalor
cliente.Destemodo,informamosqueaclasseClienteModelcorrespondetabeladenomeclientedo
bancodedados

Linhas16a18:Nesteintervalofoidefinidaapropriedadeid_clientecomasanotaes@Id,para
especificarquechaveprimria,e@GeneratedValue,paraespecificarqueovalordachaveprimria
devesergeradoautomaticamentepelobancodedados

Linhas20a42:NesteintervalosodeterminadasasdemaispropriedadesdaclasseClienteModel.
Percebaquetodassoanotadascom@Columnparainformarquerepresentamcolunasnatabelacliente
dabasededados

Linha45:Estalinhaexpeaanotao@Temporalparaapropriedadedata_cadastro.Assim,
definidoqueestecampoirtrabalharcomvaloresnoformatodata

Linhas48a58:Nesteintervalosoimplementadososmtodosdeacesso(gettersesetters)de
algumaspropriedadesdaclasseClienteModel.Vocpodegerarestesmtodosautomaticamenteno
Eclipse.Paraisso,bastaclicarcomobotodireitonaopoSource>GenerateGettersandSetterse
marcartodososatributosparaosquaisdesejagerarosrespectivosmtodos.

Criando e configurando o persistence.xml


Paraquenossaaplicaodecadastrodeclientesconsigarealizaroacessoadados,devemoscriaro
arquivopersistence.xml.EstepossuiasconfiguraesutilizadaspelaJPAparaviabilizaracomunicao
comobancodedados.TalarquivodevesercriadonapastadenomeMETAINF,queporsuavezdeve
sercriadadentrodapastajavaparaqueasclassesEntityManagerFactoryeEntityManagerdaJPA
possamencontrloeassimfazerusodasconfiguraesinformadas.

Ditoisso,crieapastaMETAINFdentrodejavaedepoiscrieoarquivopersistence.xml.Apseste
procedimentoaestruturadepastasdoprojetodeveestarsemelhanteapresentadanaFigura11.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 17/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Figura11.Estruturadepastasparainclusodoarquivopersistence.xml.

Comopersistence.xmlemmos,podemosconfigurloparainformaraclasseClienteModel,oprovedor
deacessoadados,odialetodoSGBDeosdadosparaconexocomobancodedados,ouseja,o
endereodobanco,ousurioesenha.AListagem4mostracomodeveficaressearquivo.

Listagem4.Cdigodoarquivopersistence.xml.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 18/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

01<persistencexmlns="http://java.sun.com/xml/ns/persistence"
02xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
03xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
04http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
05version="2.0">
06<persistenceunitname="app_crud_cliente">
07<provider>org.hibernate.ejb.HibernatePersistence</provider>
08<class>br.com.devmedia.model.ClienteModel</class>
09<properties>
10<propertyname="javax.persistence.jdbc.driver"value="com.mysql.jdbc.Driver"/>
11<propertyname="javax.persistence.jdbc.url"value="jdbc:mysql://localhost/bd_cliente"/>
12<propertyname="javax.persistence.jdbc.user"value="root"/>
13<propertyname="javax.persistence.jdbc.password"value="root"/>
14<propertyname="hibernate.dialect"value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
15</properties>
16</persistenceunit>
17</persistence>

Vejamososdetalhesdaconfiguraodopersistence.xml:

Linha6:Nestalinhainformadoopersistenceunit,abaseparainiciaraconfiguraodo
persistence.xml.Percebaqueapropriedadename,namesmalinha,recebeuovalor
"app_crud_cliente".Portanto,estenomequeinformaremosnaconfiguraodo
EntityManagerFactoryqueiremoscriarmaisadiantenoartigo,paraquepossaseridentificadaa
configuraodopersistence.xmleassimcriaroEntityManagerparaacessoaobancodedados

Linha7:AquiinformadooprovedorORMqueimplementaoJPA,nestecasooHibernate

Linha8:NestalinhainformadaaclasseClienteModel,responsvelpelomapeamentocomobanco
dedados

Linhas9a15:Nesteblocodecdigosoinformadasaspropriedadesdeconexocomobancode
dados,comoodriverdoMySQL,aURLdeacessoaoservidordobancodedadosseguidapelonomedo
banco,ousurioeasenha.

Criando o EntityManager
Oprximopassocriaraclassequetenhaummtodoresponsvelporretornarumobjetodotipo
EntityManager.oEntityManagerquedisponibilizatodososmtodosqueprecisamosparaconseguir
acessoaobancodedadosequeveremosmaisfrente.

Sendoassim,criaremosumaclasse,chamadaJpaEntityManager,paragerenciaraconexocomo
bancodedadosMySQL.Dentrodamesmadevemosdeclarardoisobjetosparasetarafbricadeobjetos,
isto,setarEntityManagerFactorycomasconfiguraesdoarquivopersistence.xml.Assim,podemos
obterumainstnciadoEntityManagerpara,defato,chamarseusmtodoserealizarasoperaesdo
CRUD.

Portanto,crieaclasseJpaEntityManagernopacotebr.com.devmedia.EntityManager.Seucdigo
fonteapresentadonaListagem5.

Listagem5.CdigodaclasseJpaEntityManager.

01packagebr.com.devmedia.EntityManager;
02
03importjavax.persistence.EntityManager;
04importjavax.persistence.EntityManagerFactory;

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 19/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

05importjavax.persistence.Persistence;
06
07publicclassJpaEntityManager{
08
09privateEntityManagerFactoryfactory=Persistence.createEntityManagerFactory("app_crud_cliente");
10privateEntityManagerem=factory.createEntityManager();
11
12publicEntityManagergetEntityManager(){
13returnem;
14}
15}

Comopodemosverificar,elebemsimples.Vejamososseusdetalhes:

Linha9:NestalinhacriadoumobjetochamadofactorydotipoEntityManagerFactory.Estefoi
definidoparareceberumainstnciadoprprioEntityManagerFactory.Paraisso,chamamosomtodo
createEntityManagerFactory()daclassePersistence,querecebecomoparmetroonome
app_crud_cliente,nomeestequefoiinformadonopersistence.xml,napropriedadepersistence
unit

Linha10:Nestetrechofoicriadomaisumobjeto,chamadoemedotipoEntityManager.Omesmo
recebeumainstnciadoEntityManageratravsdachamadaaomtodocreateEntityManager()do
objetofactorycriadoanteriormente

Linhas12a14:NesteblocofoidefinidoummtodochamadogetEntityManager().Esteretornaum
objetoEntityManagerpararealizarasoperaesdoCRUDnobancodedadosatravsdeseusmtodos.

Definindo o servlet do Jersey no web.xml


EmtodaaplicaoJavaEEprecisamoscriarumarquivochamadoweb.xml,localondepodemosconfigurar
oservletqueirreceberasrequisiesHTTP.Nestearquivotambmsodefinidasasinformaessobre
oservioREST,pacotes,classesdoservio,dentreoutrasconfiguraesquefogemdoescopodeste
artigo.

Onossoweb.xmldeveserconfiguradoconformeocdigodaListagem6,ondesoinformadososdados
daAPIdoJersey,isto,ondedefinidoqueoservletdoJerseyqueseroresponsvelporreceberas
requisiesHTTPreferentesschamadasaoservio.

Listagem6.DefiniodoservletdoJerseynoarquivoweb.xml.

01<!DOCTYPEwebappPUBLIC
02"//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"
03"http://java.sun.com/dtd/webapp_2_3.dtd">
04
05<webapp>
06<displayname>ArchetypeCreatedWebApplication</displayname>
07
08<servlet>
09<servletname>CRUDCadastrodeClientes</servletname>
10<servletclass>com.sun.jersey.spi.container.servlet.ServletContainer</servletclass>
11<initparam>
12<paramname>com.sun.jersey.config.property.packages</paramname>
13<paramvalue>br.com.devmedia.service</paramvalue>
14</initparam>
15
16<initparam>

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 20/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

17<paramname>com.sun.jersey.api.json.POJOMappingFeature</paramname>
18<paramvalue>true</paramvalue>
19</initparam>
20
21<loadonstartup>1</loadonstartup>
22</servlet>
23
24<servletmapping>
25<servletname>CRUDCadastrodeClientes</servletname>
26<urlpattern>/apirest/*</urlpattern>
27</servletmapping>
28</webapp>

ParaentendermelhoressecdigoXML,vejamossuaanlise:

Linha10:Nestalinhadefinidaaclassequerepresentaoservletdaaplicao.Nestecasofoi
informadoServletContainer,doJersey

Linhas11a14:Nesteblocoinformadoopacotequeirconterasclassesquerepresentamoservio
econtmosmtodosaseremexpostos.Nestecasofoiinformadoopacotebr.com.devmedia.service,
queaindavamoscriar

Linhas16a19:Nesteblocosodefinidosoutrosparmetrosparaoservio.DessavezparaaAPIde
JSONdoJersey,paraqueelapossarealizaromapeamentoqueviabilizaaconversodasrequisiesno
formatoJSONemclassesJava.Omesmovaleparaasrespostasdoservidoraocliente,natransformao
objetoJava>JSON

Linhas24a27:NesteblococonfiguradaaURLparaacessoaosrecursosdoservidor,oumelhor,s
operaesdoCRUDaseremexpostaspeloservio.Atravsdatagurlpatterndefinidoocaminho
padrodeacessosURLsdoservio,como:http://localhost:8080/apirest/cliente/cadastrar.

Implementando o servio REST


ChegouomomentodeimplementaraclassequeirexporoservioRESTeconsequentementeas
operaesCRUDparaocadastrodeclientes.Paradesenvolveresseservio,crieumaclassedenominada
ClienteServicenopacotebr.com.devmedia.service.Apsessepasso,aestruturadoprojetodeve
estarconformeaFigura12.OcdigodaclasseClienteServiceapresentadonaListagem7.

Observandoessaimagempodemosnotarumaorganizaonaestruturadospacotesdoprojeto.Sendo
assim,humpacotepararepresentarasclassesquerepresentamasentidades,outroparaasclassesde
servioe,porfim,opacotequeencapsulaoacessodados.Destaformaoprojetosetornabem
estruturadoecomresponsabilidadesbemdefinidas,facilitandopossveisatualizaesemanutenes.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 21/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Figura12.EstruturadoprojetoapscriaraclasseClienteService.

Listagem7.CdigodoservioRESTclasseClienteService.

01packagebr.com.devmedia.service;

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 22/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

02
03@Path("/cliente")
04publicclassClienteService{
05privateJpaEntityManagerJPAEM=newJpaEntityManager();
06privateEntityManagerobjEM=JPAEM.getEntityManager();
07
08@GET
09@Path("/listar")
10@Produces("application/json")
11publicList<ClienteModel>listar(){
12
13try{
14Stringquery="selectcfromClienteModelc";
15List<ClienteModel>clientes=objEM.createQuery(query,ClienteModel.class).getResultList();
16objEM.close();
17returnclientes;
18}catch(Exceptione){
19thrownewWebApplicationException(500);
20}
21}
22
23@GET
24@Path("/buscar/{id_cliente}")
25@Produces("application/json")
26publicClienteModelbuscar(@PathParam("id_cliente")intid_cliente){
27try{
28ClienteModelcliente=objEM.find(ClienteModel.class,id_cliente);
29objEM.close();
30returncliente;
31}catch(Exceptione){
32thrownewWebApplicationException(500);
33}
34}
35
36@POST
37@Path("/cadastrar")
38@Consumes("application/json")
39publicResponsecadastrar(ClienteModelobjClinte){
40try{
41objEM.getTransaction().begin();
42objEM.persist(objClinte);
43objEM.getTransaction().commit();
44objEM.close();
45returnResponse.status(200).entity("cadastrorealizado.").build();
46}catch(Exceptione){
47thrownewWebApplicationException(500);
48}
49}
50
51@PUT
52@Path("/alterar")
53@Consumes("application/json")
54publicResponsealterar(ClienteModelobjClinte){
55try{
56objEM.getTransaction().begin();
57objEM.merge(objClinte);
58objEM.getTransaction().commit();
59objEM.close();
60returnResponse.status(200).entity("cadastroalterado.").build();
61}catch(Exceptione){
62thrownewWebApplicationException(500);
63}

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 23/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

64}
65
66@DELETE
67@Path("/excluir/{id_cliente}")
68publicResponseexcluir(@PathParam("id_cliente")intid_cliente){
69try{
70ClienteModelobjClinte=objEM.find(ClienteModel.class,id_cliente);
71
72objEM.getTransaction().begin();
73objEM.remove(objClinte);
74objEM.getTransaction().commit();
75objEM.close();
76
77returnResponse.status(200).entity("cadastroexcludo.").build();
78}catch(Exceptione){
79thrownewWebApplicationException(500);
80}
81}
82}

NestecdigopodemosverificarqueosverbosdoprotocoloHTTP(GET,POST,PUTeDELETE)so
utilizadosparacadaoperaodoCRUD.OverboPOST,porexemplo,empregadoparaaoperao
relacionadaaocadastrodeclientes.ParaalteraodosdadosfoiadotadooPUT,DELETEparaexclusoe
GETparaobteralistagemdosclientes.NocdigoaindapodemosverificaralgumasanotaesdoJAXRS
eousoderecursosdaJPA.

AseguirsoapresentadososprimeirosdetalhesdaclasseClienteService,queseranalisadamaisa
fundonosprximostpicos:

Linha03:LocalondedefinimosqueaclasseClienteServiceserumservio.Paraissofoiinseridaa
anotao@PathpassandocomoparmetroonomedoservioqueircomporaURLdeacessoaos
recursosdoservidor.

Apartirdisso,ocaminhoparaacesoaoservioser:http://localhost:8080/apirest/cliente/.Lembrese
queapiresteaportaforamdefinidosnomapeamentodoservletdoJerseynoweb.xml

Linhas05e06:Nalinha5foicriadoumobjetodaclasseJpaEntityManager.Logodepois,nalinha6
criadooutroobjeto,chamadoobjEM.EsterecebeumEntityManageratravsdachamadaaomtodo
getEntityManager()deJpaEntityManager.oobjEMqueirpossibilitaroacessoadados.

Paramelhorentendimentoemostrarnaprticaoconsumodosmtodos(recursos)donossoserviode
cadastrodecliente,iremosinstalarumcomplementodoFirefoxchamadodeHttpRequester.Comesse
intuito,acesseaopoComplementosdestenavegador,procureporHttpRequestereentocliqueem
Instalar.EstepossibilitarealizarrequisiesaserviosRESTutilizandovriosverbosdoprotocoloHTTP.

Consumo do recurso listar clientes


Oprimeirorecursoaserimplementadoserodelistagemdosdados.Destaforma,comearemos
analisandoocdigorelacionadolistagem(videmtodolistar()daListagem7)ecomoconsumireste
servio.

Aimplementaodestemtodo,equivalenteoperaoReaddoCRUD,explicadaaseguir:

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 24/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Linhas08a21:Esteblocodecdigodefineoprimeiromtododoservio,olistar(),queretornauma
listadeClienteModel.Nalinha08foiutilizadaaanotao@GETparainformarqueestemtodos
poderserrequisitadoporumarequisiodotipoGETnoprotocoloHTTP.

Nalinha09informadaaanotao@Path,querecebeporparmetroonomedorecursodoservio
nestecasoonomefinaldaURLqueapontaparaorecursodelistagemdeclientesnoservidor,listar.Vale
ressaltarqueovalordapropriedadenamede@Pathnoprecisaseromesmonomedomtodoiniciado
nalinha11,masdeixamosomesmoapenasparafacilitaroentendimento.

Nalinha10foiespecificadaaltimaanotaodomtodolistar:@Produces.Estaserveparainformarao
Jerseyqueeledeveretornaraoclientealistagemdalinha17noformatoJSON

Linha13a20:Estaaimplementaodocdigoqueefetivamenteirbuscaralistagemdeclientes,
ondedefinidaumaStringchamadaqueryquerecebeaconsultaaserrealizadanobancodedados.Em
seguida,nalinha15oobjetoclientesrecebeoresultadodaconsultaatravsdachamadaaosmtodos
createQuery()egetResultList(),disponveisnoobjetoEntityManager,enalinha16encerradoo
EntityManagerchamandoomtodoclose().Porfim,nalinha19criadoumthrowatravsdaclasse
WebApplicationExceptionpararecuperarmospossveiserrosduranteaexecuoeinformarao
solicitantedoservio.

NaFigura13expomosoresultadodeumarequisiodotipoGETaorecursolistarclientes.Paraisso,
percebaqueprecisamosapenasinformaraURLdoservioeselecionaroverboGET.Antesderealizaro
teste,noentanto,abraalgumgerenciadordebancodedadosMySQLeinsiraalgunsclientesnatabela
cliente.

abririmagememnovajanela

Figura13.Consumodorecursolistarclientes.

Consumo do recurso buscar cliente

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 25/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Outroimportanterecursodonossoservioabuscadeclientesnabasededadospeloid.Relacionado
operaoReaddoCRUD,arequisioaesterecursogeralmenterealizadaatravsdeumarequisio
dotipoGET.

Nocdigodoprojetoexemplo,omtodobuscar()recebeoiddoclienteaserpesquisadoeretornaos
dadosdomesmonoformatoJSON,quandoencontrado.Faamosumaanlisedoseucdigo:

Linhas23a26:Nestaslinhassodeclaradasasanotaes@GET,@Pathe@Producesparaindicar,
respetivamente,otipodemtodoHTTP,ocaminhodeacessoaorecursoeotipodosdadosquesero
retornados(JSON,nestecaso).Percebaaindaquenalinha24informadoumparmetrochamado
id_clienteparareceberocdigodoclientenarequisioGET.atravsdesteparmetroqueobtidoo
cdigoaserpesquisadonobancodedados

Linha26:Aquitemosadeclaraodomtodobuscar(),localondetambmfazemosusodaanotao
@PathParam,querecebeonomedoparmetroaserpassadocomocdigodoclientejuntoURLde
requisio

Linha28:NestalinhacriadoumobjetodotipoClienteModelparareceberosdadosdocliente
pesquisadonabasededados.Vejaqueaconsultafoirealizadaatravsdomtodofind(),querecebeuo
tipodomodelaserpesquisadoeoiddocliente.Naslinhas29e30oEntityManagerencerradoe
retornadooclientepesquisadonoformatoJSON.

NaFigura14podemosverificaroresultadodoconsumodorecursobuscarclienteatravsdeuma
requisiodotipoGETcomaferramentaOpenHttpRequester.

abririmagememnovajanela

Figura14.Consumodorecursobuscarcliente.

Consumo do recurso cadastrar cliente

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 26/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

AprximaoperaodoCRUDquecodificamoscomoumserviooCreate,paracadastrarumnovo
clientenabasededados.Paraisso,devemosrealizarumarequisiodotipoPOSTpassandonocorpoda
mesmaosdadosdonovocliente.Osdetalhesdesuaimplementaosoapresentadosaseguir:

Linha38:Oprimeiropontoadestacarnestecdigoapresenadeumanovaanotao,chamada
@Consumes.EstatemcomofunodefinirotipodedadoaserrecebidopelarequisioPOST,neste
casooJSON

Linha39:Nestalinhatemosadeclaraodomtodo,quecomoparmetrorecebeoobjetoclienteaser
cadastradonobanco

Linhas41a43:Nesteintervaloiniciadaumanovatransaocomobancodedados.Nalinha42um
novoclientepersistido.Porfim,realizadoumcommitparaqueomesmosejagravado
permanentemente

Linha46:Nestalinhautilizadoomtodostatus()daclasseResponsepararetornaraoclienteo
cdigo200doHTTP.Istoinformaqueoclientefoicadastradocomsucesso.

NaFigura15podemosverificaroresultadodarequisioPOSTaorecursocadastrar.Percebaqueos
dadosdonovoclienteestonoformatoJSON,poisesteoformatoesperadopeloservidor,conforme
explicitadopelaanotao@Consumes(application/json).

abririmagememnovajanela

Figura15.Consumodorecursocadastrarcliente.

Consumo do recurso alterar cliente


Outraoperaodonossoservio,relacionadaaoUpdatedoCRUD,aalteraodosdadosdeumcliente.
Comoesperado,omtodorelacionadoalteraosdadosdoclienteedepoisretornaumamensagem
informandoosucessodaexecuo.Analisemososeucdigo:

Linha51:Nestalinhainformadaaanotao@PUT,definindoquearequisiodeveusaromtodo
PUTdoprotocoloHTTP

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 27/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Linha53:Aquiespecificadaaanotao@Consumesparainformarqueosdadosrecebidospela
requisiodevemestarnoformatoJSON.DestemodooJerseypoderfazeraconversoparaobjetos
Java

Linhas56a58:Nesteintervaloiniciadaumanovatransao(videlinha56).Emseguidaosdadosdo
clientesoalteradosnabaseatravsdachamadaaomtodomerge()doEntityManager,querecebe
porparmetrooclienteaseratualizado.Porfim,nalinha58realizadoocommitparapersistiressa
mudana

Linha60:NestalinhautilizadanovamenteaclasseResponse,queatravsdomtodostatus()
retornaocdigo200informandoqueocadastrodoclientefoialteradocomsucesso.

NaFigura16possvelverificaroconsumodorecursoquealteraasinformaesdeumclientenobanco
dedados.

abririmagememnovajanela

Figura16.Consumodorecursoalterarcliente.

Consumo do recurso excluir cliente


Altimaoperaoaserimplementadaadeexcluirclientes,referenteaoDeletedoCRUD.Paraisso,
estemtodorecebeoIDdoclientecadastradonabasededadoseentooexclui.Vejamosasua
implementao:

Linha66:Aquifoiutilizadaaanotao@DELETE,quedefinequesomenterequisiescomoverbo
DELETEdoprotocoloHTTPpodemrequisitaresterecursodoservio

Linha67:Percebanestalinhaqueinformadocomoparmetrooiddoclienteaserexcludodabase
dedados.ParaqueoserviopossareceberoparmetronecessrioinformaroIDdoclientenofinalda
URI

Linha70:Nestalinhapodemosverificarabuscanobandodedadosdoclienteaserexcludo

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 28/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

Linhas72a74:Nesteintervalodeclaramosumatransaoqueexcluioclientedobancodedados
atravsdachamadaaomtodoremove()deEntityManager.Comoparmetroestemtodorecebeo
cliente.Nalinha74efetuamosocommit()

Linha77:Porfim,retornadoocdigo200paraindicarqueoclientefoiexcludocomsucesso.

VejanaFigura17oresultadodoconsumodorecursorelacionadoexclusodeumclientenobancode
dados.

abririmagememnovajanela

Figura17.Consumodorecursoexcluircliente.

OdesenvolvimentodeaplicaesqueadotamopadroarquiteturalRESTsegueemaltaeprovavelmente
continuarassimatqueumasoluomaissimpleselevesejaapresentadacomunidade.Destemodo,
sevocaindanoestutilizandoestasoluoemsuasaplicaesquerequeremwebservices,este
artigoservecomoumtimopontodepartidaparaisso.

Comanecessidadedesoluescadavezmaisintegradas,ousodeserviosjsetornouumaforte
vertentenomundododesenvolvimento.Conheceresabercomoimplementlos,portanto,umrequisito
essencialatodoprofissionalqueatuanarea.

Links

EndereoparadownloaddoEclipseLuna.
https://www.eclipse.org/downloads/packages/eclipseidejavaeedevelopers/lunasr2

PginadoprojetoDBDesignerFork.
http://sourceforge.net/projects/dbdesignerfork/

DissertaodeRoyFielding.
https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 29/30
10/10/2015 CriandoumCRUDRESTfulcomJersey,JPAeMySQL

PginadoprojetoJersey.
https://jersey.java.net/

EndereoparadownloaddoMySQL.
http://www.mysql.com/downloads/

JavaPersistenceAPI.
http://www.oracle.com/technetwork/java/
javaee/tech/persistencejsp140049.html

WhatareRESTfulWebServices?
https://docs.oracle.com/javaee/6/tutorial/doc/gijqy.html


MadsonAguiarRodrigues

FormaoacadmicaemAnliseeDesenvolvimentodeSistemaspelaUNOPAR,psgraduaoemEngenhariadeSistemaspela
ESABeespecialistaemTecnologiasparaaplicaesWebpelaUNOPAR.Trabalhacomdesenvolvimentodesoftwareh[...]

Publicadoem1899

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=33273 30/30