Post on 24-Jan-2016
description
TREINAMENTOS
Desenvolvimento Webcom JSF2 e JPA2
Desenvolvimento Web com JSF 2.2 e JPA 2.1
22 de agosto de 2015As apostilas atualizadas esto disponveis em www.k19.com.br
Esta apostila contm:
270 exerccios de fixao.
32 exerccios complementares.
2 desafios.
0 questes de prova.
Sumrio i
Sobre a K19 1
Seguro Treinamento 2
Termo de Uso 3
Cursos 4
1 Banco de dados 11.1 Sistemas Gerenciadores de Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 MySQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3 Bases de dados (Databases) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.4 Criando uma base de dados no MySQL Server . . . . . . . . . . . . . . . . . . . . . . . . 21.5 Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.6 Criando tabelas no MySQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.7 CRUD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.8 Chaves Primria e Estrangeira . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.10 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2 JDBC 272.1 Driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.2 JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
www.facebook.com/k19treinamentos i
SUMRIO ii
2.3 Instalando o Driver JDBC do MySQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . 302.4 Criando uma conexo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.5 Inserindo registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.7 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332.8 SQL Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342.10 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352.11 Listando registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362.12 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372.13 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372.14 Connection Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382.15 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382.16 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402.17 Desafios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3 JPA 2.1 e Hibernate 413.1 Mltiplas sintaxes da linguagem SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413.2 Orientao a Objetos VS Modelo Relacional . . . . . . . . . . . . . . . . . . . . . . . . . . 413.3 Ferramentas ORM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423.4 O que JPA e Hibernate? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433.5 Bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433.6 Configurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443.7 Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443.8 Gerando Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463.10 Manipulando entidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513.11 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533.12 Repository . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553.13 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4 Web Container 594.1 Necessidades de uma aplicao web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594.2 Web Container . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604.3 Servlet e Java EE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614.5 Aplicao Web Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764.7 Processando requisies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784.8 Servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794.10 Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5 Viso Geral do JSF 2.2 835.1 MVC e Front Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835.2 Configurando uma aplicao JSF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835.3 Managed Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845.4 Processamento de uma requisio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885.5 Exemplo Prtico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
ii www.k19.com.br
iii SUMRIO
6 Componentes Visuais 996.1 Estrutura Bsica de uma Pgina JSF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 996.2 Formulrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006.3 Caixas de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006.4 Campos Ocultos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036.5 Caixas de Seleo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036.6 Botes e Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106.7 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1126.8 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1156.9 Textos e Imagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1166.10 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1176.11 Componentes de Organizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1186.12 Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1206.13 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1226.14 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1256.15 Mensagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1256.16 Adicionando JavaScript e CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1266.17 Outros Componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1266.18 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1276.19 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
7 Templates e Modularizao 1317.1 Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1317.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1347.3 Modularizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1357.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1377.5 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
8 Navegao 1418.1 Navegao Implcita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1418.2 Navegao Explcita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1438.3 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1448.4 Navegaes Esttica e Dinmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1488.5 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1498.6 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
9 Escopos 1539.1 Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1539.2 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1549.3 Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1559.4 Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1579.5 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
10 Converso e Validao 16310.1 Converso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16310.2 Conversores Padro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16310.3 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16510.4 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16710.5 Mensagens de Erro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16710.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
www.facebook.com/k19treinamentos iii
SUMRIO iv
10.7 Validao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17110.8 Validadores Padro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17110.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17210.10 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17410.11 Bean Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17410.12 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17710.13 Criando o seu Prprio Conversor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17810.14 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18010.15 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18210.16 Criando o seu Prprio Validador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18310.17 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18510.18 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18710.19 Criando o seu Prprio Bean Validator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18710.20 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
11 Eventos 19311.1 FacesEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19311.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19611.3 PhaseEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19811.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19911.5 SystemEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20011.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20211.7 Immediate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20311.8 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
12 Ajax 20912.1 Fazendo requisies AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20912.2 Processando uma parte especfica da tela . . . . . . . . . . . . . . . . . . . . . . . . . . . 21012.3 Recarregando parte da tela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21112.4 Associando um procedimento a uma requisio AJAX . . . . . . . . . . . . . . . . . . . . 21112.5 Palavras especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21112.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
13 Integrao JSF e JPA 21513.1 Bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21513.2 Configurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21513.3 Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21613.4 Inicializao e Finalizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21613.5 Transaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21713.6 Recuperando o EntityManager da Requisio . . . . . . . . . . . . . . . . . . . . . . . . . 21813.7 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21913.8 Otimizando o nmero de consultas ao SGDB . . . . . . . . . . . . . . . . . . . . . . . . . 22413.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
A Autenticao 229A.1 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
B Pginas de Erro 235B.1 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
iv www.k19.com.br
v SUMRIO
C PrimeFaces 239C.1 Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239C.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239C.3 AutoComplete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241C.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241C.5 Poll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242C.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242C.7 Calendar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244C.8 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244C.9 InputMask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245C.10 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246C.11 DataTable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246C.12 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246C.13 DataExporter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250C.14 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250C.15 PickList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252C.16 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252C.17 MegaMenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254C.18 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254C.19 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254C.20 Chart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257C.21 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
D Projeto Futebol K19 261D.1 Integrao JSF e JPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261D.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261D.3 Modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263D.4 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263D.5 Managed Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266D.6 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266D.7 Telas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268D.8 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268D.9 Autenticao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
E Respostas 279
www.facebook.com/k19treinamentos v
SUMRIO vi
vi www.k19.com.br
1 SUMRIO
Sobre a K19
A K19 uma empresa especializada na capacitao de desenvolvedores de software. Sua equipe composta por profissionais formados em Cincia da Computao pela Universidade de So Paulo(USP) e que possuem vasta experincia em treinamento de profissionais para rea de TI.
O principal objetivo da K19 oferecer treinamentos de mxima qualidade e relacionados s prin-cipais tecnologias utilizadas pelas empresas. Atravs desses treinamentos, seus alunos tornam-secapacitados para atuar no mercado de trabalho.
Visando a mxima qualidade, a K19 mantm as suas apostilas em constante renovao e melho-ria, oferece instalaes fsicas apropriadas para o ensino e seus instrutores esto sempre atualizadosdidtica e tecnicamente.
www.facebook.com/k19treinamentos 1
SUMRIO 2
Seguro Treinamento
Na K19 o aluno faz o curso quantas vezes quiser!
Comprometida com o aprendizado e com a satisfao dos seus alunos, a K19 a nica que pos-sui o Seguro Treinamento. Ao contratar um curso, o aluno poder refaz-lo quantas vezes desejarmediante a disponibilidade de vagas e pagamento da franquia do Seguro Treinamento.
As vagas no preenchidas at um dia antes do incio de uma turma da K19 sero destinadas aoalunos que desejam utilizar o Seguro Treinamento. O valor da franquia para utilizar o Seguro Treina-mento 10% do valor total do curso.
2 www.k19.com.br
3 SUMRIO
Termo de UsoTermo de Uso
Todo o contedo desta apostila propriedade da K19 Treinamentos. A apostila pode ser utilizadalivremente para estudo pessoal . Alm disso, este material didtico pode ser utilizado como materialde apoio em cursos de ensino superior desde que a instituio correspondente seja reconhecida peloMEC (Ministrio da Educao) e que a K19 seja citada explicitamente como proprietria do material.
proibida qualquer utilizao desse material que no se enquadre nas condies acima semo prvio consentimento formal, por escrito, da K19 Treinamentos. O uso indevido est sujeito smedidas legais cabveis.
www.facebook.com/k19treinamentos 3
SUMRIO 4
K01- Lgica de Programao
K11 - Orientao a Objetos em Java
K12 - Desenvolvimento Web com JSF2 e JPA2
K21 - Persistncia com JPA2 e Hibernate
K22 - Desenvolvimento Web Avanado com JFS2, EJB3.1 e CDI
K23 - Integrao de Sistemas com Webservices, JMS e EJB
K31 - C# e Orientao a Objetos
K32 - Desenvolvimento Web com ASP.NET MVC
TREINA
MENT
OS
TREINAMENTOSTREINAMENTOS Conhea os nossos cursos
www.k19.com.br/cursos
K02 - Desenvolvimento Web com HTML, CSS e JavaScript
K03 - SQL e Modelo Relacional
K41 - Desenvolvimento Mobile com Android
K51 - Design Patterns em Java
K52 - Desenvolvimento Web com Struts
4 www.k19.com.br
BANCO DE DADOS
CA
P
TU
LO
1Em geral, as aplicaes necessitam armazenar dados de forma persistente para consult-los pos-
teriormente. Por exemplo, a aplicao de uma livraria precisa armazenar os dados dos livros e dosautores de forma persistente.
Suponha que esses dados sejam armazenados em arquivos do sistema operacional. Vrios fato-res importantes nos levam a descartar tal opo. A seguir, apresentamos as principais dificuldades aserem consideradas na persistncia de dados.
Segurana: O acesso s informaes potencialmente confidenciais deve ser controlado de formaque apenas usurios e sistemas autorizados possam manipul-las.
Integridade: Restries relacionadas aos dados armazenados devem ser respeitadas para que as in-formaes estejam sempre consistentes.
Consulta: O tempo gasto para realizar as consultas aos dados armazenados deve ser o menor poss-vel.
Concorrncia: Em geral, diversos sistemas e usurios acessaro concorrentemente as informaesarmazenadas. Apesar disso, a integridade dos dados deve ser preservada.
Considerando todos esses aspectos, conclumos que um sistema complexo seria necessrio parapersistir as informaes de uma aplicao de maneira adequada. Felizmente, tal tipo de sistema jexiste e conhecido como Sistema Gerenciador de Banco de Dados (SGBD).
Figura 1.1: Sistema Gerenciador de Banco de Dados
Sistemas Gerenciadores de Banco de Dados
No mercado, h diversas opes de sistemas gerenciadores de banco de dados. Os mais popula-res so:
Oracle Database
www.facebook.com/k19treinamentos 1
BANCO DE DADOS 2
SQL Server
MySQL Server
PostgreSQL
MySQL Server
Neste treinamento, utilizaremos o MySQL Server, que mantido pela Oracle e amplamente utili-zado em aplicaes comerciais. Para instalar o MySQL Server, voc pode utilizar o artigo disponvelem nosso site: http://www.k19.com.br/artigos/instalando-mysql/
Bases de dados (Databases)
Um sistema gerenciador de banco de dados capaz de gerenciar informaes de diversos siste-mas ao mesmo tempo. Por exemplo, as informaes dos clientes de um banco, alm dos produtosde uma loja virtual ou dos livros de uma livraria.
Suponha que os dados fossem mantidos sem nenhuma separao lgica. Implementar regrasde segurana especficas seria extremamente complexo. Tais regras criam restries quanto ao con-tedo que pode ser acessado por cada usurio. Por exemplo, determinado usurio poderia ter per-misso de acesso aos dados dos clientes do banco, mas no s informaes dos produtos da lojavirtual, ou dos livros da livraria.
Para obter uma organizao melhor, os dados so armazenados separadamente em um SGDB.Da surge o conceito de base de dados (database). Uma base de dados um agrupamento lgico dasinformaes de um determinado domnio.
Criando uma base de dados no MySQL Server
Para criar uma base de dados no MySQL Server, podemos utilizar o comando CREATE DATA-BASE.
mysql > CREATE DATABASE livraria;Query OK, 1 row affected (0.02 sec)
Terminal 1.1: Criando uma base de dados.
Podemos utilizar o comando SHOW DATABASES para listar as bases de dados existentes.
mysql > show databases;+--------------------+| Database |+--------------------+| information_schema || livraria || mysql || test |+--------------------+4 rows in set (0.03 sec)
Terminal 1.2: Listando as bases de dados existentes.
2 www.k19.com.br
3 BANCO DE DADOS
Repare que, alm da base de dados livraria, h outras trs bases. Essas bases foram criadas au-tomaticamente pelo prprio MySQL Server para teste ou para armazenar configuraes.
Quando uma base de dados no mais necessria, ela pode ser removida atravs do comandoDROP DATABASE.
mysql > DROP DATABASE livraria;Query OK, 0 rows affected (0.08 sec)
Terminal 1.3: Destruindo uma base de dados.
Tabelas
Um servidor de banco de dados dividido em bases de dados com o intuito de separar as infor-maes de domnios diferentes. Nessa mesma linha de raciocnio, podemos dividir os dados de umabase a fim de agrup-los segundo as suas correlaes. Essa separao feita atravs de tabelas. Porexemplo, no sistema de um banco, interessante separar o saldo e o limite de uma conta, do nome eCPF de um cliente. Ento, poderamos criar uma tabela para os dados relacionados s contas e outrapara os dados relacionados aos clientes.
Clientenome idade cpfJos 27 31875638735Maria 32 30045667856
Contanumero saldo limite1 1000 5002 2000 700
Tabela 1.1: Tabelas para armazenar os dados relacionados aos clientes e s contas
Uma tabela formada por registros (linhas) e os registros so formados por campos (colunas).Por exemplo, considere uma tabela para armazenar as informaes dos clientes de um banco. Cadaregistro dessa tabela armazena em seus campos os dados de um determinado cliente.
Criando tabelas no MySQL Server
As tabelas no MySQL Server so criadas atravs do comando CREATE TABLE. Na criao de umatabela, necessrio definir quais so os nomes e os tipos das colunas.
mysql > CREATE TABLE livraria .Livro (-> titulo VARCHAR (255),-> preco DOUBLE-> )-> ENGINE=MyISAM;
Query OK, 0 rows affected (0.14 sec)
Terminal 1.4: Criando uma tabela.
As tabelas de uma base de dados podem ser listadas atravs do comando SHOW TABLES. Antesde utilizar esse comando, devemos selecionar uma base de dados atravs do comando USE.
mysql > USE livraria;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -A
Database changedmysql > SHOW TABLES;
www.facebook.com/k19treinamentos 3
BANCO DE DADOS 4
+--------------------+| Tables_in_livraria |+--------------------+| Livro |+--------------------+1 row in set (0.00 sec)
Terminal 1.5: Listando as tabelas de uma base de dados.
Se uma tabela no for mais desejada, ela pode ser removida atravs do comando DROP TABLE.
mysql > DROP TABLE Livro;Query OK, 0 rows affected (0.00 sec)
Terminal 1.6: Destruindo uma tabela.
CRUD
As operaes bsicas para manipular os dados persistidos so: inserir, ler, alterar e remover.
Essas operaes so realizadas atravs de uma linguagem de consulta denominada SQL (Structu-red Query Language). Essa linguagem oferece quatro comandos bsicos: INSERT, SELECT, UPDATEe DELETE. Esses comandos so utilizados para inserir, ler, alterar e remover registros, respectiva-mente.
mysql > INSERT INTO Livro (titulo , preco) VALUES (Java , 98.75);Query OK, 1 row affected (0.00 sec)
Terminal 1.7: Inserindo um registro.
mysql > SELECT * FROM Livro;+--------+-------+| titulo | preco |+--------+-------+| Java | 98.75 |+--------+-------+1 row in set (0.00 sec)
Terminal 1.8: Selecionando registros.
mysql > UPDATE Livro SET preco = 115.9 WHERE titulo = Java ;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0
Terminal 1.9: Alterando registros.
mysql > SELECT * FROM Livro;+--------+-------+| titulo | preco |+--------+-------+| Java | 115.9 |+--------+-------+1 row in set (0.00 sec)
Terminal 1.10: Selecionando registros.
mysql > DELETE FROM Livro WHERE titulo = Java ;Query OK, 1 row affected (0.00 sec)
Terminal 1.11: Removendo registros.
4 www.k19.com.br
5 BANCO DE DADOS
mysql > SELECT * FROM Livro;Empty set (0.00 sec)
Terminal 1.12: Selecionando registros.
Chaves Primria e Estrangeira
Suponha que os livros da nossa livraria sejam classificados por editoras. As editoras possuemnome e telefone. Para armazenar esses dados, uma nova tabela deveria ser criada.
Nesse momento, teramos duas tabelas (Livro e Editora). Constantemente, a aplicao da livrariadever descobrir qual a editora de um determinado livro ou quais so os livros de uma determinadaeditora. Para isso, os registros da tabela Editora devem estar relacionados aos da tabela Livro.
Na tabela Livro, poderamos adicionar uma coluna para armazenar o nome da editora dos livros.Dessa forma, se algum quiser recuperar as informaes da editora de um determinado livro, deveconsultar a tabela Livro para obter o nome da editora correspondente. Depois, com esse nome, deveconsultar a tabela Editora para obter as informaes da editora.
Porm, h um problema nessa abordagem. A tabela Editora aceita duas editoras com o mesmonome. Dessa forma, eventualmente, no conseguiramos descobrir os dados corretos da editora deum determinado livro. Para resolver esse problema, deveramos criar uma restrio na tabela Editoraque proba a insero de editoras com o mesmo nome.
Para resolver esse problema no MySQL Server, poderamos adicionar a propriedade UNIQUE nocampo nome da tabela Editora. Porm, ainda teramos mais um problema. Na tabela Livro, pode-ramos adicionar registros vinculados a editoras inexistentes, pois no h nenhuma relao explcitaentre as tabelas. Para solucionar esses problemas, devemos utilizar o conceito de chave primria echave estrangeira.
Toda tabela pode ter uma chave primria, que um conjunto de um ou mais campos que de-vem ser nicos para cada registro. Normalmente, um campo numrico escolhido para ser a chaveprimria de uma tabela, pois as consultas podem ser realizadas com melhor desempenho.
Ento, poderamos adicionar um campo numrico na tabela Editora e torn-lo chave primria.Vamos chamar esse campo de id. Na tabela Livro, podemos adicionar um campo numrico chamadoeditora_id que deve ser utilizado para guardar o valor da chave primria da editora correspondenteao livro. Alm disso, o campo editora_id deve estar explicitamente vinculado com o campo id databela Editora. Para estabelecer esse vnculo, o campo editora_id da tabela Livro deve ser uma chaveestrangeira associada chave primria da tabela Editora.
Uma chave estrangeira um conjunto de uma ou mais colunas de uma tabela que possuem va-lores iguais aos da chave primria de outra tabela.
Com a definio da chave estrangeira, um livro no pode ser inserido com o valor do campoeditora_id invlido. Caso tentssemos fazer isso, obteramos uma mensagem de erro.
Exerccios de Fixao
www.facebook.com/k19treinamentos 5
BANCO DE DADOS 6
1 Abra um terminal, crie e acesse uma pasta com o seu nome.
cosen@k19 :~$ mkdir rafaelcosen@k19 :~$ cd rafael/cosen@k19 :~/ rafael$
Terminal 1.13: Criando e acessando uma pasta com o seu nome.
2 Estando dentro da sua pasta, acesse o MySQL Server utilizando o usurio root e a senha root.
k19@k19 -11:~/ rafael$ mysql -u root -pEnter password:
Terminal 1.14: Logando no MySQL Server.
3 Caso exista uma base de dados chamada livraria, remova-a. Utilize o comando SHOW DATA-BASES para listar as bases de dados existentes e o comando DROP DATABASE para remover a baselivraria se ela existir.
mysql > SHOW DATABASES;+--------------------+| Database |+--------------------+| information_schema || livraria || mysql || test |+--------------------+4 rows in set (0.00 sec)
mysql > DROP DATABASE livraria;Query OK, 1 row affected (0.12 sec)
Terminal 1.15: Listando as bases de dados existentes e removendo a base livraria.
4 Crie uma nova base de dados chamada livraria. Utilize o comando CREATE DATABASE. Vocvai utilizar esta base nos exerccios seguintes.
mysql > CREATE DATABASE livraria;Query OK, 1 row affected (0.00 sec)
Terminal 1.16: Criando a base livraria.
5 Abra um editor de texto e digite o cdigo abaixo para criar uma tabela com o nome Editora.Depois salve o arquivo com o nome create-table-editora.sql dentro da pasta com o seu nome.
1 USE livraria;2 CREATE TABLE Editora (3 id BIGINT NOT NULL AUTO_INCREMENT ,4 nome VARCHAR (255) NOT NULL ,5 email VARCHAR (255) NOT NULL ,6 PRIMARY KEY (id)7 )8 ENGINE = InnoDB;
Cdigo SQL 1.1: Criando a tabela Editora
6 www.k19.com.br
7 BANCO DE DADOS
6 Dentro do terminal, use o comando source para executar o arquivo que voc acabou de criar.
mysql > source create -table -editora.sqlDatabase changedQuery OK, 0 rows affected (0.08 sec)
Terminal 1.17: Executando a tabela Editora.
7 Abra um novo editor de texto e digite o cdigo abaixo para criar uma tabela com o nome Livro.Em seguida, salve o arquivo com o nome create-table-livro.sqldentro da pasta com o seu nome.
1 USE livraria;2 CREATE TABLE Livro (3 id BIGINT NOT NULL AUTO_INCREMENT ,4 titulo VARCHAR (255) NOT NULL ,5 preco DOUBLE NOT NULL ,6 editora_id BIGINT NOT NULL ,7 PRIMARY KEY(id),8 CONSTRAINT fk_editora FOREIGN KEY fk_editora(editora_id)9 REFERENCES Editora(id)10 ON DELETE RESTRICT11 ON UPDATE RESTRICT12 )13 ENGINE = InnoDB;
Cdigo SQL 1.2: Criando a tabela Livro
8 Dentro do terminal, use o comando sourcepara executar o cdigo do arquivo create-table-li-vro.sql.
mysql > source create -table -livro.sqlDatabase changedQuery OK, 0 rows affected (0.08 sec)
Terminal 1.18: Executando a tabela Livro.
9 Abra um novo editor de texto e digite o cdigo abaixo para adicionar alguns registros na tabelaEditora. Depois salve o arquivo com o nome adicionando-registros-editora.sqldentro da pastacom o seu nome.
1 INSERT INTO Editora (nome , email) VALUES (Oreilly , oreilly@email.com);23 INSERT INTO Editora (nome , email) VALUES (Wrox, wrox@email.com);45 INSERT INTO Editora (nome , email) VALUES (Apress , apress@email.com);
Cdigo SQL 1.3: Adicionando registros na tabela Editora
10 Dentro do terminal, execute o arquivo que voc acabou de criar para adicionar alguns registrona tabela Editora.
mysql > source adicionando -registros -editora.sqlQuery OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.04 sec)
Query OK, 1 row affected (0.04 sec)
www.facebook.com/k19treinamentos 7
BANCO DE DADOS 8
Terminal 1.19: Inserindo editoras.
11 Abra um novo editor de texto e digite o cdigo abaixo para adicionar alguns registros na tabelaLivro. Depois salve o arquivo com o nome adicionando-registros-livro.sql dentro da pastacom o seu nome.
1 INSERT INTO Livro (titulo , preco , editora_id) VALUES (Aprendendo C#, 89.90, 1);23 INSERT INTO Livro (titulo , preco , editora_id) VALUES (Introduo ao JSF 2,4 122.90 , 3);56 INSERT INTO Livro (titulo , preco , editora_id) VALUES (JSF 2 Avanado , 149.90 , 3);
Cdigo SQL 1.4: Adicionando alguns registros na tabela Livro
12 Dentro do terminal, execute o arquivo que voc acabou de criar para adicionar alguns registrosna Livro.
mysql > source adicionando -registros -livro.sqlQuery OK, 1 row affected (0.02 sec)
Query OK, 1 row affected (0.04 sec)
Query OK, 1 row affected (0.04 sec)
Terminal 1.20: Inserindo livros.
13 Consulte os registros da tabela Editora e da tabela Livro. Utilize o comando SELECT.
mysql > SELECT * FROM Editora;+----+---------+-------------------+| id | nome | email |+----+---------+-------------------+| 1 | Oreilly | oreilly@email.com || 2 | Wrox | wrox@email.com || 3 | Apress | apress@email.com |+----+---------+-------------------+3 rows in set (0.00 sec)
Terminal 1.21: Selecionando as editoras.
mysql > SELECT * FROM Livro;+----+-----------------------+-------+------------+| id | titulo | preco | editora_id |+----+-----------------------+-------+------------+| 1 | Aprendendo C# | 89.9 | 1 || 2 | Introduo ao JSF 2 | 122.9 | 3 || 3 | JSF 2 Avanado | 149.9 | 3 |+----+-----------------------+-------+------------+3 rows in set (0.00 sec)
Terminal 1.22: Selecionando os livros.
14 Altere alguns dos registros da tabela Livro. Utilize o comando UPDATE.
mysql > UPDATE Livro SET preco =92.9 WHERE id=1;Query OK, 1 row affected (0.07 sec)Rows matched: 1 Changed: 1 Warnings: 0
8 www.k19.com.br
9 BANCO DE DADOS
Terminal 1.23: Alterando livros.
15 Altere alguns dos registros da tabela Editora. Utilize o comando UPDATE.
mysql > UPDATE Editora SET nome=OReilly WHERE id=1;Query OK, 1 row affected (0.09 sec)Rows matched: 1 Changed: 1 Warnings: 0
Terminal 1.24: Alterando editoras.
16 Remova alguns registros da tabela Livro. Utilize o comando DELETE.
mysql > DELETE FROM Livro WHERE id=2;Query OK, 1 row affected (0.07 sec)
Terminal 1.25: Removendo livros.
17 Remova alguns registros da tabela Editora. Preste ateno para no remover uma editora quetenha algum livro relacionado j adicionado no banco. Utilize o comando DELETE.
mysql > DELETE FROM Editora WHERE id=2;Query OK, 1 row affected (0.05 sec)
Terminal 1.26: Removendo editoras.
18 Faa uma consulta para buscar todos os livros de uma determinada editora.
mysql > SELECT * FROM Livro as L, Editora as E WHERE L.editora_id=E.id and E.id = 1;+----+---------------+-------+------------+----+---------+-------------------+| id | titulo | preco | editora_id | id | nome | email |+----+---------------+-------+------------+----+---------+-------------------+| 1 | Aprendendo C# | 92.9 | 1 | 1 | OReilly | oreilly@email.com |+----+---------------+-------+------------+----+---------+-------------------+1 row in set (0.00 sec)
Terminal 1.27: Selecionando os livros de uma editora.
Exerccios Complementares
Utilize o MySQL Workbench para refazer os exerccios anteriores.
1 Abra o MySQL Workbench utilizando localhost como Server Hostname, root como Username eroot como Password.
www.facebook.com/k19treinamentos 9
BANCO DE DADOS 10
10 www.k19.com.br
11 BANCO DE DADOS
2 Caso exista uma base de dados chamada livraria, remova-a conforme a figura abaixo.
www.facebook.com/k19treinamentos 11
BANCO DE DADOS 12
3 Crie uma nova base de dados chamada livraria, conforme mostrado na figura abaixo. Voc vaiutilizar esta base nos exerccios seguintes.
12 www.k19.com.br
13 BANCO DE DADOS
www.facebook.com/k19treinamentos 13
BANCO DE DADOS 14
14 www.k19.com.br
15 BANCO DE DADOS
4 Selecione a base de dados livraria como padro.
5 Crie uma tabela chamada Editora conforme as figuras abaixo.
www.facebook.com/k19treinamentos 15
BANCO DE DADOS 16
16 www.k19.com.br
17 BANCO DE DADOS
www.facebook.com/k19treinamentos 17
BANCO DE DADOS 18
6 Crie uma tabela chamada Livro conforme as figuras abaixo.
18 www.k19.com.br
19 BANCO DE DADOS
www.facebook.com/k19treinamentos 19
BANCO DE DADOS 20
20 www.k19.com.br
21 BANCO DE DADOS
7 Adicione alguns registros na tabela Editora. Veja exemplos na figura abaixo.
8 Adicione alguns registros na tabela Livro. Veja exemplos na figura abaixo.
9 Consulte os registros da tabela Editora e, em seguida, consulte a tabela Livro. Veja exemplos logo
www.facebook.com/k19treinamentos 21
BANCO DE DADOS 22
abaixo.
10 Altere alguns dos registros da tabela Livro. Veja o exemplo abaixo.
22 www.k19.com.br
23 BANCO DE DADOS
11 Altere alguns dos registros da tabela Editora. Veja o exemplo abaixo.
12 Remova alguns registros da tabela Livro. Veja o exemplo abaixo.
www.facebook.com/k19treinamentos 23
BANCO DE DADOS 24
13 Remova alguns registros da tabela Editora. Preste ateno para no remover uma editora quetenha algum livro relacionado j adicionado no banco. Veja o exemplo abaixo:
14 Faa uma consulta para buscar todos os livros associados as suas respectivas editoras. Veja umexemplo na figura abaixo.
24 www.k19.com.br
25 BANCO DE DADOS
www.facebook.com/k19treinamentos 25
BANCO DE DADOS 26
26 www.k19.com.br
JDBC
CA
P
TU
LO
2No captulo anterior, aprendemos que utilizar bancos de dados uma tima alternativa para
armazenar os dados de uma aplicao. Entretanto, voc deve ter percebido que as interfaces dis-ponveis para interagir com o MySQL Server no podem ser utilizadas por qualquer pessoa. Parautiliz-las, necessrio conhecer a linguagem SQL e os conceitos do modelo relacional. Em geral, asinterfaces dos outros SGDBs exigem os mesmos conhecimentos.
SELECT * FROM tbl_funcionarios WHEREnome LIKE %jonas%;
INSERT INTO tbl_funcionarios (nome, codigo, salario) VALUES (Rafael, 1234,1000);
Figura 2.1: Usurios comuns no possuem conhecimento sobre SQL ou sobre o modelo relacional
Para resolver esse problema, podemos desenvolver aplicaes com interfaces que no exijam co-nhecimentos tcnicos de SQL ou do modelo relacional para serem utilizadas. Dessa forma, usurioscomuns poderiam manipular as informaes do banco de dados atravs dessas aplicaes. Nessaabordagem, os usurios interagem com as aplicaes e as aplicaes interagem com os SGDBs.
www.k19.com.br
Cadastro de Funcionrios
Nome:
Cdigo:
Salrio:
Figura 2.2: Usurios comuns devem utilizar interfaces simples
www.facebook.com/k19treinamentos 27
JDBC 28
Driver
As aplicaes interagem com os SGDBs atravs de troca de mensagens. Os SGDBs definem oformato das mensagens. Para no sobrecarregar o canal de comunicao entre as aplicaes e osSGDBs, as mensagens trocadas devem ocupar o menor espao possvel. Geralmente, protocolosbinrios so mais apropriados para reduzir o tamanho das mensagens e consequentemente diminuira carga do canal de comunicao. Por isso, os SGDBs utilizam protocolos binrios.
getTransactionbegin
commit
rollback
persistgetReference
nd
1011011100010010
Figura 2.3: Diminuindo o tamanho das mensagens para no sobrecarregar o meio de comunicao
Mensagens binrias so facilmente interpretadas por computadores. Por outro lado, so com-plexas para um ser humano compreender. Dessa forma, o trabalho dos desenvolvedores seria muitocomplexo, aumentando o custo para o desenvolvimento e manuteno das aplicaes.
1011010111001011000110101111010111011100010110100111010111010010110011 1011010111
0010110001
1010111101
0111011100
0101101001
1101011101
0010110011
1011010111
0010110001
1010111101
0111011100
0101101001
1101011101
0010110011
Figura 2.4: Mensagens binrias so altamente complexas para os seres humanos
28 www.k19.com.br
29 JDBC
Para resolver esse problema e facilitar o desenvolvimento das aplicaes, as empresas propriet-rias dos SGDBs, normalmente, desenvolvem e distribuem drivers de conexo. Um driver de conexoatua como um intermedirio entre as aplicaes e os SGDBs.
Os drivers de conexo so tradutores de comandos escritos em uma determinada linguagemde programao para comandos definidos de acordo com o protocolo de um SGDB. Utilizando umdriver de conexo, os desenvolvedores das aplicaes no manipulam diretamente as mensagensbinrias trocadas entre as aplicaes e os SGDBs.
Mais SobreEm alguns casos, o protocolo binrio de um determinado SGDB fechado. Consequen-temente, a nica maneira de se comunicar com ele atravs de um driver de conexo
oferecido pelo fabricante desse SGDB.
JDBC
Suponha que os drivers de conexo fossem desenvolvidos sem nenhum padro. Cada driver teriasua prpria interface, ou seja, seu prprio conjunto de instrues. Consequentemente, os desenvol-vedores teriam de conhecer a interface de cada um dos drivers dos respectivos SGDBs que fossemutilizar.
createConnection() 01110010101110011
Driv
er M
ySQ
L
openConnection() 00010011101110010
Driv
er O
racl
e
Figura 2.5: Drivers de conexo sem padronizao
Para facilitar o trabalho do desenvolvedor da aplicao, a plataforma Java possui uma especifica-o que padroniza os drivers de conexo. A sigla dessa especificao JDBC (Java Database Connec-tivity). Em geral, as empresas proprietrias dos SGBDs desenvolvem e distribuem drivers de conexoque seguem a especificao JDBC.
www.facebook.com/k19treinamentos 29
JDBC 30
getConnection() 01110010101110011
Driv
er M
ySQ
LJD
BCD
river
Ora
cle
JDBC
getConnection() 00010011101110010
Figura 2.6: Drivers de conexo padronizados pela especificao JDBC
Instalando o Driver JDBC do MySQL Server
Podemos obter um driver de conexo JDBC para o MySQL Server na seguinte url:
http://www.mysql.com/downloads/connector/j/.
A instalao desse driver consiste em descompactar o arquivo obtido no site acima e depois in-cluir o arquivo jar com o driver no class path da aplicao.
Criando uma conexo
Com o driver de conexo JDBC adicionado aplicao, j possvel criar uma conexo. Abaixo,esto as informaes necessrias para a criao de uma conexo JDBC.
Nome do driver JDBC.
Endereo (IP e porta) do SGDB.
Nome da base de dados.
Um usurio do SGBD.
Senha do usurio.
O nome do driver JDBC, o endereo do SGDB e nome da base de dados so definidos na stringde conexo ou url de conexo. Veja o exemplo abaixo:
1 String stringDeConexao = "jdbc:mysql :// localhost/livraria";
Cdigo Java 2.1: String de conexo
30 www.k19.com.br
31 JDBC
A classe responsvel pela criao de uma conexo JDBC a DriverManager do pacote java.sql.A string de conexo, o usurio e a senha devem ser passados ao mtodo esttico getConnection()da classe DriverManager para que ela possa criar uma conexo JDBC.
1 String urlDeConexao = "jdbc:mysql :// localhost/livraria";2 String usuario = "root";3 String senha = "";4 try {5 Connection conexao = DriverManager.getConnection(urlDeConexao , usuario , senha);6 } catch (SQLException e) {7 e.printStackTrace ();8 }
Cdigo Java 2.2: Criando uma conexo JDBC
Inserindo registros
Aps estabelecer uma conexo JDBC, podemos executar operaes. A primeira operao querealizaremos a insero de registros em uma tabela. O primeiro passo para executar essa operao definir o cdigo SQL correspondente.
1 String sql = "INSERT INTO Editora (nome , email) VALUES (K19 ,contato@k19.com.br );"-;
Cdigo Java 2.3: Cdigo SQL correspondente operao de insero
O cdigo SQL correspondente operao que desejamos executar deve ser passado como pa-rmetro para o mtodo prepareStatement() de uma conexo JDBC. Esse mtodo criar um objetoque representa a operao que ser executada. A operao poder ser executada posteriormenteatravs do mtodo execute().
1 // criando um prepared statement2 PreparedStatement comando = conexao.prepareStatement(sql);34 // executando o prepared statement5 comando.execute ();6 comando.close();
Cdigo Java 2.4: Criando um prepared statement
ImportanteA mesma conexo pode ser reaproveitada para executar vrias operaes. Quando nohouver mais operaes a serem executadas, devemos finalizar a conexo JDBC atravs
do mtodo close(). Finalizar as conexes JDBC que no so mais necessrias importantepois libera recursos no SGBD.
1 conexao.close();
Cdigo Java 2.5: Finalizando uma conexo JDBC
Exerccios de Fixao
www.facebook.com/k19treinamentos 31
JDBC 32
1 Crie um projeto chamado JDBC. Esse projeto deve ser do tipo Java Project.
2 Acrescente uma pasta chamada lib no projeto JDBC. Copie o arquivo mysql-connector-java-VERSAO-bin.jar da pasta K19-Arquivos/mysql-connector-java-VERSAO para a pasta lib do projetoJDBC. Observao: o termo VERSAO deve ser substitudo pelo nmero da verso utilizada.
ImportanteVoc tambm pode obter o arquivo mysql-connector-java-VERSAO-bin.jar atravsdo site da K19: www.k19.com.br/arquivos.
3 Adicione o arquivo mysql-connector-java-VERSAO-bin.jar ao build path do projeto JDBC. Vejaa imagem abaixo.
4 Crie uma classe chamada InsereEditora em um pacote chamado br.com.k19.jdbc no projetoJDBC com o seguinte contedo.
1 package br.com.k19.jdbc;23 import java.sql.Connection;4 import java.sql.DriverManager;5 import java.sql.PreparedStatement;
32 www.k19.com.br
33 JDBC
6 import java.util.Scanner;78 public class InsereEditora {9 public static void main(String [] args) {10 String stringDeConexao = "jdbc:mysql :// localhost :3306/ livraria";11 String usuario = "root";12 String senha = "root";1314 try {15 System.out.println("Abrindo conexo ...");16 Connection conexao =17 DriverManager.getConnection(stringDeConexao , usuario , senha);1819 Scanner entrada = new Scanner(System.in);2021 System.out.println("Digite o nome da editora: ");22 String nome = entrada.nextLine ();2324 System.out.println("Digite o email da editora: ");25 String email = entrada.nextLine ();2627 entrada.close();2829 String sql = "INSERT INTO Editora (nome , email) " +30 "VALUES (" + nome + ", " + email + ")";3132 PreparedStatement comando = conexao.prepareStatement(sql);3334 System.out.println("Executando comando ...");35 comando.execute ();3637 System.out.println("Fechando conexo ...");38 conexao.close();39 } catch (Exception e) {40 e.printStackTrace ();41 }42 }43 }
Cdigo Java 2.6: InsereEditora.java
Execute a classe InsereEditora e verifique se o registro foi inserido com sucesso na base de dados.
Exerccios Complementares
1 Crie uma classe chamada InsereLivro para cadastrar livros na base de dados.
SQL Injection
A implementao da insero de registros feita anteriormente possui uma falha grave. Os dadosobtidos do usurio atravs do teclado no so tratados antes de serem enviados para o SGDB.
Esses dados podem conter caracteres especiais. Se esses caracteres no so tratados, o compor-tamento esperado da operao afetado. Eventualmente, registros no so inseridos como deveriamou brechas de segurana podem se abrir.
Por exemplo, considere a classe InsereEditora do exerccio de fixao. Se o usurio digitar
www.facebook.com/k19treinamentos 33
JDBC 34
OReilly e oreilly@email.com, o cdigo SQL gerado pela aplicao seria:
1 INSERT INTO Editora (nome , email) VALUES (OReilly , oreilly@email.com)
Observe que o caractere aspas simples aparece cinco vezes no cdigo SQL acima. O SGDB nosaberia dizer onde de fato termina o nome da editora. Ao tentar executar esse cdigo, um erro desintaxe lanado pelo MySQL Server. Para resolver esse problema manualmente, devemos adicionaro caractere \ antes do caractere aspas simples que faz parte do nome da editora. Na sintaxe doMySQL Server, o caractere \ deve ser acrescentado imediatamente antes de todo caractere especialque deve ser tratado como um caractere comum.
1 INSERT INTO Editora (nome , email) VALUES (O\Reilly , oreilly@email.com)
Os valores recebidos dos usurios devem ser analisados e os caracteres especiais contidos nessesvalores devem ser tratados. Esse processo extremamente trabalhoso, pois o conjunto de caracteresespeciais e a forma de trat-los diferente em cada SGDB.
A responsabilidade do tratamento dos caracteres especiais contidos nos valores de entrada dosusurios pode ser repassada para os drivers JDBC. Dessa forma, o cdigo das aplicaes se tornaindependente das particularidades desse processo para cada SGDB.
Mais SobreO processo de tratamento dos caracteres especiais das entradas dos usurios denomi-nado sanitize.
1 // lendo as entradas do usurio2 System.out.println("Digite o nome da editora: ");3 String nome = entrada.nextLine ();45 System.out.println("Digite o email da editora: ");6 String email = entrada.nextLine ();78 // cdigo sql com marcadores para as entradas do usurio9 String sql = "INSERT INTO Editora (nome , email) VALUES (?, ?)";1011 // criando um comando a partir do cdigo SQL12 PreparedStatement comando = conexao.prepareStatement(sql);1314 // adicionando as entradas do usurios no comando15 // o processo de sanitizao ocorre aqui16 comando.setString(1, nome);17 comando.setString(2, email);
Cdigo Java 2.10: Sanitizando as entradas dos usurios
Observe que o cdigo SQL foi definido com parmetros atravs do caractere ?. Antes de exe-cutar o comando, necessrio determinar os valores dos parmetros. Essa tarefa pode ser realizadaatravs do mtodo setString(), que recebe o ndice (posio) do parmetro no cdigo SQL e o va-lor correspondente. Esse mtodo faz o tratamento dos caracteres especiais contidos nos valores deentrada do usurio de acordo com as regras do SGDB utilizado.
Exerccios de Fixao
34 www.k19.com.br
35 JDBC
5 Tente gerar um erro de SQL Injection no cadastro de editoras. Dica: utilize entradas com aspassimples.
6 Altere o cdigo da classe InsereEditora para eliminar o problema do SQL Injection.
1 package br.com.k19.jdbc;23 import java.sql.Connection;4 import java.sql.DriverManager;5 import java.sql.PreparedStatement;6 import java.util.Scanner;78 public class InsereEditora {9 public static void main(String [] args) {10 String stringDeConexao = "jdbc:mysql :// localhost :3306/ livraria";11 String usuario = "root";12 String senha = "root";1314 try {15 System.out.println("Abrindo conexo ...");16 Connection conexao =17 DriverManager.getConnection(stringDeConexao , usuario , senha);1819 Scanner entrada = new Scanner(System.in);2021 System.out.println("Digite o nome da editora: ");22 String nome = entrada.nextLine ();2324 System.out.println("Digite o email da editora: ");25 String email = entrada.nextLine ();2627 entrada.close();2829 String sql = "INSERT INTO Editora (nome , email) VALUES (?, ?)";3031 PreparedStatement comando = conexao.prepareStatement(sql);32 comando.setString(1, nome);33 comando.setString(2, email);3435 System.out.println("Executando comando ...");36 comando.execute ();3738 System.out.println("Fechando conexo ...");39 conexao.close();40 } catch (Exception e) {41 e.printStackTrace ();42 }43 }44 }
Cdigo Java 2.11: InsereEditora.java
Exerccios Complementares
2 Tente gerar um erro de SQL Injection no cadastro de livros. Dica: utilize entradas com aspassimples.
www.facebook.com/k19treinamentos 35
JDBC 36
3 Altere o cdigo da classe InsereLivro para eliminar o problema do SQL Injection.
4 Agora tente causar novamente o problema de SQL Injection ao inserir novos livros.
Listando registros
O processo para executar um comando de consulta bem parecido com o processo de inserirregistros. O primeiro passo definir a consulta em SQL.
1 String sql = "SELECT * FROM Editora;";23 PreparedStatement comando = conexao.prepareStatement(sql);45 System.out.println("Executando comando ...");6 ResultSet resultado = comando.executeQuery ();
Cdigo Java 2.13: Realizando uma consulta.
A diferena que para executar um comando de consulta necessrio utilizar o mtodo execu-teQuery() ao invs do execute(). Esse mtodo devolve um objeto da interface java.sql.Result-Set, que responsvel por armazenar os resultados da consulta.
Os dados contidos no ResultSet podem ser acessados atravs de mtodos, como o getString,getInt, getDouble, etc, de acordo com o tipo do campo. Esses mtodos recebem como parmetrouma string referente ao nome da coluna correspondente.
1 int id = resultado.getInt("id"),2 String nome = resultado.getString("nome"),3 String email = resultado.getString("email");
Cdigo Java 2.14: Recuperando os dados de um ResultSet
O cdigo acima mostra como os campos do primeiro registro da consulta so recuperados. Pararecuperar os dados dos outros registros necessrio avanar o ResultSet atravs do mtodo next().
1 int id1 = resultado.getInt("id"),2 String nome1 = resultado.getString("nome"),3 String email1 = resultado.getString("email");45 resultado.next();67 int id2 = resultado.getInt("id"),8 String nome2 = resultado.getString("nome"),9 String email2 = resultado.getString("email");
Cdigo Java 2.15: Avanando o ResultSet
O prprio mtodo next() devolve um valor booleano para indicar se o ResultSet conseguiuavanar para o prximo registro. Quando esse mtodo devolver false significa que no h maisregistros para serem consultados.
1 while(resultado.next()) {2 int id = resultado.getInt("id"),3 String nome = resultado.getString("nome"),4 String email = resultado.getString("email");
36 www.k19.com.br
37 JDBC
5 }
Cdigo Java 2.16: Iterando os registros do ResultSet
Exerccios de Fixao
7 Insira algumas editoras utilizando a classe InsereEditora que voc criou anteriormente.
8 Adicione uma nova classe no projeto JDBC chamada ListaEditoras.
1 package br.com.k19.jdbc;23 import java.sql.Connection;4 import java.sql.DriverManager;5 import java.sql.PreparedStatement;6 import java.sql.ResultSet;78 public class ListaEditoras {9 public static void main(String [] args) {10 String stringDeConexao = "jdbc:mysql :// localhost :3306/ livraria";11 String usuario = "root";12 String senha = "root";1314 try {15 System.out.println("Abrindo conexo ...");16 Connection conexao =17 DriverManager.getConnection(stringDeConexao , usuario , senha);1819 String sql = "SELECT * FROM Editora;";2021 PreparedStatement comando = conexao.prepareStatement(sql);2223 System.out.println("Executando comando ...");24 ResultSet resultado = comando.executeQuery ();2526 System.out.println("Resultados encontrados: \n");27 while (resultado.next()) {28 System.out.printf("%d : %s - %s\n",29 resultado.getInt("id"),30 resultado.getString("nome"),31 resultado.getString("email"));32 }3334 System.out.println("\nFechando conexo ...");35 conexao.close();36 } catch (Exception e) {37 e.printStackTrace ();38 }39 }40 }
Cdigo Java 2.17: ListaEditoras.java
Exerccios Complementares
www.facebook.com/k19treinamentos 37
JDBC 38
5 Crie uma classe para listar os livros cadastrados na base de dados.
Connection Factory
Voc deve ter percebido que em diversos pontos diferentes da nossa aplicao precisamos deuma conexo JDBC. Se a url de conexo for definida em cada um desses pontos, teremos um pro-blema de manuteno. Imagine que o driver do banco seja atualizado ou que o IP do SGBD sejaalterado. Teramos que alterar o cdigo da nossa aplicao em muitos lugares. Mais precisamente,cada ocorrncia da url de conexo precisaria ser modificada. A probabilidade de algum ponto noser corrigido grande.
Para diminuir o trabalho de manuteno, podemos implementar uma classe responsvel pelacriao e distribuio de conexes. A url de conexo deve ser definida nessa classe e somente nela.Consequentemente, alteraes nas informaes contidas na url de conexo afetariam apenas umaclasse da aplicao.
1 package br.com.k19.jdbc;23 import java.sql.Connection;4 import java.sql.DriverManager;5 import java.sql.SQLException;67 public class ConnectionFactory {8 public static Connection createConnection () {9 String stringDeConexao = "jdbc:mysql :// localhost :3306/ livraria";10 String usuario = "root";11 String senha = "root";1213 Connection conexao = null;1415 try {16 conexao = DriverManager.getConnection(stringDeConexao , usuario , senha);17 } catch (SQLException e) {18 e.printStackTrace ();19 }20 return conexao;21 }22 }
Cdigo Java 2.19: ConnectionFactory.java
Agora, podemos obter uma nova conexo apenas chamando o mtodo createConnection(). Oresto do sistema no precisa mais conhecer os detalhes sobre a criao das conexes com o bancode dados, diminuindo o acoplamento da aplicao.
Exerccios de Fixao
9 Adicione uma classe chamada ConnectionFactory no projeto JDBC com o cdigo abaixo.
1 package br.com.k19.jdbc;23 import java.sql.Connection;4 import java.sql.DriverManager;5 import java.sql.SQLException;
38 www.k19.com.br
39 JDBC
67 public class ConnectionFactory {8 public static Connection createConnection () {9 String stringDeConexao = "jdbc:mysql :// localhost :3306/ livraria";10 String usuario = "root";11 String senha = "root";1213 Connection conexao = null;1415 try {16 conexao = DriverManager.getConnection(stringDeConexao , usuario , senha);17 } catch (SQLException e) {18 e.printStackTrace ();19 }20 return conexao;21 }22 }
Cdigo Java 2.20: ConnectionFactory.java
10 Altere as classes InsereEditora e ListaEditoras para que elas utilizem a fbrica de conexo.Depois, execute-as novamente.
1 package br.com.k19.jdbc;23 import java.sql.Connection;4 import java.sql.PreparedStatement;5 import java.util.Scanner;67 public class InsereEditora {8 public static void main(String [] args) {9 try {10 System.out.println("Abrindo conexo ...");11 Connection conexao = ConnectionFactory.createConnection ();1213 Scanner entrada = new Scanner(System.in);1415 System.out.println("Digite o nome da editora: ");16 String nome = entrada.nextLine ();1718 System.out.println("Digite o email da editora: ");19 String email = entrada.nextLine ();2021 entrada.close();2223 String sql = "INSERT INTO Editora (nome , email) VALUES (?, ?)";2425 PreparedStatement comando = conexao.prepareStatement(sql);26 comando.setString(1, nome);27 comando.setString(2, email);2829 System.out.println("Executando comando ...");30 comando.execute ();3132 System.out.println("Fechando conexo ...");33 conexao.close();34 } catch (Exception e) {35 e.printStackTrace ();36 }37 }38 }
Cdigo Java 2.21: InsereEditora.java
1 package br.com.k19.jdbc;2
www.facebook.com/k19treinamentos 39
JDBC 40
3 import java.sql.Connection;4 import java.sql.PreparedStatement;5 import java.sql.ResultSet;67 public class ListaEditoras {8 public static void main(String [] args) {9 try {10 System.out.println("Abrindo conexo ...");11 Connection conexao = ConnectionFactory.createConnection ();1213 String sql = "SELECT * FROM Editora;";1415 PreparedStatement comando = conexao.prepareStatement(sql);1617 System.out.println("Executando comando ...");18 ResultSet resultado = comando.executeQuery ();1920 System.out.println("Resultados encontrados: \n");21 while (resultado.next()) {22 System.out.printf("%d : %s - %s\n",23 resultado.getInt("id"),24 resultado.getString("nome"),25 resultado.getString("email"));26 }2728 System.out.println("\nFechando conexo ...");29 conexao.close();30 } catch (Exception e) {31 e.printStackTrace ();32 }33 }34 }
Cdigo Java 2.22: ListaEditoras.java
Exerccios Complementares
6 Altere as classes InsereLivro e ListaLivros para que elas utilizem a fbrica de conexo. Depois,execute-as novamente.
Desafios
1 Implemente a remoo de editoras pelo id.
2 Implemente a alterao dos dados das editoras pelo id.
40 www.k19.com.br
JPA 2.1 E HIBERNATE
CA
P
TU
LO
3Mltiplas sintaxes da linguagem SQL
No captulo anterior, utilizamos a especificao JDBC para fazer uma aplicao Java interagircom os SGDBs. Nessa interao, as consultas so definidas com a linguagem SQL. A sintaxe dessalinguagem diferente em cada SGDB. Dessa forma, a complexidade do trabalho dos desenvolvedo-res aumenta. Para resolver esse problema, as consultas deveriam ser definidas atravs de um meca-nismo independente da linguagem SQL.
Driv
er O
racl
eJD
BC
SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY autor ASC) AS rownumber, id, titulo, autor FROM livros) WHERE rownumber
JPA 2.1 E HIBERNATE 42
utilizam o modelo orientado a objetos.
A transio de dados entre o modelo relacional e o modelo orientado a objetos no simples.Para realizar essa transio, necessrio definir um mapeamento entre os conceitos desses dois pa-radigmas. Por exemplo, classes podem ser mapeadas para tabelas, objetos para registros, atributospara campos e referncia entre objetos para chaves estrangeiras.
tbl_livros
id
1
2
3
4
titulo
Os Lusadas
Vidas Secas
Dom Casmurro
O Cortio
autor
Lus Vaz de Cames
Graciliano Ramos
Machado de Assis
Alusio Azevedo
editora_id
1
1
3
2
tbl_editoras
id
1
2
3
4
nome
Cultura
FTDA
Globo
Scipione
MODELO RELACIONAL
Editora
id = 1nome = Livraria Cultura
Livro
id = 1titulo = Os Lusadasautor = Lus Vaz de Cameseditora = 1
Livro
id = 2titulo = Vidas Secasautor = Graciliano Ramoseditora = 1
ORIENTAO A OBJETOS
Figura 3.2: Modelo Orientado a Objetos vs Modelo Relacional
Ferramentas ORM
Para facilitar a comunicao entre aplicaes Java que seguem o modelo orientado a objetos e osSGDBs que seguem o modelo relacional, podemos utilizar ferramentas que automatizam a transiode dados entre as aplicaes e os SGDBs. Essas ferramentas so conhecidas como ferramentas ORM(Object Relational Mapper).
As ferramentas ORM oferecem mecanismos de consultas independentes da linguagem SQL. Dessaforma, o acoplamento entre as aplicaes e os SGDBs diminui drasticamente. A principal ferramentaORM para Java utilizada no mercado o Hibernate. Mas, existem outras que possuem o mesmo ob-jetivo.
42 www.k19.com.br
43 JPA 2.1 E HIBERNATE
Livro
id = 1titulo = Os Lusadasautor = Lus Vaz de Cameseditora = 1
Livro
id = 2titulo = Vidas Secasautor = Graciliano Ramoseditora = 1
tbl_livros
id
1
2
3
4
titulo
Os Lusadas
Vidas Secas
Dom Casmurro
O Cortio
autor
Lus Vaz de Cames
Graciliano Ramos
Machado de Assis
Alusio Azevedo
editora_id
1
1
3
2
FERRAMENTAORM
Figura 3.3: Transformao dos dados do Modelo Relacional para o Modelo Orientado a Objetos
Livro
id = 1titulo = Os Lusadasautor = Lus Vaz de Cameseditora = 1
Livro
id = 2titulo = Vidas Secasautor = Graciliano Ramoseditora = 1
tbl_livros
id
1
2
3
4
titulo
Os Lusadas
Vidas Secas
Dom Casmurro
O Cortio
autor
Lus Vaz de Cames
Graciliano Ramos
Machado de Assis
Alusio Azevedo
editora_id
1
1
3
2
FERRAMENTAORM
Figura 3.4: Transformao dos dados do Modelo Orientado a Objetos para o Modelo Relacional
O que JPA e Hibernate?
Aps o sucesso do Hibernate, a especificao JPA (Java Persistence API) foi criada com o objetivode padronizar as ferramentas ORM para aplicaes Java e consequentemente diminuir a complexi-dade do desenvolvimento. Atualmente, essa especificao est na sua segunda verso.
Ela especifica um conjunto de classes e mtodos que as ferramentas ORM devem implementar.Veja que a JPA apenas uma especificao. Ela no implementa nenhum cdigo. Para isso, utiliza-mos alguma das diversas implementaes da JPA. Neste curso, utilizaremos o Hibernate como im-plementao de JPA. As outras implementaes de JPA mais conhecidas so EclipseLink e OpenJPA.Optamos por utilizar o Hibernate por ele ser o mais antigo e mais utilizado atualmente.
Caso voc queira utilizar outra ferramenta ORM, poder aplicar os conceitos aqui aprendidosjustamente porque eles seguem a mesma especificao. Assim, podemos programar voltado es-pecificao e substituir uma implementao pela outra, sem precisar reescrever o cdigo da nossaaplicao. Claro que teramos que alterar alguns arquivos de configurao, mas o cdigo da aplica-o permaneceria o mesmo.
Bibliotecas
Antes de comear a utilizar o Hibernate, necessrio baixar do site oficial o bundle que inclui osjars do hibernate e todas as suas dependncias. Neste curso, utilizaremos a verso 4.3.10. A url dosite oficial do Hibernate http://www.hibernate.org/.
www.facebook.com/k19treinamentos 43
JPA 2.1 E HIBERNATE 44
Configurao
Para configurar o Hibernate em uma aplicao, devemos criar um arquivo chamado persisten-ce.xml. O contedo desse arquivo possuir informaes sobre o banco de dados, como a url deconexo, usurio e senha, alm de dados sobre a implementao de JPA que ser utilizada.
O arquivo persistence.xml deve estar em uma pasta chamada META-INF, que deve estar noclasspath da aplicao. Veja abaixo um exemplo de configurao para o persistence.xml.
1 2 89 10 org.hibernate.ejb.HibernatePersistence 11 12 1516 1920 2324 2728 3132 35 36 37
Cdigo XML 3.1: persistence.xml
A propriedade hibernate.dialect permite que a aplicao escolha qual sintaxe de SQL deve serutilizada pelo Hibernate.
Mais SobreConsulte o artigo da K19 sobre configurao do Hibernate e MySQL na seguinte url:http://www.k19.com.br/artigos/configurando-hibernate-com-mysql/.
Mapeamento
44 www.k19.com.br
45 JPA 2.1 E HIBERNATE
Um dos principais objetivos das ferramentas ORM estabelecer o mapeamento entre os concei-tos do modelo orientado a objetos e os conceitos do modelo relacional. Esse mapeamento pode serdefinido atravs de XML ou de maneira mais prtica com anotaes Java.
A seguir, veremos as principais anotaes Java de mapeamento do JPA. Essas anotaes esto nopacote javax.persistence.
@Entity a principal anotao do JPA. Ela deve aparecer antes do nome de uma classe e deve serdefinida em todas as classes que tero objetos persistidos no banco de dados.
As classes anotadas com @Entity so mapeadas para tabelas. Por conveno, as tabelas pos-suem os mesmos nomes das classes. Mas, podemos alterar esse comportamento utilizando aanotao @Table.
Os atributos declarados em uma classe anotada com @Entity so mapeados para colunas natabela correspondente classe. Outra vez, por conveno, as colunas possuem os mesmosnomes dos atributos. Novamente, podemos alterar esse padro utilizando a anotao @Column.
@Id Utilizada para indicar qual atributo de uma classe anotada com @Entity ser mapeado para achave primria da tabela correspondente classe. Geralmente o atributo anotado com @Id do tipo Long.
@GeneratedValue Geralmente vem acompanhado da anotao @Id. Serve para indicar que o atri-buto gerado pelo banco, no momento em que um novo registro inserido.
@Table Utilizada para alterar o nome padro da tabela. Ela recebe o parmetro name para indicarqual nome deve ser utilizado na tabela. Veja o exemplo:
1 @Table(name="Publisher")2 @Entity3 public class Editora {4 // ...5 }
Cdigo Java 3.1: Editora.java
@Column Utilizado para alterar o nome da coluna que ser usado na tabela. Caso voc esteja uti-lizando um banco de dados legado, no qual os nomes das colunas j foram definidos, vocpode mudar atravs dessa anotao. Alm disso, podemos estabelecer certas restries, comodeterminar se o campo pode ou no ser nulo.
1 @Entity2 public class Editora {3 @Column(name="publisher_name",nullable=false)4 private String nome;56 }
Cdigo Java 3.2: Editora.java
@Transient Serve para indicar que um atributo no deve ser persistido, ou seja, os atributos anota-dos com @Transient no so mapeados para colunas.
www.facebook.com/k19treinamentos 45
JPA 2.1 E HIBERNATE 46
@Lob Utilizado para atributos que armazenam textos muito grandes, ou arquivos binrios contendoimagens ou sons que sero persistidos no banco de dados. O tipo do atributo deve ser String,Byte[], byte[] ou java.sql.Blob.
@Temporal Utilizado para atributos do tipo Calendar ou Date. Por padro, tanto data quanto horaso armazenados no banco de dados. Mas, com a anotao @Temporal, podemos mandarpersistir somente a data ou somente a hora.
1 @Entity2 public class Livro {3 @Temporal(TemporalType.DATE)4 private Calendar publicacao;5 // ...67 }
Cdigo Java 3.3: Livro.java
Gerando Tabelas
Uma das vantagens de se utilizar o Hibernate que ele capaz de gerar as tabelas do banco paraa nossa aplicao. Ele faz isso de acordo com as anotaes colocadas nas classes e as informaespresentes no persistence.xml.
As tabelas so geradas atravs de um mtodo da classe Persistence, o createEntityManager-Factory(String entityUnit). O parmetro entityUnit permite escolher, pelo nome, uma uni-dade de persistncia definida no persistence.xml.
A poltica de criao das tabelas pode ser alterada modificando o valor a propriedade hiberna-te.hbm2ddl.auto no arquivo persistence.xml. Podemos, por exemplo, fazer com que o Hibernatesempre sobrescreva as tabelas existentes, bastando definir a propriedade hibernate.hbm2ddl.autocom o valor create-drop.
1
Uma outra opo configurar o Hibernate para simplesmente atualizar as tabelas de acordocom as mudanas nas anotaes sem remov-las. Nesse caso, o valor da propriedade hiberna-te.hbm2ddl.auto deve ser update.
1
Exerccios de Fixao
1 Crie um projeto chamado JPA. Esse projeto deve ser do tipo Java Project.
2 Crie uma pasta chamada lib no projeto JPA. Copie os JARs do Hibernate e do driver JDBC doMySQL para a pasta lib. Esses JARs esto nos diretrios:
46 www.k19.com.br
47 JPA 2.1 E HIBERNATE
K19-Arquivos/hibernate-release-4.3.10.Final/lib/required
K19-Arquivos/hibernate-release-4.3.10.Final/lib/jpa
K19-Arquivos/mysql-connector-java-VERSAO
ImportanteVoc tambm pode obter os JARs do Hibernate e do driver JDBC do MySQL atravs dosite da K19: www.k19.com.br/arquivos.
3 Adicione os JARs da pasta lib do projeto JPA no build path.
4 Configure uma unidade de persistncia no projeto JPA. Para isso, crie uma pasta chamada META-INF na pasta src do projeto JPA. Adicione nessa pasta o arquivo persistence.xml com o seguintecontedo.
Para criar o arquivo persistence.xml no Eclipse, digite CTRL + 3 e pesquise por Create a newXML file. Selecione a opo correspondente e siga as imagens abaixo.
www.facebook.com/k19treinamentos 47
JPA 2.1 E HIBERNATE 48
48 www.k19.com.br
49 JPA 2.1 E HIBERNATE
www.facebook.com/k19treinamentos 49
JPA 2.1 E HIBERNATE 50
1 2 89 10 org.hibernate.ejb.HibernatePersistence 11 12 1516 1920 2324 2728 3132 35 36 37
Cdigo XML 3.4: persistence.xml
50 www.k19.com.br
51 JPA 2.1 E HIBERNATE
5 Crie uma classe chamada Editora em um pacote chamado br.com.k19.jpa e acrescente as ano-taes necessrias para fazer o mapeamento.
1 package br.com.k19.jpa;23 import javax.persistence.Entity;4 import javax.persistence.GeneratedValue;5 import javax.persistence.Id;67 @Entity8 public class Editora {910 @Id11 @GeneratedValue12 private Long id;1314 private String nome;1516 private String email;1718 // GETTERS AND SETTERS19 }
Cdigo Java 3.4: Editora.java
6 Apague a tabela Livro e depois a tabela Editora.
7 Inicialize a unidade de persistncia atravs da classe Persistence. Para isso, crie uma classechamada Teste com o seguinte cdigo.
1 package br.com.k19.jpa;23 import javax.persistence.EntityManagerFactory;4 import javax.persistence.Persistence;56 public class Teste {7 public static void main(String [] args) {8 EntityManagerFactory factory =9 Persistence.createEntityManagerFactory("livraria -pu");1011 factory.close();12 }13 }
Cdigo Java 3.5: Teste.java
Execute a classe Teste e verifique se a tabela Editora foi criada corretamente.
Manipulando entidades
Para manipular as entidades da nossa aplicao, devemos utilizar um EntityManager que ob-tido atravs de uma EntityManagerFactory.
1 EntityManagerFactory factory =2 Persistence.createEntityManagerFactory("K19");34 EntityManager manager = factory.createEntityManager ();
www.facebook.com/k19treinamentos 51
JPA 2.1 E HIBERNATE 52
Cdigo Java 3.6: Obtendo um EntityManager
Persistindo
Para armazenar as informaes de um objeto no banco de dados, o primeiro passo utilizar omtodo persist() do EntityManager.
1 Editora novaEditora = new Editora ();2 novaEditora.setNome("K19 - Livros")3 novaEditora.setEmail("contato@k19.com.br");45 manager.persist(novaEditora);
Cdigo Java 3.7: Marcando um objeto para ser persistido
importante destacar que o mtodo persist() apenas marca os objetos que devem ser arma-zenados no banco de dados. Os objetos sero armazenados aps a chamada do mtodo commit(),como veremos adiante.
Buscando
Para obter um objeto que contenha informaes do banco de dados, podemos utilizar o mtodofind() ou o mtodo getReference() do EntityManager.
1 Editora editora1 = manager.find(Editora.class , 1L);2 Editora editora2 = manager.getReference(Editora.class , 2L);
Cdigo Java 3.8: Obtendo objetos com informaes do banco de dados
H uma diferena entre os dois mtodos bsicos de busca find() e getReference(). O mtodofind() recupera os dados desejados imediatamente. J o mtodo getReference() posterga essatarefa at a primeira chamada de um mtodo get do objeto.
Removendo
Para remover o registro correspondente a um objeto, devemos utilizar o mtodo remove() doEntityManager.
1 Editora editora1 = manager.find(Editora.class , 1L);2 manager.remove(editora1);
Cdigo Java 3.9: Marcando um objeto para ser removido
Atualizando
Para alterar os dados do registro correspondente a um objeto, basta utilizar os prprios mtodossetters desse objeto.
1 Editora editora = manager.find(Editora.class , 1L);2 editora.setNome("K19 - Livros e Publicaes");
Cdigo Java 3.10: Alterando os dados de um registro
52 www.k19.com.br
53 JPA 2.1 E HIBERNATE
Listando
Para obter uma listagem com todos os objetos referentes aos registros de uma tabela, podemosutilizar a linguagem de consulta do JPA, a JPQL, que muito parecida com a linguagem SQL. A prin-cipal vantagem do JPQL em relao ao SQL que a sintaxe do JPQL no depende do SGDB utilizado.
1 Query query = manager.createQuery("SELECT e FROM Editora e");2 List editoras = query.getResultList ();
Cdigo Java 3.11: Obtendo uma lista de objetos com informaes do banco de dados
Transaes
As modificaes realizadas nos objetos administrados por um EntityManager so mantidas emmemria. Em certos momentos, necessrio sincronizar os dados da memria com os dados dobanco de dados. Essa sincronizao deve ser realizada atravs de uma transao JPA criada peloEntityManager que administra os objetos que desejamos sincronizar.
Para abrir uma transao, utilizamos o mtodo begin().
1 manager.getTransaction ().begin();
Cdigo Java 3.12: Abrindo uma transao
Com uma transao aberta, podemos sincronizar os dados da memria com os dados do bancoatravs do mtodo commit().
1 Editora editora = manager.find(Editora.class , 1L);2 editora.setNome("K19 - Livros e Publicaes");34 manager.getTransaction ().begin();5 manager.getTransaction ().commit ();
Cdigo Java 3.13: Sincronizando com o mtodo commit()
Exerccios de Fixao
8 Altere o arquivo persistence.xml, modificando o valor da propriedade hibernate.hbm2ddl.autopara update. Assim, as tabelas no sero recriadas a cada execuo. Elas sero apenas atualizadas.
1 2 89 10 org.hibernate.ejb.HibernatePersistence 11 12 15
www.facebook.com/k19treinamentos 53
JPA 2.1 E HIBERNATE 54
16 1920 2324 2728 3132 35 36 37
Cdigo XML 3.5: persistence.xml
9 Crie uma classe chamada InsereEditoraComJPA no pacote br.com.k19.jpa.
1 package br.com.k19.jpa;23 import java.util.Scanner;4 import javax.persistence.EntityManager;5 import javax.persistence.EntityManagerFactory;6 import javax.persistence.Persistence;78 public class InsereEditoraComJPA {910 public static void main(String [] args) {11 EntityManagerFactory factory =12 Persistence.createEntityManagerFactory("livraria -pu");1314 EntityManager manager = factory.createEntityManager ();1516 Editora novaEditora = new Editora ();1718 Scanner entrada = new Scanner(System.in);1920 System.out.println("Digite o nome da editora: ");21 novaEditora.setNome(entrada.nextLine ());2223 System.out.println("Digite o email da editora: ");24 novaEditora.setEmail(entrada.nextLine ());2526 entrada.close();2728 manager.persist(novaEditora);2930 manager.getTransaction ().begin();31 manager.getTransaction ().commit ();3233 manager.close();34 factory.close();35 }36 }
Cdigo Java 3.14: InsereEditoraComJPA.java
54 www.k19.com.br
55 JPA 2.1 E HIBERNATE
Execute a classe InsereEditoraComJPA para inserir algumas editoras.
10 Crie uma classe chamada ListaEditorasComJPA no pacote br.com.k19.jpa.
1 package br.com.k19.jpa;23 import java.util.List;4 import javax.persistence.EntityManager;5 import javax.persistence.EntityManagerFactory;6 import javax.persistence.Persistence;7 import javax.persistence.Query;89 public class ListaEditorasComJPA {1011 public static void main(String [] args) {12 EntityManagerFactory factory =13 Persistence.createEntityManagerFactory("livraria -pu");1415 EntityManager manager = factory.createEntityManager ();1617 Query query = manager.createQuery("SELECT e FROM Editora e");18 List editoras = query.getResultList ();1920 for(Editora e : editoras) {21 System.out.println("EDITORA: " + e.getNome () + " - " + e.getEmail ());22 }2324 manager.close();25 factory.close();26 }27 }
Cdigo Java 3.15: ListaEditorasComJPA.java
Execute a classe ListaEditorasComJPA para listar as editoras.
Repository
A interface EntityManager do JPA oferece recursos suficientes para que os objetos do domniosejam recuperados ou persistidos no banco de dados. Porm, em aplicaes com alta complexidadee grande quantidade de cdigo, espalhar as chamadas aos mtodos do EntityManager pode gerardificuldades na manuteno e no entendimento do sistema.
Para melhorar a organizao das nossas aplicaes, diminuindo o custo de manuteno e au-mentando a legibilidade do cdigo, podemos aplicar o padro Repository do DDD (Domain DrivenDesign).
Conceitualmente, um repositrio representa o conjunto de todos os objetos de um determinadotipo. Ele deve oferecer mtodos para recuperar e para adicionar elementos.
Os repositrios podem trabalhar com objetos prontos na memria ou reconstru-los com dadosobtidos de um banco de dados. O acesso ao banco de dados pode ser realizado atravs de ferramen-tas ORM como o Hibernate.
1 class EditoraRepository {2 private EntityManager manager;34 public EditoraRepository(EntityManager manager) {
www.facebook.com/k19treinamentos 55
JPA 2.1 E HIBERNATE 56
5 this.manager = manager;6 }78 public void adiciona(Editora e) {9 this.manager.persist(e);10 }11 public Editora busca(Long id) {12 return this.manager.find(Editora.class , id);13 }14 public List buscaTodas () {15 Query query = this.manager.createQuery("SELECT e FROM Editora e");16 return query.getResultList ();17 }18 }
Cdigo Java 3.16: EditoraRepository.java
1 EntityManagerFactory factory = Persistence.createEntityManagerFactory("K19");23 EntityManager manager = factory.createEntityManager ();45 EditoraRepository editoraRepository = new EditoraRepository(manager);67 List editoras = editoraRepository.buscaTodas ();
Cdigo Java 3.17: Utilizando um repositrio
Exerccios de Fixao
11 Adicione uma classe chamada EditoraRepository no pacote br.com.k19.jpa.
1 package br.com.k19.jpa;23 import java.util.List;4 import javax.persistence.EntityManager;5 import javax.persistence.Query;67 public class EditoraRepository {8 private EntityManager manager;910 public EditoraRepository(EntityManager manager) {11 this.manager = manager;12 }1314 public void adiciona(Editora e) {15 this.manager.persist(e);16 }17 public Editora busca(Long id) {18 return this.manager.find(Editora.class , id);19 }20 public List buscaTodas () {21 Query query = this.manager.createQuery("SELECT e FROM Editora e");22 return query.getResultList ();23 }24 }
Cdigo Java 3.18: EditoraRepository.java
12 Altere a classe InsereEditoraComJPA para que ela utilize o repositrio de editoras.
56 www.k19.com.br
57 JPA 2.1 E HIBERNATE
1 package br.com.k19.jpa;23 import java.util.Scanner;4 import javax.persistence.EntityManager;5 import javax.persistence.EntityManagerFactory;6 import javax.persistence.Persistence;78 public class InsereEditoraComJPA {910 public static void main(String [] args) {11 EntityManagerFactory factory =12 Persistence.createEntityManagerFactory("livraria -pu");1314 EntityManager manager = factory.createEntityManager ();1516 EditoraRepository editoraRepository = new EditoraRepository(manager);1718 Editora novaEditora = new Editora ();1920 Scanner entrada = new Scanner(System.in);2122 System.out.println("Digite o nome da editora: ");23 novaEditora.setNome(entrada.nextLine ());2425 System.out.println("Digite o email da editora: ");26 novaEditora.setEmail(entrada.nextLine ());2728 entrada.close();2930 editoraRepository.adiciona(novaEditora);3132 manager.getTransaction ().begin();33 manager.getTransaction ().commit ();3435 manager.close();36 factory.close();37 }38 }
Cdigo Java 3.19: InsereEditoraComJPA.java
13 Altere a classe ListaEditorasComJPA para que ela utilize o repositrio de editoras.
1 package br.com.k19.jpa;23 import java.util.List;4 import javax.persistence.EntityManager;5 import javax.persistence.EntityManagerFactory;6 import javax.persistence.Persistence;78 public class ListaEditorasComJPA {910 public static void main(String [] args) {11 EntityManagerFactory factory =12 Persistence.createEntityManagerFactory("livraria -pu");1314 EntityManager manager = factory.createEntityManager ();1516 EditoraRepository editoraRepository = new EditoraRepository(manager);1718 List editoras = editoraRepository.buscaTodas ();1920 for(Editora e : editoras) {21 System.out.println("EDITORA: " + e.getNome () + " - " + e.getEmail ());22 }23
www.facebook.com/k19treinamentos 57
JPA 2.1 E HIBERNATE 58
24 manager.close();25 factory.close();26 }27 }
Cdigo Java 3.20: ListaEditorasComJPA.java
58 www.k19.com.br
WEB CONTAINER
CA
P
TU
LO
4Necessidades de uma aplicao web
HTTP
Os usurios de uma aplicao web utilizam navegadores (browsers) para interagir com essa apli-cao. A comunicao entre navegadores e uma aplicao web realizada atravs de requisies erespostas definidas pelo protocolo HTTP. Dessa forma, os desenvolvedores de aplicao web devemestar preparados para trabalhar com o protocolo HTTP.
Acesso simultneo
Alm disso, na grande maioria dos casos, as aplicaes web devem ser acessadas por diversosusurios ao mesmo tempo. Consequentemente, os desenvolvedores web devem criar ou utilizaralgum mecanismo eficiente que permita esse tipo de acesso.
Contedo dinmico
As pginas de uma aplicao web devem ser geradas dinamicamente. Por exemplo, quando umusurio de uma aplicao de email acessa a sua caixa de entrada, ele deseja ver todos os emailsenviados at aquele momento. A pgina contendo a lista de emails deve ser gerada novamente todavez que essa pgina for requisitada. Consequentemente, os desenvolvedores web devem criar ouutilizar algum mecanismo eficiente que permita que o contedo das pginas das aplicaes web sejagerado dinamicamente.
www.facebook.com/k19treinamentos 59
WEB CONTAINER 60
AplicaoWeb
Requ
isi
o H
TTPResposta H
TTP
Requ
isi
o HTT
P
Resposta HTTPRe
quisi
o H
TTP
Resposta HTTP
www.k19.com.br www.k19.com.br www.k19.com.br
Cursos Artigos Apostilas
Figura 4.1: Necessidades de uma aplicao web
Soluo
Resolver os trs problemas apresentados tomaria boa parte do tempo de desenvolvimento, almde exigir conhecimentos tcnicos extremamente especficos por parte dos desenvolvedores. Parafacilitar o desenvolvimento de aplicaes web, a plataforma Java oferece uma soluo genrica quepode ser utilizada para desenvolver aplicaes web. Conheceremos essa soluo a seguir.
Requ
isi
o H
TTPResposta H
TTP
Requ
isi
o HTT
P