k19 k12 Desenvolvimento Web Com Jsf2 e Jpa2

314
TREINAMENTOS Desenvolvimento Web com JSF2 e JPA2

description

Desenvolvimento

Transcript of k19 k12 Desenvolvimento Web Com Jsf2 e Jpa2

  • 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 , [email protected]);23 INSERT INTO Editora (nome , email) VALUES (Wrox, [email protected]);45 INSERT INTO Editora (nome , email) VALUES (Apress , [email protected]);

    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 | [email protected] || 2 | Wrox | [email protected] || 3 | Apress | [email protected] |+----+---------+-------------------+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 | [email protected] |+----+---------------+-------+------------+----+---------+-------------------+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 ,[email protected] );"-;

    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 [email protected], o cdigo SQL gerado pela aplicao seria:

    1 INSERT INTO Editora (nome , email) VALUES (OReilly , [email protected])

    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 , [email protected])

    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("[email protected]");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