Vous êtes sur la page 1sur 195

Java

STANDARD
EDITION

Fortaleza, maro/2014

Sumrio
Introduo.............................................................................................................................................8
Capitulo 1.O que a linguagem java....................................................................................................9
1.1.- Histrico da linguagem............................................................................................................9
1.2.Uso da linguagem no mercado atualmente(especificao das tecnologias)............................10
1.3.Principais caractersticas da linguagem de programao java.................................................10
1.4. Ambientes e ferramentas de desenvolvimento com java........................................................14
1.4.1. Instalao do JDK ou SDK e JRE e suas configuraes.................................................14
1.5.Meu primeiro programa em java.............................................................................................14
1.5.1.Comentrios em Java:......................................................................................................16
1.5.2.Compilando meu primeiro programa em Java.................................................................16
1.5.3.Dicas para resoluo de problemas em programas java...................................................17
1.6.Erros comum em programas java............................................................................................17
1.6.1.Erros em java:..................................................................................................................17
1.6.2.Erro em tempo de compilao :.......................................................................................18
1.6.3.Erro em tempo de execuo:............................................................................................18
1.7.Netbeans...................................................................................................................................18
1.8.Viso de outras IDEs para o desenvolvimento com java.........................................................19
1.8.1.IDE Eclipse......................................................................................................................19
1.8.2.A IDE Bluej......................................................................................................................19
1.8.3.A IDE Gel.........................................................................................................................19
1.8.4.A IDE Jdeveloper.............................................................................................................19
1.9.Identificadores e palavras-chaves............................................................................................20
1.10.Tipos primitivos:....................................................................................................................21
1.10.1.Uso de valores literais de todos os tipos de dados existentes........................................21
1.10.1.1.Literais Inteiros:.....................................................................................................21
1.10.1.2.Literais decimal:.....................................................................................................22
1.10.1.3.Literais octal:..........................................................................................................22
1.10.1.4.Literais hexadecimal:.............................................................................................22
1.10.1.5.Literais de ponto flutuante:.....................................................................................23
1.10.1.6.Literais booleanos:.................................................................................................23
1.10.1.7.Literais de caracteres:.............................................................................................24
1.10.1.8.Literais para String:................................................................................................24
1.11.Operadores em Java:..............................................................................................................25
1.11.1.Operadores de atribuio composto...............................................................................25
1.11.2. Operadores de comparao...........................................................................................26
1.11.3.Igualdade de tipos primitivos :.......................................................................................27
1.11.4.Igualdade de variveis de referncias:...........................................................................27
1.11.5.Operador Instanceof:......................................................................................................28
1.11.6.Operador concatenao de strings:.................................................................................29
1.12. Operadores aritmticos.........................................................................................................29
1.12.1.Operador resto (%) :.......................................................................................................30
1.12.2.Operadores de Incremento e Decremento:.....................................................................30
OBS: A diferena que nesse caso podemos visualizar os resultados, 5,4 e 3;..........................31
1.12.3.Exerccio resolvido........................................................................................................32
1.12.4.Operadores relacionais:..................................................................................................32
1.12.5.Operadores lgicos.........................................................................................................32
1.12.6.Os operadores Bitwise :.................................................................................................33
1.12.7. Operadores lgicos de abreviao:................................................................................33
1.12.8.Operadores lgicos ^ e !:................................................................................................34
1.12.9.Operadores condicionais................................................................................................34
1.12.10.Operador Ternrio........................................................................................................35
1.12.11. Precedncia de Operadores.........................................................................................36
Capitulo 2.Controle de fluxo em java.................................................................................................37
2.1.Utilizar cdigo que use instrues if........................................................................................37

2.1.1.Expresses vlidas para instrues if...............................................................................37


2.1.2.Expresses vlidas para instrues if-else.......................................................................38
2.1.3. Expresses vlidas para instrues if-else-if...................................................................39
2.2.Expresses vlidas para instrues switch e case....................................................................40
2.3.Loops e iteradores (usando os loops for, while e do while).....................................................42
2.3.1.Loop do while:.................................................................................................................43
2.3.2.Loop for:..........................................................................................................................44
2.4. Loop for aprimorado (para arrays)..........................................................................................45
2.5.Uso de break, continue e return...............................................................................................46
2.5.1.Break:...............................................................................................................................46
2.5.2.Continue:..........................................................................................................................47
2.5.3.Return:..............................................................................................................................47
Capitulo 3.Tipos de Variveis, Constantes e Casting.........................................................................49
3.1.O que uma varivel :.............................................................................................................49
3.1.1.Tipos de Variveis:...........................................................................................................49
3.2. Variveis estticas:..................................................................................................................50
3.3. Constantes...............................................................................................................................51
3.4.Converso ou Cast (explcita e implcita das variveis de tipos primitivos)...........................51
3.5. Atribuindo uma varivel de referncia a outra........................................................................53
3.5.1. Escopo de variveis.........................................................................................................54
3.5.2.Variveis de instncias de tipos primitivos......................................................................54
Capitulo 4.POO com Java..................................................................................................................55
4.1.Introduo................................................................................................................................55
4.2.Classe, Atributos e Mtodos....................................................................................................56
4.3.Construindo uma Classe..........................................................................................................56
4.4.Encapsulamento.......................................................................................................................57
4.5.Retorno.....................................................................................................................................58
4.6.Construtores, mtodos seteres e geteres..................................................................................58
4.6.1.Construtores.....................................................................................................................58
4.6.2.Mtodos seteres e geteres.................................................................................................58
4.7.Estanciando (Construindo um Objeto)....................................................................................58
4.8.Variveis Estticas...................................................................................................................59
Conclumos ento que as variveis estticas no pertencem especificamente a nenhuma instancia de
objeto e sim uma referencia da classe. O que explica a substituio do termo this para o nome da
classe que que contm a varivel esttica, no exemplo acima alteramos o termo this no mtodo
setOndeVivo pelo nome da classe que contm a varivel esttica (Pessoa)......................................60
4.9.Mtodos Estticos....................................................................................................................60
Capitulo 5.Herana e Interface...........................................................................................................61
5.1.Introduo................................................................................................................................61
5.2.Herana....................................................................................................................................61
5.3.Object: A superclasse csmica do java....................................................................................62
5.3.1.Construtores da subclasse................................................................................................65
5.3.2.Classe Abstrata.................................................................................................................66
5.4.Interface...................................................................................................................................68
Capitulo 6.Tratamento de Excees...................................................................................................69
6.1.Capturando uma exceo usando o bloco (try e catch)...........................................................69
6.1.1.Finally..............................................................................................................................70
6.1.2.Lanado uma exceo com o throws...............................................................................71
6.1.3.Criando uma exceo com throw.....................................................................................71
Capitulo 7.Herana (Polimorfismo )..................................................................................................73
7.1.Introduo................................................................................................................................73
7.2.Sobrecarga................................................................................................................................73
7.3.SobreEscrita.............................................................................................................................73
7.4.Polimorfismo...........................................................................................................................74
Capitulo 8.UML.................................................................................................................................76
8.1.Introduo................................................................................................................................76

8.1.1.Diagrama de Atividade:...................................................................................................76
8.1.2.Diagrama de Sequencia....................................................................................................76
8.1.3.Diagrama de Caso de Uso................................................................................................76
8.1.4.Diagrama de Classe..........................................................................................................76
8.2.Abrindo o Projeto.....................................................................................................................77
Capitulo 9.Fila e Pilha........................................................................................................................79
9.1.Fila...........................................................................................................................................79
9.1.1.Implementando Fila em Java...........................................................................................79
9.2.Pilha.........................................................................................................................................81
9.2.1.Implementando Pilha em Java.........................................................................................81
Capitulo 10.Colees: List e Map......................................................................................................83
10.1. Introduo a Colees/Collections.......................................................................................83
10.2. Collection List ou Coleo Lista..........................................................................................85
10.3.ArrayList................................................................................................................................86
10.3.1.Criando uma Lista em Java usando a Classe ArrayList.................................................87
10.3.2.Adicionando elementos em uma Lista...........................................................................87
10.3.3.Removendo elementos de uma Lista..............................................................................89
10.3.4.Acessando elementos da Lista.......................................................................................90
10.3.5.Pesquisando elementos na Lista.....................................................................................93
10.4. Collection Map ou Coleo Mapa........................................................................................94
10.5.HashMap................................................................................................................................95
10.5.1.Criando uma coleo do tipo Mapa usando a Classe HashMap....................................95
10.5.2.Adicionando elementos em uma coleo do tipo Mapa.................................................96
10.5.3.Removendo elementos em uma coleo do tipo Mapa..................................................97
10.5.4.Selecionando/Pesquisando elementos em uma coleo do tipo Mapa...........................98
10.5.5.Nmero de elementos em uma coleo do tipo Mapa...................................................98
Capitulo 11.Interface Grfica com Usurio GUI...........................................................................100
11.1.Interface Grfica com usurio - GUI...................................................................................100
11.2.Bibliotecas AWT e SWING.................................................................................................101
11.3.JFrame..................................................................................................................................101
11.3.1.Camadas JFrame..........................................................................................................101
11.3.2.Nossa primeira Janela com JFrame..............................................................................102
11.4.Criando uma classe com propriedades SWING...................................................................103
11.5. JLabel..................................................................................................................................105
11.6. JButton................................................................................................................................106
11.7. JTextField............................................................................................................................107
11.8. Icon.....................................................................................................................................108
11.9. Editando fonte com o setFont()...........................................................................................109
11.10.JMenuBar, JMenu e JMenuItem........................................................................................109
11.11.JCheckBox..........................................................................................................................111
11.12.JRadioButton......................................................................................................................113
11.13.JComboBox........................................................................................................................114
11.14.Mais Componentes Swing..................................................................................................115
Capitulo 12.Gerenciadores de Layout..............................................................................................115
12.1. Gerenciadores de Layout....................................................................................................115
12.2. BorderLayout......................................................................................................................116
12.3.BoxLayout............................................................................................................................116
12.4.FlowLayout..........................................................................................................................117
12.5.GridLayout...........................................................................................................................118
12.6.GridBabLayout....................................................................................................................119
Capitulo 13.Eventos (Listeners).......................................................................................................121
13.1.ActionListener.....................................................................................................................121
13.2.FocusListener.......................................................................................................................122
13.3.KeyEvent.............................................................................................................................123
13.4.MouseListener.....................................................................................................................124
Capitulo 14.Java e Banco de Dados: JDBC.....................................................................................133

14.1.Introduo............................................................................................................................133
14.2.Comunicao: Java e Mysql................................................................................................133
14.3.Baixando o driver JDBC......................................................................................................134
14.4.IDE Eclipse: Importando o driver JDBC para o nosso projeto............................................136
14.5.IDE NetBeans: Importando o driver JDBC para o nosso projeto........................................138
14.6.JDBC: Criando conexo com o Banco de Dados................................................................139
14.6.1.Minha primeira Conexo.............................................................................................139
14.6.2.Ajustando a classe Conexao.........................................................................................141
14.7.JDBC: Inserindo dados no banco de dados.........................................................................142
14.7.1.Criando a Classe Contato.............................................................................................142
14.7.2.Criando a Classe ContatoDao......................................................................................143
14.7.3.Usando a classe ContatoDao: Classe Agenda..............................................................145
14.8.JDBC: inserindo vrios registros.........................................................................................146
14.8.1.Sobrecarregando mtodo insereContatos.....................................................................146
14.8.2.Utilizando o mtodo que insere vrios contatos: insereContato..................................148
14.9.JDBC: Listando registros.....................................................................................................149
14.9.1.Implementando mtodo listaContatos..........................................................................149
14.9.2.Utilizando o mtodo listaContatos...............................................................................151
14.10.JDBC: Excluso de registro...............................................................................................152
14.10.1.Implementando o mtodo deletaContato...................................................................152
14.11.JDBC: Atualizao de registro...........................................................................................152
14.11.1.Implementando mtodo editaContato........................................................................153
14.12.Exerccios propostos..........................................................................................................154
Capitulo 15.Java e Banco de Dados: Hibernate...............................................................................155
15.1.Introduo............................................................................................................................155
15.2.Hibernate uma implementao ORM..................................................................................156
15.3.Arquitetura Hibernate..........................................................................................................156
15.4.Baixando o Hibernate..........................................................................................................157
15.5.Instalando o Hibernate.........................................................................................................158
15.6.Criando uma conexo com o Hibernate...............................................................................162
15.6.1.Criando o arquivo xml na raiz da pasta src utilizando o eclipse..................................162
15.6.2.Escrevendo o arquivo de configurao do Hibernate..................................................163
15.6.3.Criando o pacote conexao............................................................................................165
15.6.4.Criando e escrevendo a classe HibernateUtil...............................................................166
15.6.5.Criando e escrevendo a classe TesteConexaoHibernateMysql....................................167
15.7.Hibernate C.R.U.D de um objeto simples sem relacionamentos.........................................169
15.7.1.Criando pacote modelo................................................................................................169
15.7.2.Mapeando a Classe Contato.........................................................................................170
15.7.3.Classe ContatoDao com Hibernate: inserindo.............................................................171
15.7.4.Classe ContatoDao com Hibernate: listando................................................................173
15.7.5.Classe ContatoDao com Hibernate: buscando.............................................................173
15.7.6.Classe ContatoDao com Hibernate: removendo..........................................................174
15.7.7.Classe ContatoDao com Hibernate: atualizando..........................................................175
15.7.8.Mtodos da interface Session.......................................................................................175
15.8.Mapeamento de objetos utilizando Annotations e Hibernate..............................................177
15.9.Relacionamentos entre tabelas: Hibernate e Annotation.....................................................181
15.9.1.Modelando o Banco de Dados Relacional: Agenda.....................................................182
15.9.2.HashCode, equals e interface Serializable e sua relao como Hibernate...................184
15.9.3.Mapeamento de entidades: endereco...........................................................................185
15.9.4.Class EnderecoDao......................................................................................................188
15.9.5.Mapeamento de entidades: Telefone............................................................................190
15.9.6.Mapeamento de entidades: ContatoAnnotation...........................................................192
15.9.7.Mapeamento de entidades: Grupo................................................................................195
15.10.Consultas utilizando: Classe Criteria.................................................................................195
15.10.1.API Criteria................................................................................................................195
15.10.2.Restries com Criteria..............................................................................................196

15.10.3.Paginando Resultados................................................................................................198
15.10.4.Retornando Resultados nicos..................................................................................199
15.10.5.Ordenando Resultados...............................................................................................199
15.10.6.Associaes................................................................................................................199
15.10.7.Projeo e Agregao.................................................................................................200
15.11.Referncias bibliogrficas..................................................................................................202
Bibliografia.......................................................................................................................................204

Titulo da Apostila

Introduo
Essa apostila tem como objetivo ajudar ao aluno na disciplina de Introduo a
Programao Orientada a Objetos do nosso curso,visto que o requisito bsico para que se
possa alcanar todos os objetivo do nosso curso nesta
disciplina que o aluno tenha passado pela disciplina
de Introduo a Lgica de Programao para
Computadores. Mas no nos atearemos em barrlos,sem o pr-requisito bsico,isso porque confiamos
e acreditamos na capacidade dos nossos alunos que
com muitas fora,dedicao e vontade de vencer na
vida,conseguir ultrapassar qualquer preconceito
contra o acesso ao conhecimento tecnolgico.
O nosso objetivo principal com este material capacitar o aluno para um entendimento
critico a respeito do Paradigma de Programao Orientada a Objetos. Visto que uma das
tendncia atualmente no mercados usar esse paradigma no desenvolvimento de sistemas
em geral.
Aliado ao Software Livre que uma tendncia e uma alternativa para o mundo
corporativo no que se refere a softwares,e que tambm tem sido
atualmente desenvolvido por programadores espalhados ao redor
mundo,sendo que boa parte dessas tecnologias veem sendo
desenvolvidas utilizando ferramentas livres na maioria de seus
projetos, contribuindo para os avanos e colaborando para o acesso
de milhares de pessoas as incluses digitais no que tange as
tecnologias da informao no mundo. Daremos tambm a nossa disciplina uma nfase
maior no uso desse tipo de tecnologia,passando para os nossos alunos um modelo e uma
alternativa fantstica,que a utilizao das ferramentas livres disponveis na internet.
Primeiramente vamos estudar um pouco sobre a histria da linguagem de programao
java que iremos utilizar na nossa disciplina. Relatamos as caractersticas principais da
linguagem que para muitos ainda desconhecido, ou seja,conhecer a ferramenta antes de
domin-la de estrema importncia para os futuros programadores.
Obrigado professor! Eu sou o Tutor e os ajudarei, respondendo
as perguntas que forem surgindo ao longo do nosso curso, mas,
algumas dessas perguntas se dirija ao Instrutor que dever
auxiliar meus colegas de sala, os alunos!
Alias professor, por onde comearemos a estudar java?Nos d
uma dica!Calma!Muita calma meus colegas. Porque o ejavashow
ainda vai comear. Apresentaremos nesta apostilas no final de
cada captulo uma lista muitos dos exerccios,que muitas vezes so
aparentemente repetitivos e at mesmo redundantes. Isso
proposital: se o estudante conseguir resolver um dos exerccios
aparentemente repetidos, poder deduzir a soluo de outros mais facilmente. A criao de
vrios exerccios aparentemente redundantes tambm facilita ao instrutor na criao de
listas
de
exerccios
distintas
e
complementares.
claro! Comearemos a estudar sobre os fundamentos de programao e falaremos em
seguida sobre as estruturas bsicas da linguagem java.

Curso Java SE - UTD

Capitulo 1.

O que a linguagem java.

Bem vindos ao futuro! Java no somente uma linguagem de programao, mas sim uma
tecnologia que tem como objetivo construir programas que possam ser utilizados em qualquer
plataforma ou computador, com o mnimo possvel de dependncia com um sistema operacional
ou ambiente de desenvolvimento. Java possui uma sintaxe extremamente similar do C++, e com
diversas caractersticas herdadas de outras linguagens,como Smalltalk e Modula-3. antes de tudo
uma boa linguagem,simples,com um ambiente de execuo de alta qualidade e uma vasta
biblioteca de classes disponveis. Essa combinao que torna Java uma proposta irresistvel para
tantos programadores. Alm de contar com as seguintes caractersticas,totalmente orientada a
objetos,fortemente tipada, independente de arquitetura,robusta,segura,portvel,bem estruturada,
suporta programao distribuda, multithreaded e conta com garbage collection.

1.1. - Histrico da linguagem.


Em 1991, na empresa Sun MicroSystems ,foi iniciado o Green Project, o bero do Java
uma linguagem de programao orientada a objetos. Os mentores do projeto eram Patrick
Naughton, Mike Sheridan, e James Gosling. O objetivo do projeto no era a criao de uma
nova linguagem de programao, mas antecipar e planejar a prxima onda do mundo
digital. Eles acreditavam que em algum tempo haveria uma convergncia dos
computadores com os equipamentos e eletrodomsticos comumente usados pelas pessoas
no seu dia a dia.
James Gosling especificou uma nova linguagem de programao para o seu novo projeto
e decidiu batiz-la de Oak, que quer dizer carvalho, uma
rvore que ele podia observar quando olhava pela sua janela. O
prximo passo era encontrar um mercado para o *7. A equipe
achava que uma boa ideia seria controlar televises e vdeo por
demanda com o equipamento. Eles construram um demo
chamado MovieWood, mas infelizmente era muito cedo para
que o vdeo por demanda bem como as empresas de TV a cabo
pudessem viabilizar o negcio. A ideia que o *7 tentava vender,
hoje j realidade em programas interativos e tambm na
televiso digital. Permitir ao telespectador interagir com a
emissora e com a programao em uma grande rede a cabos,era
algo muito visionrio e estava muito longe do que as empresas de TV a cabo tinham
capacidade de entender e comprar.
O prottipo se chamava *7 (leia-se StarSeven),um controle
remoto com uma interface grfica touchscreen. Para o *7 foi
criado um mascote, hoje amplamente conhecido no mundo
Java, o Duke. O trabalho do Duke no *7 era ser um guia virtual
ajudando e ensinando o usurio a utilizar o equipamento. O *7
tinha a habilidade de controlar diversos dispositivos e
aplicaes.
A ideia certa, na poca errada. A sorte que o bom da Internet aconteceu,e rapidamente
uma grande rede interativa estava se estabelecendo. Era este tipo de rede interativa que a
equipe do *7 estava tentando vender para as empresas de TV a cabo. E, da noite para o dia,
no era mais necessrio construir a infraestrutura para a rede, em um golpe de sorte, ela
simplesmente estava l. Gosling foi incumbido de adaptar o Oak para a Internet e em
janeiro 1995 foi lanada uma nova verso do Oak que foi rebatizada para Java. A tecnologia
Java tinha sido projetada para se mover por meio das redes de dispositivos
heterogneos,redes como a Internet. Agora aplicaes poderiam ser executadas dentro dos
8

Curso Java SE - UTD

Browsers nos Applets Java e tudo seria disponibilizado pela Internet instantaneamente.
Foi o esttico HTML dos Browsers que promoveu a rpida disseminao da dinmica
tecnologia Java. A velocidade dos acontecimentos seguintes foi assustadora,o nmero de
usurios cresceu rapidamente, grandes players, como a IBM anunciaram suporte para a
tecnologia Java.

1.2. Uso da linguagem no mercado atualmente(especificao das


tecnologias).
Desde seu lanamento, em maio de 1995, a plataforma Java foi adotada mais rapidamente do
que qualquer outra linguagem de programao na histria da computao. Em 2003 Java atingiu a
marca de 4 milhes de desenvolvedores em todo mundo. Java continuou e continua crescendo e
hoje com certeza um padro para o mercado oferecendo qualidade, performance e segurana
ainda sem nenhum competidor a altura. Atualmente Java a escolha para construir sistemas
robustos, confiveis e distribudos,rodando desde grandes servidores,por isso tornou-se popular
pelo seu uso na Internet e hoje possui seu ambiente de execuo presente em web browsers,
mainframes, SOs, celulares, palmtops e cartes inteligentes,entre outros dispositivos.

1.3. Principais caractersticas da linguagem de programao


java
ORIENTAO A OBJETOS: Java uma linguagem orientada a objetos que segue a
linha purista iniciada por Smalltalk que considerada puramente O.O e que tudo nesta
so objetos. Com a exceo dos tipos primitivos da linguagem (char, int, float, etc.), a
maior parte dos elementos de um programa java so objetos.
No que rege esse paradigma,o projeto orientado a objetos
uma tcnica de programao que se concentra nos dados( =
objetos) e nas interfaces para este objeto. O cdigo
organizado
em
classes,
que
podem
estabelecer
relacionamentos de herana simples entre si, somente a herana simples permitida em
java. H uma forma de "simular" herana mltipla em Java com o uso de interfaces.
SIMPLICIDADE: Java, muito parecida com C++,mas muito mais simples. Java no possui
sobrecarga de operadores, structs, unions, aritmtica de ponteiros, herana mltipla,arquivos.h,
diretivas de pr-processamento e a memria alocada dinamicamente gerenciada pela prpria
linguagem,que usa algoritmos de garbage collection para desalocar regies de memria que no
esto mais em uso. Outro aspecto da simplicidade do Java o tamanho pequeno. Um dos objetivos
do Java permitir a construo de software que possa rodar independentemente em qualquer
mquina de pequeno porte. O tamanho do interpretador bsico e do suporte a classes de cerca de
40K bytes; adicionando as bibliotecas bsicas padro e o suporte a linhas de execuo
(essencialmente um microkenel auto-contido),tm-se outros 175 K.

SEGURA: Java foi elaborada para ser usada em ambientes de rede distribuda,

por isso permite a construo de sistemas livres de vrus e intruses. A presena de


coleta automtica de lixo, evita erros comuns que os programadores cometem
quando so obrigados a gerenciar diretamente a memria (C, C++, Pascal ).

A eliminao do uso de ponteiros, em favor do uso de vetores,objetos e


outras estruturas substitutivas traz benefcios em termos de segurana. O programador
proibido de obter acesso a memria que no pertence ao seu programa, alm de no ter
chances de cometer erros comuns tais como reference aliasing e uso indevido de
aritmtica de ponteiros. Estas medidas so particularmente teis quando
pensarmos em aplicaes comerciais desenvolvidas para a internet.
ROBUSTA: Java foi elaborada para a produo de programas que devam ser
confiveis em vrios sentido. Java pe bastante nfase na verificao rpida de
9

10

Curso Java SE - UTD

possveis problemas,na verificao dinmica posterior(em tempo de execuo),e em eliminar


situaes propensas a erros. A principal diferena entre Java e C/C++ que Java possui um
modelo de ponteiros que elimina a possibilidade de sobrescrever a memria e corromper dados.

PROCESSAMENTO DISTRIBUDO: A linguagem de programao Java possui uma


extensa biblioteca de rotinas para lidar com protocolos TCP/IP,como HTTP e FTP. As aplicaes
Java podem abrir e acessar objetos atravs da rede via URLs,com a mesma facilidade com que
acessa um sistema de arquivos local.

MULTITHREADING: Mltiplas linhas de execuo. Em Java uma surpresa agradvel e


fcil. Linhas de execuo em Java podem tambm beneficiar-se de sistemas multiprocessadores se
o sistema operacional de base o fizer. O lado ruim que as implementaes de linhas de execuo
nas plataformas mais importantes diferem radicalmente,e o Java no faz nenhum esforo para ser
neutro em relao as plataformas nesse aspecto. Somente o cdigo para chamar o multhreading
permanece o mesmo para todas as mquinas.
EXCEES: Todo programador em geral est bastante acostumado com o computador
"travando" por causa de um erro em um programa. Em C++, por exemplo, a simples tentativa de
abertura de um arquivo inexistente pode obrigar ao programador a reiniciar o computador.
Programas Java, contudo, no "do pau" no computador, j que a mquina virtual Java faz uma
verificao em tempo de execuo quanto aos acessos de memria,abertura de arquivos e uma srie
de eventos que podem gerar uma "travada" em outras linguagens, mas que geram excees em
programas Java. Em geral, ao escrever programas Java utilizando-se de herana de classes
predefinidas, fora-se em geral ao programador escrever algumas rotinas de tratamento de
exceo, um trabalho que, se de incio pode parecer forado, ir poupar o programador de bastante
dor de cabea no futuro.
GARBAGE COLLECTOR: Em Java, os programadores no necessitam preocupar-se com o
gerenciamento de memria como em C++. Em C++, todo bloco de memria alocado
dinamicamente (com new, malloc ou funo similar) deveria ser liberado
quando no fosse mais usado (com free, delete e parentes prximos). Isso
acarretava diversos problemas mesmo ao programador mais experiente, que
tinha que manter sempre um controle das reas de memria alocadas para
poder liber-las em seguida. Java, ao contrrio, utiliza-se de um conceito j
explorado pela linguagem Smalltalk, que o de garbage collection (coleta de
lixo). Sua funo a de varrer a memria de tempos em tempos,liberando
automaticamente os blocos que no esto sendo utilizados. Se por um lado isso
pode deixar o aplicativo um pouco mais lento, por manter uma thread paralela
que dura todo o tempo de execuo do programa,evita problemas como
referncias perdidas e avisos de falta de memria quando sabe-se que h megas
e megas disponveis na mquina.

COMPILADA E INTERPRETADA: Uma das caractersticas de Java que tornou-a ideal


para seu uso na elaborao de aplicativos distribudos foi a sua independncia de plataforma. Isso
porque o compilador gera um formato de arquivo de objetos neutro em relao a arquitetura,o
cdigo compilado executvel em vrios processadores,desde que haja a presena do sistema em
tempo de execuo Java. O compilador java consegue isso gerando instrues bytecode que no
tem nada a ver com uma arquitetura computacional especfica. Ao contrrio eles so elaborados
para ser de fcil interpretao em qualquer mquina e de fcil traduo para cdigo de mquina
nativo imediatamente.

10

11

Curso Java SE - UTD

MQUINA VIRTUAL : uma mquina imaginria que implementada atravs de


um software emulador em uma mquina real.

A JVM prov especificaes de plataforma de hardware na qual compila-se todo cdigo


de tecnologia Java. Essas especificaes permitem que o software Java seja uma
plataforma independente pois a compilao feita por uma mquina genrica conhecida
como JVM.
PORTVEL: Ao contrrio do C e C++ que no
existem aspectos da especificao que sejam
dependentes da implementao. Os tamanhos dos
tipos de dados primitivos so especificados,bem
como o comportamento da aritmtica neles. Por
exemplo em Java um int sempre um nmero
inteiro de 32 bits,enquanto que em C/C++, int
pode significar um inteiro de 16 bits ou um inteiro
de 32 bits. Com o tamanho fixo para tipos
numricos elimina-se a causa de grande dores de
cabea
relacionadas
a
portabilidade.
A
portabilidade em
java atingida atravs da
utilizao de bytecodes. Bytecode um formato de
cdigo intermedirio entre o cdigo fonte, o texto
que o programador consegue manipular, e o cdigo de mquina, que o computador
consegue executar. Na plataforma Java,o bytecode interpretado por uma mquina virtual
Java. A portabilidade do cdigo Java obtida medida que mquinas virtuais Java esto
disponveis para diferentes plataformas. Assim, o cdigo java que foi compilado em uma
mquina pode ser executado em qualquer mquina virtual Java,independentemente de
qual seja o sistema operacional ou o processador que executa o cdigo.
11

12

Curso Java SE - UTD

JAVA E A INTERNET: Os programas java que rodam em pginas web so chamados applets.
Para usar applets, voc precisa de um navegador web habilitado para Java,o qual executar os
bytecodes para voc. Em particular servidores de aplicao podem usar as capacidades de
monitoramento da mquina virtual java para realizar o equilbrio automtico de carga,controle de
conexes a banco de dados,sincronizao de objetos,desligamento e reinicializao seguros,alm de
outros servios necessrios para aplicaes escalveis de servios,mas que so notoriamente
difceis de se implementar corretamente. Em java, possvel escrever aplicaes
completas,inclusive acessando bancos de dados relacionais independentemente do servidor
web,bem como possvel implementar os nveis de interface com o usurio e de lgica do
negocio,utilizando um servidor de banco de dados para implementar o nvel de acesso aos dados.

Distribuio da tecnologia java: O J2SE (Java 2 Standard Edition) ou Java SE


uma ferramenta de desenvolvimento para a plataforma Java. Ela contm todo o ambiente
necessrio para a criao e execuo de aplicaes Java, incluindo a mquina virtual Java
(JVM), o compilador Java, as APIs do Java e outras ferramentas utilitrias.
JME, java Plataforma,Micro Edition (Java ME),ainda conhecida por J2ME, uma
tecnologia que possibilita o desenvolvimento de software para sistemas e aplicaes
embarcadas, ou seja, toda aquela que roda em um dispositivo de propsito
especfico,desempenhando alguma tarefa que seja til para o dispositivo. a plataforma
Java para dispositivos compactos, como telemveis, PDAs, controles remotos, e uma outra
gama de dispositivos.
Java EE (ou J2EE, ou Java 2 Enterprise Edition, ou em portugus Java Edio
Empresarial) uma plataforma de programao de computadores que faz parte da
plataforma Java. O JEE (Java Enterprise Edition) a plataforma Java voltada para
redes,internet, intranets e afins. Assim,ela contm bibliotecas especialmente desenvolvidas
para o acesso a servidores,a sistemas de e-mail,a banco de dados,etc. Por essas
caractersticas,o JEE foi desenvolvido para suportar uma grande quantidade de usurios
simultneos. A plataforma JEE contm uma srie de especificaes,cada uma com
funcionalidades distintas. Que so:

JDBC (Java Database Connectivity), utilizado no acesso a banco de dados.

JSP (Java Server Pages),um tipo de servidor Web. Os servidores web so as


aplicaes que permitem a voc acessar um site na internet.

Servlets,para o desenvolvimento de aplicaes Web,isto ,esse recurso "estende" o


funcionamento dos servidores web,permitindo a gerao de contedo dinmico nos
sites.

1.4. Ambientes e ferramentas de desenvolvimento com java.


A tecnologia java fornece como ambiente de desenvolvimento um grande conjunto de
ferramentas que engloba: um compilador,um interpretador,um gerador de
12

13

Curso Java SE - UTD

documentao,ferramenta de empacotamento de classes de arquivos e outros.

1.4.1.

Instalao do JDK ou SDK e JRE e suas configuraes.

A Sun a empresa proprietria do Java que atualmente pertence a empresa (Oracle). Ela
disponibiliza, basicamente, duas verses de sua mquina
virtual: o JRE (Java Runtime Environment) e JDK (Java
Development Kit). O JRE contm a mquina virtual que
permite rodar programas feitos na linguagem Java em
uma mquina. O JDK, por sua vez, um pacote para
desenvolvedores programarem suas aplicaes em Java,
possuindo vrios utilitrios, inclusive compilador e
bibliotecas. Uma das verses mais usadas do Java foi a
1.4.x, que possua inclusive um visual um pouco (para ser
modesto) rstico. Mais para frente a Sun lanou a verso
1.5.0, com vrias melhorias em termos de programao e
um visual um pouco melhor. Foi lanado em dezembro
do de 2006 o Java 1.6.0, conhecido tambm como Java 6,
que trouxe,finalmente,uma integrao total com o
desktop em termos visuais,e vrias melhorias tambm
para quem programador.
Mustang o nome dado para a nova verso 6 de Java,que saiu no final do ano passado.
Entre as novidades mais conhecidas esto o suporte a linguagens de script, melhores ferramentas
para o monitoramento de aplicaes Java e mais integrao com o sistema operacional. Mas o qual
realmente a diferena entre o JDK e Java SDK? : O kit de desenvolvimento para java (Sofware
Development Kit). Trata-se de um conjunto de softwares para programadores em java que voc no
precisa instalar se sua inteno for apenas usar os programas feitos em java. Para rodar os
programas em java basta instalar o JRE (Java Runtime Environment) .
http://www.guiadohardware.net/tutoriais/java-linux/

1.5. Meu primeiro programa em java


Como java uma linguagem que primeiramente compilada e em seguida interpretada.
Para compilar e executar um programa escrito nessa linguagem devemos o primeiro
construir o arquivo como o cdigo fonte,que deve ter como extenso .java. Que no caso do
exemplo o arquivo foi chamado de HelloWorld.java. Em seguida,o cdigo fonte
compilado e um programa fonte em bytecodes (HelloWorld.class) gerado. Durante a
compilao, h uma checagem de erros do cdigo fonte. O fonte em bytecodes s ser
gerado se nenhum erro tiver sido detectado. Por fim, qualquer dispositivo que execute java
ser capaz de interpretar este novo arquivo fonte e executar a aplicao. Os bytecodes so
lidos e executados (ou seja, interpretados) pela Mquina Virtual Java (JVM Java Virtual
Machine) em um computador,em um celular, etc., alm de serem independentes de
plataforma.
A gerao dos bytecodes ou,
para o exemplo, do arquivo
HelloWorld.class feita a partir da
execuo do comando javac
HelloWorld.java.
Ento,
o
prximo passo fazer com que a
JVM
execute
o
arquivo
HelloWorld.java, atravs do comando java HelloWorld.class . Dessa maneira,a JVM
traduz o cdigo compilado para uma linguagem que a mquina entenda e o programa
executado,por isto os programas em java podem executar em qualquer plataforma de
13

14

Curso Java SE - UTD

hardware ou software que possua uma verso da JVM. A Mquina Virtual java definida
como uma mquina imaginria implementada atravs da emulao em um software
executado em uma mquina real. Ela possui uma arquitetura que permite garantir
segurana. Quando um programa Java executado,seus bytecodes so verificados pela
JVM para que estejam de acordo com os seus requisitos de segurana,impedindo a
execuo de cdigo com alguma irregularidade. Assim,cdigos-fonte com instrues que
acessem reas restritas da memria ou at mesmo recursos do hardware no so
executados pela JVM.

A palavra public indica que a classe ter um nvel de acesso pblico, ou seja, que ela
ser acessvel por qualquer classe. A palavra class indica que uma classe est sendo
declarada e seu nome HelloWorld. A { delimita o limite inicial da classe.

A palavra public j foi descrita, portanto permite que o mtodo seja acessado
publicamente. A palavra static ser descrita posteriormente. O lugar onde fica a palavra
void onde se deve indicar o tipo de retorno do mtodo. Neste caso, no retorna nenhum
valor, dessa maneira o mtodo declarado como void. O conjunto String[] args
presentes entre ( ) so os argumentos do mtodo. Neste exemplo,o mtodo possui um
nico argumento (um vetor de Strings denominado args. A { delimita o limite inicial do
mtodo.
A terceira linha consiste no contedo do mtodo principal, formado apenas por um
comando,ou uma instruo que composta de uma ou mais linhas terminadas por ponto e
vrgula. Exemplo:

O System.out.println usado para exibir algo na sada padro, por padro, na linha de
comando. Ser exibido o que tiver entre (), no caso,Hello world. No final deste comando, temse um; que o finaliza. Por fim,h duas fecha chaves } } , que delimitam o fim do mtodo e da
classe,respectivamente.

Blocos de cdigo: Um bloco formado por


uma ou mais instrues agrupadas entre chaves indicando que formam uma s unidade.
Blocos podem ser organizados em estruturas aninhadas
Indefinidamente. Qualquer quantidade de espaos em branco permitida. Um exemplo
de bloco cdigo mostrado ao lado ilustra perfeitamente como so organizadas as estruturas de
blocos.

14

15

Curso Java SE - UTD

1.5.1. Comentrios em Java:


Comentrios so notas escritas pelo programador para fins de documentao. Estas
notas no fazem parte do programa e no afetam o fluxo de controle. Java suporta trs
tipos de comentrios: comentrio de linha estilo C++,comentrio de bloco estilo C e um
comentrio estilo Javadoc (utilizado compor a documentao do programa).
Comentrio de linha: Comentrios com estilo em C++ se iniciam por "//". Todo e
qualquer texto colocado aps as // ignorado pelo compilador e tratado como comentrio.
Por exemplo:

Comentrio de bloco: Comentrios com estilo em C,tambm chamados de


comentrios multi-linhas,se iniciam com /* e terminam com */. Todo o texto posto entre
os dois delimitadores tratado como comentrio. Diferente do comentrio estilo C++, este
pode se expandir para vrias linhas. Por exemplo:

Comentrio estilo Javadoc: Este comentrio utilizado na gerao da


documentao em HTML dos programas escritos em Java. Para se criar um comentrio em
estilo Javadoc deve se iniciar o comentrio com /** e termin-lo com */. Assim como os
comentrios estilo C, este tambm pode conter vrias linhas. Este comentrio tambm
pode conter certas tags que do mais informaes documentao. Por exemplo:

1.5.2.

Compilando meu primeiro programa em Java

1- Passo: Para compilarmos o nosso primeiro programa em Java utilizamos o seguinte


comando javac seguindo do
nome da classe (ponto) .java
2- Passo: Para executarmos
o nosso primeiro programa em Java utilizamos o seguinte comando Java, seguido do nome da
classe.

Nesse segundo exemplo vamos usar um editor de texto qualquer para editor o cdigofonte do nosso segundo exemplo e vamos compilar usando terminal(Konsole) do sistema
operacional.

15

16

Curso Java SE - UTD

Compilando nosso 2 exemplo com o comando javac

Executando nosso 2 exemplo com o comando java

Obs.: Cuidados importantes a serem tomados:


Se o javac reclamar que no acha a classe HelloWorld.java, porqu voc no est no
diretrio correto ou salvou o arquivo em outro lugar.
Se o javac reclamar de algum erro no fonte, porque voc digitou algo errado. No troque
letras maisculas por minsculas e vice-versa, em nenhuma parte do cdigo!
Finalmente, ANTES de chamar o seu instrutor para ele inserir um ; ou fechar uma chave
no seu cdigo, revise mais uma vez o seu cdigo completamente.

1.5.3.

Dicas para resoluo de problemas em programas java

Se digitar o programa na mo,certifique-se de prestar ateno as letras maisculas e


minsculas. Em particular um nome de classe por exemplo.
Se receber uma mensagem como Bad command or file name ou javac command not
found,volte e verifique novamente a sua instalao,em particular a configurao do caminho de
execuo.
O compilador requer um nome de arquivo (Teste.java) por exemplo. Quando voc rodar o
programa,voc especifica um nome de classe (Teste) sem a extenso .java nem .class.
Se o compilador javac relatar um erro connot read: Teste.java ,voc deve verificar se
esse arquivo est presente no diretrio.
Se houver erros demais em seu programa,todas as mensagens de erros voaro pela sua
tela muito rapidamente. O compilador envia as mensagens de erro para a sada padro;ento, um
pouco complicado captur-las se elas ocuparem mais espao do que a janela pode exibir.

1.6. Erros comum em programas java


1.6.1.

Erros em java:

Durante o desenvolvimento de programas, muito comum que erros podem ocorrer,em java
pode ser em dois domnios: tempo de compilao e tempo de execuo.

16

17

Curso Java SE - UTD

1.6.2. Erro em tempo de compilao :


Erros ocorridos durante a fase de compilao ocorrem quando se executa o javac, e so fceis de
corrigir. H dois tipos:
Erros de processamento do arquivo (parsing): ponto e vrgula faltando,parnteses,
aspas, chaves ou colchetes descasados. Identifica apenas o arquivo e a linha onde o erro
pode ter iniciado. Um erro causa vrios outros e nem sempre a mensagem precisa.
Erros de compilao do cdigo,realizada depois do parsing: alm da linha e do
arquivo, identificam a classe e mtodo. Geralmente as mensagens so bastante
elucidativas.
1.6.3. Erro em tempo de execuo:
Erros que ocorrem durante o tempo de execuo (runtime) ocorrem quando se executa o

interpretador java, e so muito mais difceis de localizar e consertar.

Exception in thread "main": NoClassDefFoundError: Classe: a classe "Classe" no

foi encontrada no CLASSPATH.

Exception in thread "main": NoSuchMethodError: main: o sistema tentou


chamar main() mas no o encontrou.
ArrayIndexOutOfBoundsException: programa tentou acessar vetor alm dos
limites definidos,ou negativo.
NullPointerException: referncia para objeto nula,ou varivel de um tipo objeto

foi declarada mas no inicializada.

1.7. Netbeans
O termo IDE em ingls,que quer dizer(Integrated
Development Environment). O NetBeans IDE um
ambiente de desenvolvimento integrado e est
disponvel para Windows, Mac, Linux e Solaris. O
projeto NetBeans consiste em um IDE de cdigofonte aberto e uma plataforma de aplicaes que
permitem
que
os
desenvolvedores
criem
rapidamente aplicativos web, corporativos, desktop e
aplicaes mveis utilizando a plataforma Java,bem
como JavaFX, PHP, JavaScript e Ajax Ruby e Ruby on Rails , Groovy e Grails, e C / C + +. O

projeto do NetBeans apoiado por uma vibrante comunidade de desenvolvedores e oferece


uma extensa documentao e treinamento de recursos, bem como uma diversificada
seleo de terceiros plugins .
IDE 6.9 introduz o JavaFX, Compositor uma ferramenta visual para construo de
layout visual JavaFX aplicativos, interface grfica semelhante ao construtor de GUI Swing
para aplicaes Java. SE NetBeans Outros destaques incluem OSGi Plataforma de
interoperabilidade para aplicaes NetBeans e apoio para o desenvolvimento de bundles
OSGi com Maven, o apoio JavaFX SDK, Framework Zend para PHP e Ruby on Rails 3.0,
bem como melhorias no editor de Java, Java Debugger problema de rastreamento,e muito
mais. Para baixar o netbeans acesse o site do link:
http://www.netbeans.org/

17

18

Curso Java SE - UTD

1.8.Viso de outras IDEs para o desenvolvimento com java


1.8.1. IDE Eclipse
O Eclipse uma IDE para o desenvolvimento aplicaes
Java,ele tambm pode ser usado para o desenvolvimento de
aplicaes utilizando outras linguagens como PHP, C++, etc. O
Ambiente de desenvolvimento multi linguagens de programao
cujo projeto patrocinado pela IBM. bastante flexvel e integra
com vrios projetos bastante comuns na comunidade java tais como cvs
(versionamento),ant(scripts) e junit (testes unitrios). No possui ainda um bom editor visual de
interface grfica. O atual, chamado visual editor (VE) funciona com SWT e Swing mas ainda est na
verso 0.5. O desenvolvimento J2EE vivel com o uso de plugins obtidos de terceiros. Nesta
apostila no iremos nos aprofunda nessa IDE,mas pode baixar e instalar no seu sistema par criar
seus projeto de programao com java usando a IDE Eclipse. O Eclipse atualmente encontra-se na
verso 3.6 chamada de HELIOS,para baix-lo acesse o seguinte link ao lado:
http://www.eclipse.org/

1.8.2.

A IDE Bluej
BlueJ um ambiente de desenvolvimento java projetado
especificamente para o ensino em um nvel introdutrio. BlueJ foi
projetado e implementado pelas equipes das universidade Monash

University,Melbourne,Australia e The University of Southern


Denmark,Odense. Maiores informaes sobre BlueJ esto disponveis no
site oficial (http://www.bluej.org). O BlueJ um excelente ambiente
para o fim a que se destina: a aprendizagem da programao orientada
pelos objetos utilizando a linguagem Java. No entanto e especialmente quando utilizada uma
linguagem muito popular como a linguagem Java,o desenvolvimento de programas feito
utilizando IDEs muito mais complexos e sofisticados. Tal necessrio para lidar com a
complexidade de muitos dos programas atuais.
Estes atingem frequentemente dezenas de milhares de linhas de cdigo e, em alguns casos,
muitas, muitas mais. Tal implica a utilizao de vrias ferramentas de auxlio ao desenvolvimento
de cdigo. BlueJ 3.0.4,uma verso de manuteno que inclui uma srie de correes de erros
importantes,est agora disponvel para download.

1.8.3.

A IDE Gel

um editor pequeno e rpido.Escrito em Delphi para computadores com Windows. Destaca


sintaxe para java,jsp,xml, html entre outras gramticas, facilita o gerenciamento de projetos,
mantm histrico local de mudanas, possui suporte a CVS, JUnit e Ant entre outras facilidades.
Livre para uso comercial.Mais
informaes sobre essa IDE
visite o site:
http://www.dukeduck.com.br/

1.8.4.

A IDE Jdeveloper

Uma das principais opes open source,uma terceira boa


opo existe desde que a Oracle tornou seu IDE Jdeveloper
totalmente gratuito. Isso devido ao fato de a Oracle tornar
open source dois frameworks de desenvolvimento Java: o
mecanismo de persistncia Oracle TopLink (se tornou a base da implementao de
referncia JPA do Glassfish) e os componentes JavaServer Faces (JSF) Oracle ADF
Faces,parte do Oracle Aplication Development Framework. So dois timos recursos e o
seu uso no desenvolvimento est totalmente integrado e suportado no Oracle JDeveloper.
18

19

Curso Java SE - UTD

O Oracle JDeveloper assim uma opo gratuita abrangente e amadurecida para o


desenvolvimento Java corporativo,principalmente em ambientes onde produtos Oracle j
so utilizados (Database Server,BI,Application Server,Portal). http://www.oracle.com/
Nota: Muito bem! A partir daqui fica a critrio de seu instrutor a utilizao ou no de
uma IDE de desenvolvimento de software durante o curso da nossa disciplina. Uso de
uma IDE vai nos facilitar em muito pontos importantes,dentre eles a aproximao com
uma ferramenta utilizada no mercado de trabalho atualmente,vai tornar o aluno mais
preparado para enfrentar as dificuldades decorrentes de programar em um simples
editor de texto e prompt,mas,tambm muito importante que vocs aprendam a
compilar seus programa no Console(prompt de comandos)para da ento ficarem
habilitados a seguerem programando em java. Fica ai o recado e bons trabalhos.Vamos
usar a IDE netbeans. Segue um toturial sobre o netbeans que ser repassado antes.

1.9. Identificadores e palavras-chaves.


Java uma linguagem centrada nos pacotes; os desenvolvedores da
linguagem assumiram que, para uma boa organizao de nomes, seria
fundamental na estrutura de programas em java. Imagine o seguinte
pesadelo:trs programadores,na mesma empresa,mas trabalhando em
diferentes partes de um projeto,escrevem cada um uma classe chamada
Utilitrios. Se essas trs classes Utilitrios no tiverem sido declaradas em
nenhum pacote explcito, e estiverem no classpath,no seria possvel dizer ao compilador
ou JVM qual das trs classes est tentando referenciar.
Identificadores legais so regras que o compilador usa para determinar se um dado
nome legal. Em Java,os identificadores devem ser compostos apenas por caracteres.
Unicode,nmeros,smbolos de moedas e caracteres de conexo como underscore.
Regras vlidas:
Devem iniciar com uma letra,smbolo comercial cifro ($) ou underscore (_);
Aps o primeiro carcter podem ter qualquer combinao de letras, caracteres e

nmeros;
No possuem limite de tamanho;
No podem ser palavras reservadas restritas da linguagem;

Em Java os identificadores so case-sensitive isto , JAVA totalmente


diferente de java isso porque o compilador diferencia maisculos de minsculos.

Palavras-chave : So identificadores que, em Java, foram pr-definidas com


propsitos especficos. No se pode usar esses identificadores como nomes de variveis,
mtodos, classes, etc. A seguir, temos a lista com as palavras-chave em Java.
19

20

Curso Java SE - UTD

Nota: true, false e null no so palavras-chave, porm, so palavras reservadas, e, da


mesma maneira, no permitido seu uso na atribuio a nomes de variveis, mtodos
ou classes.

1.10.Tipos primitivos:
Todo programa de computador deve ser capaz de lidar com dados para conseguir fazer
seus processos como, por exemplo, somar,
multiplicar, dividir, etc. Usar atributos a melhor
forma de manipular os dados. Os tipos de dados
so o que definem a quantidade de memria do
computador que ser utilizado para guardar tal
dado. As variveis primitivas pode ser declaradas
como variveis de classe(static), variveis
instncias, parmetros de mtodos ou variveis
locais. Uma vez declarado, seu tipo primitivo no
pode nunca ser modificado,embora na maioria dos
casos seu valor possa se modificar. Java um
linguagem fortemente tipada. Isso significa que toda varivel deve ter um tipo declarado.
Existem oito tipos primitivos em java. Quatro deles so do tipo inteiros; dois so do tipo de
nmeros de ponto flutuante; um o tipo de caracteres char,usado para unidades de cdigo
no esquema de codificao Unicode e um deles do tipo lgico para valores
true/false(verdadeiro/falso).

1.10.1.

Uso de valores literais de todos os tipos de dados existentes.

Um literal primitivo simplesmente a representao do cdigo-fonte dos tipos dados


primitivos em outros palavras um inteiro,um nmero de ponto flutuante,um boolean ou
caracteres que voc digite enquanto escreve um cdigo.

1.10.1.1.

Literais Inteiros:

H trs maneiras de representar nmeros na linguagem Java: decimal (base 10), octal
(base 8) e hexadecimal (base 16).

20

21

Curso Java SE - UTD

1.10.1.2.

Literais decimal:

Os inteiros decimais no precisam de explicao,eles so representados da maneira


tradicional,sem prefixo de nenhum tipo, como no exemplo abaixo:

1.10.1.3.

Literais octal:

Os inteiros octais usam somente dgitos de 0 a 7. Em Java, o inteiro representado na


forma octal com a incluso de um zero na frente do nmero, veja o exemplo abaixo:

1.10.1.4.

Literais hexadecimal:

Os nmeros hexadecimais so construdos com o uso de 16 smbolos distintos. J que


no foram criados smbolos numricos unitrios para os algarismos que vo de 10 a 15,
usamos caracteres alfanumricos para representar esses dgitos.

Na Java linguagem todos os literais inteiros(octal, decimal e hexadecimal) so definidos


como int (ou seja inteiros) por padro, mas tambm podem ser representados como Long
com a incluso de um sufixo L ou l depois do nmero:
Exemplos.

Os tipos de dados inteiros que so os mais conhecidos e mais simples. Em Java, os


nmeros inteiros so divididos em quatro tipos: byte, short, int e long.
O tipo byte o de menor alcance entre os inteiros. Como o prprio nome sugere, ele
consome apenas um byte (8 bits) e pode guardar valores entre -128 e 127.

O tipo short guarda inteiros de 2 bytes (16 bits) e pode guardar nmeros entre -32.768 a
32.767.

21

22

Curso Java SE - UTD

O tipo int o tipo de dado mais comum. Ele consome 4 bytes (32 bits) e guarda valores
entre -2.147.483.648 e 2.147.483.647.

Long o tipo de dado com maior alcance entre os inteiros. Consequentemente,tambm


o que ocupa mais espao (8 bytes ou 64 bits). Tem um grande alcance que fica entre
-9,22E+18
(exatos
-9.223.372.036.854.775.808)
e
9,22E+18
(exatos
9.223.372.036.854.775.807).

1.10.1.5.

Literais de ponto flutuante:

Os nmeros de ponto flutuante so definidos com um nmero,um smbolo decimal e os


outros nmeros que representam a frao. Para nmero decimais fracionrios com grande
preciso ou valores extraordinrios (geralmente utilizados em matemtica aplicada e
complexa como clculos fsicos, qumicos, astrolgicos, meteorolgicos, etc) utilizamos o
tipo de dado double.
Double o tipo de dado mais complexo que existe em Java e o maior valor possvel de
se armazenar 1,797.693.134.862.315.7E+308. Muito mais do que qualquer programador
precisa.

Float os literais de ponto flutuante so definidos Double (64 bits) por


padro,portanto,se desejarmos atribuir um literal de ponto flutuante a uma varivel float
(32 bits), ter que anexar o sufixo F ou f ao nmero. Se no o fizer, o compilador reclamar
de uma possvel falta de preciso,porque estar tentando inserir em um container
(potencialmente) menos preciso.

1.10.1.6.

Literais booleanos:

Os literais booleanos so a representao do cdigo-fonte para valores boolean. Um


valor boolean s poder ser definido como true ou false.

22

23

Curso Java SE - UTD

1.10.1.7.

Literais de caracteres:

O literal char representado por um nico caractere entre aspas simples. Eles podem
tambm representar valores Unicode do caractere,usando a notao Unicode que
acrescenta o prefixo \u ao valor,atribuir um literal numrico,contanto que ele esteja no
intervalo de 16 bits sem sinal (65535 ou menor).
Vlidos:

Invlidos:

1.10.1.8.

Literais para String:

O literal de string a representao do cdigo-fonte para o valor de um objeto String.


Embora as strings no sejam primitivas,foram includas neste capitulo porque so
utilizadas para representar valores literais,em outras palavras,digitadas diretamente no
cdigo. Veremos mais sobre Strings no capitulo 9.
Exemplo 01:

23

24

Curso Java SE - UTD

1.11. Operadores em Java:


Os operadores em Java produzem novos valores a
partir de um ou mais valores ,os quais so itens
esquerda ou a direita do operador. O resultado da
maioria das operaes um valor boleano ou numrico.
importante lembrar que na linguagem Java no
possvel sobrecarregar os operadores. Um dos objetivos
da linguagem java a portabilidade. por isto muitos processadores da intel computam x * y
e deixam em registrador de 80 bits,em seguida dividem por z e finalmente truncam o
resultado de volta para 64 bits. Isso pode gerar um resultado mais preciso e pode evitar o
estouro de exponentes. Mas o resultado pode ser diferente de uma computao que usa 64
bits o tempo todo.
Por esse motivo a especificao inicial da mquina virtual java exigia que todas as
computaes fossem truncadas. No somente as computaes truncadas podem causar
estouro,como tambm so,na verdade mais lentas do que as computaes mais
precisas,porque a operao de truncamento demorada. Por essa razo, a linguagem de
programao java foi atualizada para reconhecer as exigncias conflitantes de desempenho
otimizado e reprodutibilidade perfeita.

1.11.1.Operadores de atribuio composto.


Os
operadores
de
atribuio
compostos
permitem
que
os
programadores
preguiosos
economizem
algum
trabalho
de
digitao. Na verdade, existem cerca de
11
operadores
de
atribuio
composto,mas apenas os 4 mais
comumente usados so:(+= , -= , *= , /=
).

Exemplo sem usar operador composto:

Exemplo usando
operador composto:

24

25

Curso Java SE - UTD

Nota: Importante lembrar que as duas atribuies mostradas do no mesmo resultado


que as duas primeiras.

1.11.2.

Operadores de comparao.

= = igual a.
! = diferente de.

Na linguagem java so utilizados dois operadores de comparao(chamados tambm de


operadores de igualdade ou desigualdade) que compara dois itens semelhantes e retornam
um valor booleano que representa o que verdadeiro sobre os dois itens serem iguais.
Exemplo utilizando o operador de igualdade:

Exemplo 02:

Exemplo utilizando o operador de diferente:

Exemplo 02:
25

26

Curso Java SE - UTD

1.11.3.

Igualdade de tipos primitivos :

A maioria dos programadores java esto familiarizados com a comparao de valores


primitivos. Isso porque cada comparao pode envolver dois valores nmeros (incluindo o
tipo char),dois valores booleanos ou duas variveis de referncias de objetos. O que no
pode ser comparado: no possvel comparar tipos dados incompatveis,por exemplo se
um tipo boolean igual a um tipo char. Existem quatro tipos de itens que podemos testar:
Nmeros
Caracteres
Tipos booleanos primitivos
Variveis de referncias de objeto; porm importante lembrar que o operador
(==) examina o valor da varivel,ou seja o padro de bits.

1.11.4.

Igualdade de variveis de referncias:

As variveis de referncias podem ser testadas com o operador (==) para sabermos se
esto referenciando um objeto em comum. Mas muito importante ressaltar que o mesmo
operador estar examinando os bits da
varivel,portanto com relao as
variveis de referncias, se os bits das
duas variveis forem idnticos, elas
estaro referenciando (apontando) o
mesmo objeto.

Neste exemplo do cdigo acima, foi criado trs variveis de referncia a partir da classe
Funcionrio. As duas primeiras f1 e f2, so objetos de Funcionrio diferentes, que por
acaso tem o mesmo valor inicial, a terceira varivel de referncia f3, inicializada para
referenciar o mesmo objeto que a varivel f1 est referenciando. O operador == no testar
se dois objetos so significativamente equivalentes,isso porque ele compara os bits das
variveis,ento as referncia de memrias das variveis no soa iguais.

26

27

Curso Java SE - UTD

1.11.5.

Operador Instanceof:

Permite-nos saber se um objeto pertence a uma classe ou no,ou seja se o objeto passa
no teste -um. Este operador usado somente com variveis de referncias de objetos, e
pode ser empregado para verificar se um objeto do tipo especfico. Quando tratamos de
tipos, queremos dizer tipo de interface ou classe. Em outras palavras,se o objeto
referenciado pela varivel esquerda do operador passaria no teste -um do tipo de
interface ou classe do lado direito do operador.
Sintaxe do operador instanceof:
if (tipo_1 instanceof tipo_2)
{
/**bloco de cdigo aqui...*/
}

Exemplo 01.

Exemplo 02.

Nota: Neste exemplo acontece um erro de compilao;isso porque a varivel [ e ] do


tipo String e no do tipo Funcionrio,nesse caso as classes no participam da rvore de
herana.
Exemplo 03:

27

28

Curso Java SE - UTD

1.11.6.

Operador concatenao de strings:

O sinal de adio(+) tambm pode ser usado para concatenar duas strings. Se um dos
valores for uma String, o operador + atuar como um operador de concatenao de
Strings. E se os dois valores forem nmeros, o operando + funcionar como o operador de
adio.
Exemplo 01.

Resultado do cdigo acima, executado dentro de uma classe que possua o mtodo
main().

Exemplo 02. Resultado do cdigo ser mostrado ao lado,executado dentro de uma classe
que possua o mtodo main().

1.12. Operadores aritmticos.

28

29

Curso Java SE - UTD

Eles podem ser usados da maneira padro. Exemplos:

1.12.1.

Operador resto (%) :

O operador resto da diviso divide o operando a esquerda pelo direito com o resultado
sendo o resto dessa diviso.

1.12.2.

Operadores de Incremento e Decremento:

So os operadores que nos permitem incrementar as variveis em uma unidade. Podem


ser usados diante ou atrs da varivel dependendo das necessidades, ou seja, se
precisarmos que se incremente ou vice-versa antes de utilizar ou o contrrio.

Exemplo 01:

OBS:

R1 temos o resultado = 5, pois nesse caso, primeiro imprimimos o valor original da


varivel, logo em seguida incrementamos o valor.

R2 temos o resultado = 6, pois nesse caso, mostramos a varivel incrementada pelo


comando interior, porm nesse momento no alteramos o valor da varivel.

R3 temos o resultado = 7, pois nesse caso, incrementamos primeiro a varivel,


29

30

Curso Java SE - UTD

depois mostramos a varivel incrementada.


Podemos ter um processo semelhando com o decremento.
Exemplo 02:

OBS: A diferena que nesse caso podemos visualizar os resultados, 5,4 e 3;

30

31

Curso Java SE - UTD

1.12.3.

Exerccio resolvido

01 Crie um programa em java que decremente uma varivel 4 vezes e mostre cada
parte do calculo,sendo que a varivel se inicia com valor igual a 5.

1.12.4.

Operadores relacionais:

Os operadores de relacionais de comparao sempre resulta em um valor booleano (true


ou false). Esse valor booleano usado com mais frequncia em teste if. Java possui quatro
operadores de comparao que podem ser usados para comparar qualquer valores
inteiros,numricos de pontos flutuantes ou caracteres.

1.12.5.

Operadores lgicos.

Expresses lgicas so aquelas que realizam uma operao lgica (ou, e, no, etc...) e
retorna verdadeiro ou falso. A linguagem java especificam seis operadores lgicos (! , & , | ,
^ , && , || ).

31

32

Curso Java SE - UTD

1.12.6.

Os operadores Bitwise :

Os operadores (^ , & , | ) so chamados de operadores de Bitwise. Esses operadores


comparam duas variveis bit por bit, e retornam uma varivel cuja os bits foram definidos
com base em se as duas variveis sendo comparadas tinham bits correspondentes. Eles
podem ser : ambos ligados (&), um outro ligado (|), ou ou exatamente um ligado (^).

1.12.7.

Operadores lgicos de abreviao:

O operador de abreviao (&&) consiste no fato de ele no perder seu tempo avaliaes
inteis.O operador de abreviao (&&) avaliar o lado esquerdo da operao (operando
um) e se esse operando tiver um resultado false, ele no examinar o lado direito da
equao(operando dois),j que o operador saber que a expresso completa no ser true.
AND abreviao (&&)
OR abreviao (||)

Exemplos:

32

33

Curso Java SE - UTD

1.12.8.

Operadores lgicos ^ e !:

O operador lgico ^(ou exclusivo) avalia valores booleanos. O operador ^ relaciona-se


com os operadores de no-abreviao,no sentido de que sempre avalia ambos os valores,o
do lado direito e o do lado esquerdo,em uma expresso. Para uma expresso OU
exclusivo(^) ser verdadeira,exatamente um operando precisa ser true. Exemplo.
^ OR exclusivo (xor)
! inverso boleana.

Exemplos:

Nota: A expresso acima avalia como false porque tanto o primeiro operando (2<3)
quanto o segundo(4>3) avaliam como true.

Exemplos 01:

Exemplos 02:

1.12.9.

Operadores condicionais.

O operador condicional um operador ternrio tem trs valores usado para avaliar
expresses boleanas de modo semelhante a instruo IF ,exceto por em vez de executar um
bloco de cdigo se o resultado do teste for true,atribuir um valor varivel. Ou seja
objetivo do operador condicional decidir qual dos valores atribuir a uma varivel.Ele
constitudo dos smbolos ?(ponto de interrogao) e (dois pontos),os parnteses so
opcionais.Veja a sintaxe:
X = (expresso boleana) ?valor a atribuir se true : valor atribuir se false
Exemplo 01.

33

34

Curso Java SE - UTD

Exemplo 02.

Exemplo 03.

1.12.10.

Operador Ternrio

Operador ternrio ou operador condicional tem objetivo de atribuir um valor a uma


varivel de acordo com o resultado de um teste lgico.
Vejamos a sintaxe:
Teste lgico (?) valor se for verdadeiro (:) valor se for falso.
O teste lgico qualquer expresso que pode ser avaliado como verdadeiro ou falso
Exemplo 01:

34

35

Curso Java SE - UTD

1.12.11.

Precedncia de Operadores

A precedncia serve para indicar a ordem na qual o compilador interpretar os


diferentes tipos
de operadores, para que ele sempre tenha como sada um resultado coerente e no
ambguo.
ordem

operador

() parnteses

++ ps-incremento e - - ps-decremento

++ pr-incremento e - - pr-decremento

! negao lgica

* Multiplicao e / diviso

% Resto da diviso

+ soma e - subtrao

< menor que, <= menor igual, > maior que, >= maior igual

== igual e ! = no igual

10

& AND binrio

11

| OU binrio

12

^ OU exclusivo binrio

13

&& AND lgico

14

|| OU lgico

15

?: condicional

16

= atribuio

35

36

Curso Java SE - UTD

Capitulo 2.

Controle de fluxo em java.

As estruturas de controle definem a sequncia de execuo das instrues. No


possvel implementar um algoritmo que no seja trivial em uma linguagem de
programao que no tenha um conjunto mnimo de estruturas de controle. As estruturas
de controle podem ser divididas em seleo, repetio e sequncia. A sequncia
simplesmente definida pela execuo sequencial dos comandos, de cima para baixo.

2.1. Utilizar cdigo que use instrues if


A expresso entre parnteses deve ter como resultado um valor booleano true ou false.
Normalmente testar algo para saber se verdadeiro, seguida executar um bloco de
cdigo (uma ou mais instrues) se o resultado for mesmo verdadeiro e opcional outro
bloco de cdigo se no false. Sintaxe da declarao if:

Fluxograma da declarao if.

2.1.1.

Expresses vlidas para instrues if

Exemplos 01:
Neste exemplo ambas as instrues so avaliadas como verdadeira tanto a do lado
direito quanto a do lado esquerdo, pois, o valor da varivel x for maior do que o valor da
varivel y, ento o bloco de instruo executado, e a mensagem ser imprimida na sada
padro.

Exemplos 02:

36

37

Curso Java SE - UTD

Neste outro exemplo a instruo avaliada como true, pois, o valor da varivel teste
false,mais quando o fluxo entra no if a varivel teste recebe true, logo bloco de instruo
ser executado e resultando impresso na sada padro.

2.1.2. Expresses vlidas para instrues if-else


A declarao if-else usada quando queremos executar determinado conjunto de
instrues se a condio for verdadeira e outro conjunto se a condio for falsa.

Sintaxe da declarao if-else.

Fluxograma da declarao if else.

Notas: Nestes exemplos a instruo do lado esquerdo avaliada como verdadeira, pois, o
valor da varivel x no maior do que o valor da varivel y e a instruo do lado direito
tambm avaliada como verdadeira, pois a varivel teste tinha valor inicial false, mas
dentro da instruo atribudo um novo valor igual a true, logo bloco de instruo tanto
da esquerda como o da direita sero executados,atribuindo um novo valor para a varivel y
igual a 25 imprimindo o valor de y na sada padro.
Exemplos 01:

Notas: Nestes exemplos ambas os cdigo do if sero avaliada como verdadeira,ento ela
executa a instruo imprimindo teste 1. Se as instruo if fosse falsa ele executariam o
eles,imprimindo teste 2,mas no nosso caso foram verdadeiras.

37

38

Curso Java SE - UTD

Regra para o uso do else e de else if


- Pode ter um ou nenhum else para if, e ele deve vir depois de quaisquer instrues else
if.
- Pode ter de muitos ou nenhum else if para um if, e eles devem vir antes do else.
- Depois que um else tem sucesso, nenhum dos demais else if ou else ser testado.

2.1.3. Expresses vlidas para instrues if-else-if.


A declarao else pode conter outra estrutura if-else. Este cascateamento de estruturas
permite ter decises lgicas muito mais complexas.
A sintaxe da declarao if-else-if:

Podemos ter vrias estruturas else-if depois de uma declarao if. A estrutura else
opcional e pode ser omitida. No exemplo mostrado acima, se a expresso_lgica1
verdadeira, o programa executa a instruo1 e salta as outras instrues. Caso contrrio, se
a expresso_lgica1 falsa, o fluxo de controle segue para a anlise da expresso_lgica2.
Se esta for verdadeira, o programa executa a instruo2 e salta a instruo3. Caso
contrrio, se a expresso_lgica2 falsa, ento a instruo3 executada.
Fluxograma da instruo if-else-if

38

39

Curso Java SE - UTD

Exemplo 01:

2.2.Expresses vlidas para instrues switch e case.


Sintaxe da declarao switch.
Onde, varivel_inteira uma varivel
de tipo byte, short, char ou int. valor1,
valor2, e assim por diante, so valores
constantes que esta varivel pode
assumir. Quando a declarao switch
encontrada, o fluxo de controle avalia
inicialmente a varivel_inteira e segue
para o case que possui o valor igual ao
da varivel. O programa executa todas instrues a partir deste ponto, mesmo as do
prximo case, at encontrar uma instruo break, que interromper a execuo do switch.
Se nenhum dos valores case for satisfeito, o bloco default ser executado. Este um
bloco opcional. O bloco default no obrigatrio na declarao switch.

Fluxograma da declarao switch.


39

40

Curso Java SE - UTD

Exemplos 01:

As constantes CASE so avaliadas de cima para baixo,e a primeira constante CASE que
bater com a expresso SWITCH ser o ponto de entrada da execuo.

Exemplos 02:

Soluo Incorreta.

Soluo Correta.
Este exemplo perfeitamente vlido para a declarao switch-case, porque mesmo a
varivel sendo do tipo String,porm quando entrar na instruo switch,o mtodo invocado
pela varivel s.length que retornar um valor inteiro,ou seja o tamanho da string,que no
nosso caso igual a 7.
Exemplo 03:

40

41

Curso Java SE - UTD

No exemplo acima,quando fornecido argumento,a aplicao identifica se o primeiro


caractere deste uma vogal. Se o argumento no for iniciado por uma vogal ocorre a
execuo da seo default da diretiva switch. Caso no exista argumentos fornecido o
programa imprime uma mensagem correspondente.
Regras para uso da instruo switch- case:
- Cada instruo case deve ser seguida de uma instruo break.
- Certifique-se de que uma varivel char seja declarada antes da instruo switch.

2.3.Loops e iteradores (usando os loops for, while e do


while).
Os comandos de repetio, ou de iterao, executam um comando ou um bloco de
comandos vrias vezes. uma das formas para executar repetidamente um comando. A
outra a recurso que a chamada direta ou indireta de um mtodo durante a execuo do
prprio mtodo. Em Java existem trs formas de comandos de repetio: o while; o dowhile; e o for.
Sintaxe: loop while

Fluxograma do loop while

A declarao while executa repetidas vezes um bloco de instrues enquanto uma

determinada condio lgica for verdadeira.

41

42

Curso Java SE - UTD

Exemplo 01:

Como em todos os loops a expresso(teste) ter que resultar em um valor booleano.O


corpo de loop while s ser executado se a expresso(tambm conhecida como
condio)resultar em um valor true(verdadeiro). Uma vez que entramos no loop,seu
contedo ser repetido at que a condio no possa mais ser atendida e seja avaliada
como false(falsa),encerrando o loop.
Exemplo 02:

Neste exemplo a varivel x inicializada com 0 ao entrar no loop a condio verificada


como sendo verdadeira,isso porque 0 menor do que 5,ento o bloco de cdigo
executado,imprimindo na tela a string x e o valor da varivel x que no caso 0,depois a
execuo do cdigo passa para a prxima linha que o incremento da varivel x,passando
a valer 1. Agora a execuo volta ao inicio do loop para verificar novamente a condio e
assim por diante at que a condio seja avaliada como falsa.

Sintaxe: do while : fluxograma do loop do-while

2.3.1. Loop do while:


A declarao do-while similar ao while. As instrues dentro do lao do-while sero executadas
pelo menos uma vez. Inicialmente, as instrues dentro do lao do-while so executadas. Ento, a
condio na expresso lgica avaliada. Se for verdadeira, as instrues dentro do lao do-while
sero executadas novamente.

Exemplo 01:

42

43

Curso Java SE - UTD

Neste exemplo a varivel x inicializada com 0,o bloco de cdigo executado pelo
menos uma vez antes que a condio seja verificada. Aps a condio ser avaliada como
verdadeira,a varivel ser incrementada em 1 e a execuo do cdigo volta para o inicio do
bloco e isso se repetir at que a condio seja avaliada como falsa.

2.3.2.Loop for:
A declarao for, como nas declaraes anteriores, permite a execuo do mesmo bloco de
cdigo uma quantidade determinada de vezes.
Sintaxe: do loop for:

Fluxograma For

Exemplo 01:

Exemplo 02:

43

44

Curso Java SE - UTD

2.4. Loop for aprimorado (para arrays).


O comando FOREACH utilizado quando voc quantas vezes precisa fazer a interao.
Ele composto por trs expresses, sendo elas: a) Declarao e inicializao, b) Expresso
condicional e c) Expresso de interao.
Exemplo 01:

Exemplo 02:

Nota: A sada dos exemplos anteriores, aps compilado e executado, dever ser uma
exibio dos nmeros inteiros do arranjo com nome semana. Esta estrutura otimiza a
interao no arranjo ou coleo passada para a expresso podendo ser efetuada a
navegao sem a necessidade de ndices ou interadores.

44

45

Curso Java SE - UTD

2.5.Uso de break, continue e return.


2.5.1. Break:
A instruo break far com que o programa encerre a execuo do loop atual e inicie o
processamento na linha de cdigo posterior ao bloco.,isso porque este comando serve para
interromper a sequncia de execuo dos comando e sair do comando switch. Isto no
acontece apenas no comando switch. Toda vez que um break encontrado, o fluxo de
execuo salta para fora do bloco onde est contido o break, sendo retomado no
comando aps o bloco.
a declarao de desvio usada para sair de um lao antes do normal. O tipo determina
para onde transferido o controle. O break transfere o controle para o final de uma
construo de lao (for, do, while ou switch). O lao vai encerrar independentemente de
seu valor de comparao e a declarao aps o lao ser executada. Exemplo:

Nota: Vamos analisar este exemplo acima que tem como resultado a impresso de todos
os nmeros cuja o mdulo da diviso por 10 seja igual a 0. Da o resultado o mostrado
abaixo:
[ i = 100, i = 90, i= 80, i = 70, i= 60, i = 50, i = 40, i= 30, i = 20, i = 10 ]
Exemplo 02:
Agora vamos analisar o exemplo 02,que mostra o mesmo programa com uma pequena
diferena que a incluso do comando break depois do comando System.out.println();

Nota: Depois de analisarmos chegamos a seguinte concluso: Este comando interrompe


a execuo do loop satisfazendo a condio no bloco if. Ento o resultado a impresso de
apenas o primeiro que satisfaz a condio,que no nosso caso o 100.
[ i = 100]

45

46

Curso Java SE - UTD

2.5.2. Continue:
A instruo continue far com que somente a iterao atual do loop seja encerrada e que
a prxima iterao do mesmo loop seja iniciada deste que for atendida. Quando usar uma
instruo continue em um loop for, voc ter que considerar seus efeitos na iterao do
loop. A declarao continue faz com que a execuo do programa volte imediatamente para
o incio do lao, porm para a prxima interao. O continue faz o interpretador pular para
a prxima iterao e obriga-o a testar a condio. Exemplo:

A pergunta : Esse um loop infinito? A resposta no. Quando a instruo continue for
atingida,a expresso de iterao ainda ser executada! Ela ser exatamente como se a
iterao atual terminasse de maneira natural. Portanto,no exemplo anterior, ainda
aumentar o valor antes da condio (i < 10) ser verificada novamente. Mas geralmente a
instruo continue usada dentro de um teste if como segue abaixo:

Nota: Este dois comando tambm podem ser usados como instrues rotuladas. As
instrues rotuladas esto alm do escopo do nosso curso,mas,embora muitas instrues
em java possam ser rotuladas, mais comum usar rtulos com instrues loop tais como
for e while, em conjunto com instrues break e continue. Uma instruo de rtulo deve
ser colocada antes da instruo sendo rotulada,e consiste de um identificador vlido que
termina com dois pontos(:). As instrues rotuladas sero necessrias somente nas
situaes em que voc tiver um loop aninhado e precisa indicar qual quer encerrar ou a
partir do qual deseja continuar a prxima iterao.

2.5.3. Return:
A declarao return utilizada para sair de um mtodo. O fluxo de controle retorna para
a declarao que segue a chamada do mtodo original. A declarao de retorno possui dois
46

47

Curso Java SE - UTD

modos: o que retorna um valor e o que no retorna nada.


Exemplo:

47

48

Curso Java SE - UTD

Capitulo 3.
Casting.

Tipos de Variveis, Constantes e

3.1. O que uma varivel :

identificadores.

Varivel: um espao na memria usado para armazenar o


estado de um objeto. Uma varivel deve ter um nome e um tipo. O
tipo da varivel indica o tipo de dado que ela pode conter. O nome
das variveis deve seguir as mesmas regras de nomenclatura que os

3.1.1. Tipos de Variveis:


Variveis de instncia: Estas variveis so no-estticas, ou seja, declaradas sem o
modificador static. Variveis de instncia so assim chamadas porque seus valores so
nicos para cada instncia da classe. Assim, as variveis podem armazenar valores
diferentes para cada cpia de objetos da classe.
Variveis de classes: Estas variveis so declaradas com o modificador static. Isso
informa ao compilador que h exatamente uma nica cpia desta varivel, independente
do nmero de instncias da classe.
Variveis locais: So usadas para armazenar o estado temporrio de um mtodo.
Variveis locais so acessveis somente dentro do mtodo em que so declaradas, e
automaticamente abandonadas na sada do mtodo.
Parmetros: So os parmetros de mtodos. Tais variveis so acessveis somente ao
cdigo no corpo do mtodo.
Nota: Veremos nos prximos captulos detalhes e exemplos de todos os tipos
de variveis aqui mostrado. Geralmente quando falamos de "campos em
geral" (excluindo variveis locais e parmetros), podemos simplesmente dizer
"campos". Se a discusso se aplica a todas as variveis acima, usamos
"variveis". Se o contexto pede uma distino, usamos termos especficos
(campo esttico, varivel local, etc) como apropriado. Podemos ainda usar o
termo "membro". Os campos, mtodos e tipos aninhados de um tipo podem
ser chamados de seus membros.

Exemplo de variveis locais:

Na linguagem de programao Java no permitido o uso de variveis indefinidas.


48

49

Curso Java SE - UTD

Variveis definidas dentro do mtodo so chamadas de variveis locais, temporrias ou


estticas e devem ser inicializadas antes do uso. Vejamos a tabela abaixo com os seguintes
valores iniciais.
Exemplo 02:
Atribuir um valor a uma varivel parece bem simples; simplesmente insira o valor
direita do sinal (=) para atribu-lo varivel que estar esquerda. Exemplos:

3.2. Variveis estticas:


um membro que pertence a classe,uma varivel esttica compartilhada por todas as
instncias de classe, por que isto apenas uma cpia da varivel esttica mantida e
somente a prpria classe suficiente para acessar a varivel marcada como esttica.
Exemplo 01:

Exemplo 02:

Exemplo 03:
Neste exemplo vamos
mostrar atravs de um
programa como usar as
variveis estticas.

49

50

Curso Java SE - UTD

3.3. Constantes
O valor de uma varivel pode ser alterado durante a execuo do programa. Mas,o valor
de uma constante no alterado jamais. Por padro, recomendamos que crie constantes
sempre com letras maisculas por seguirem as normas da SUN, as constantes trazem
algumas vantagens,entre elas o fato de que nomes descritivos para constantes podem
tornar o programa mais fcil de ser lido.
Sintaxe:
final static tipo_de_dado IDENTIFICADOR = valor;
Exemplo 01:

3.4. Converso ou Cast (explcita e implcita das variveis de


tipos primitivos).

A converso permitir que seja transformado valores primitivos de um tipo em outro. As


converses podem ser implcitas ou explcitas das variveis de tipos primitivos. Uma
converso implcita ocorre quando fazemos uma transformao que envolve ampliao.
Em outras palavras,quando inserimos um item menor (exemplo,um tipo byte) em um
container maior(como um tipo int). A transformao valor maior em um container menor
conhecida como compactao e requer uma converso explcita,em que ser informado
ao compilador que conhece o perigo e aceita toda a responsabilidade. O Java converte
automaticamente valores de um tipo numrico para outro tipo maior. Vejamos algumas
converses vlidas em java.
Utilizamos o casting para converter um objeto ou uma varivel de um tipo primitivo para
outra de um tipo tambm primitivo. Podemos converter um double em um int, ou uma
subclasse em uma superclasse.
50

51

Curso Java SE - UTD

A regra fundamental para o cast : o casting no modifica o objeto ou valor que est
sendo moldado; porm, o receptor do cast constitui um novo objeto ou um novo tipo. O
casting de dados primitivos ocorre com bastante frequncia. A maneira pelo qual o casting
age depende da preciso dos dados envolvidos. Por sua vez, a preciso depende da
quantidade de informaes que um tipo pode conter; assim, um tipo de ponto flutuante
double tem maior preciso que um float, pois o primeiro um tipo de 64 bits e o segundo,
de 32 bits.
Um byte pode ser convertido em um short, int, long, float ou double
Um short pode ser convertido em um int, long, float ou double
Um char pode ser convertido em um int, long, float ou double
Um int pode ser convertido em um long, float ou double
Um long pode ser convertido em um float ou double
Um float pode ser convertido em um double
Sempre que houver uma transferncia de dados de um tipo menos preciso para um mais
preciso, o casting explcito no obrigatrio.

Regras para casting:


J a transferncia de dados de um tipo mais preciso para um menos preciso requer um
casting explcito. Isso ocorre porque pode haver perda de dados durante a moldagem. Java
pretende alertar o programador do possvel perigo de uma converso desse tipo:
Exemplo 01:

Exemplo 02:

Exemplo 03:

51

52

Curso Java SE - UTD

Exemplo 04:

Exemplo 05:

O Java no faz automaticamente o downcast.

O casting entre objetos requer um pouco mais de cuidado. Veremos no decorrer da


apostila como fazer o casting de objetos.

3.5. Atribuindo uma varivel de referncia a outra.

52

53

Curso Java SE - UTD

As variveis de referncias so usadas para se referir(ou acessar) um


objeto. Uma varivel de referncia declarada como sendo de um tipo
especfico, e esse tipo no pode nunca ser modificado. Uma varivel de
pode ser usada para referir-se a qualquer objeto do tipo declarado,ou
de um subtipo do tipo declarado(um compatvel). Variveis de
referncia podem ser declaradas como variveis estticas, variveis de
instncias, parmetros de mtodos ou variveis locais.

3.5.1. Escopo de variveis.


Depois que declarou e inicializou uma varivel,uma questo natural e muito importante
por quanto tempo essa varivel vai existir? Essa uma pergunta que se refere ao escopo
das variveis em java. O escopo define onde uma varivel acessvel durante a execuo de
um programa e quando a varivel criada e destruda. A localizao de uma varivel
dentro do programa estabelece seu escopo. Existem quatro categorias de escopo de
variveis na linguagem Java, so elas:

3.5.2. Variveis de instncias de tipos primitivos.


As variveis de instncias so definidas dentro da classe,mas fora de qualquer mtodo,e s
so inicializadas quando a classe instanciada. As variveis de instncias so os campo que
pertencem a cada objeto nico.
Exemplos:

Ou

53

54

Curso Java SE - UTD

Capitulo 4.

POO com Java

4.1. Introduo
Programao Orientado a Objeto, constitui em um conjunto de regras de programao.
Estudamos anteriormente como programar de forma estruturada, inicivamos a execuo
do cdigo e finalizando todos os processos na mesma classe . Porm sem saber estvamos
usando algumas regras de POO(Programao Orientada a Objetos) como por exemplo,
usando a classe System ou JOptionPane. Essas classes no foram criadas por ns,
porm elas foram reaproveitadas em nosso cdigo com objetivo de resolver os nossos
algoritmos. Vamos fazer uma comparao com o dia- a -dia para entendermos melhor .
Fabrica de Computadores.

Servio de Digitao.

Relatrio Final.

Imagine que voc trabalha com


digitao de textos. Voc no precisa
saber como o computador foi criado,
nem como o Software que usa para
digitar o texto foi desenvolvido. O seu
objetivo usar desses recursos e criar
um novo produto final. Um relatrio de
texto.
A Programao orientado a objeto, uma metodologia que os programadores utilizam
com objetivo de atingir alguns requisitos importantes na construo de um bom programa
como:

Organizar o cdigo : Com o nosso cdigo dividido, podemos facilmente dar


manuteno ou encontrar algum erro mais facilidade.

Reutilizao do cdigo: No precismos reescrever todo o cdigo, quando


necessitamos dele novamente.

Manter Padres : Utilizao de um mesmo padro conceitual durante todo o


processo de criao do cdigo.

At o final do curso iremos aprender e trabalhar nessa metodologia. Ento, bastante


ateno nesse e nos prximos capitulos.

54

55

Curso Java SE - UTD

4.2. Classe, Atributos e Mtodos.


Como estamos trabalhndo com POO(Programao Orienntada a Objeto), o nosso
objetivo final construir um Objeto que tenha suas caractersticas. Um Objeto criado
apartir de uma Classe. Ela ir servir como modelo para criao do Objeto.Vamos fazer
uma comparao com o dia- a -dia para entendermos melhor .

Um prdio no construido de qualquer forma, o pedreiro ir construir o


prdio de acordo com as instrues da planta. Tamanho do banheiro,
quantos quartos, porta de entreda. A planta do prdio, seria uma Classe ele
server como referencia na construo do prdio que um Objeto.
Iremos aprender, como criar uma Classe, ou seja, referencia para futuros Objetos.
Imagine que queremos criar um Pessoa. Para poder criar uma Pessoa teremos
antes que fazer 2 perguntas bsicas.

Anote tudo que uma pessoa pode ter, como nome,


data de nascimento, RG, CPF, etc.. Para a resposta
da primeira pergunta, ns temos o que chamamos
de Atributos da classe Pessoa

Anote Tudo que uma pessoa pode fazer, ou seja, suas


aes, como acordar, dormir, falar o seu nome, etc...
Para a resposta da segunda pergunta ns temos o
que chamamos de Mtodos da classe Pessoa

O que poderei ter?


O que poderei fazer ?

Com o conceito de Classe, atributos e


mtodos. Podemos agora criar uma classe
em cdigo java, veja no prximo tpico como
iremos criar-lo.

4.3. Construindo uma Classe.


Para criar uma classe, clicaremos com o boto direito do mouse no pacote do Projeto
> novo > Classe Java.
55

56

Curso Java SE - UTD

CLASSE

ATRIBUTOS

MTODOS

Agora construmos a nossa classe, mas o que significa este public antes dos atributos
e mtodos e o que significa o void? Para entender melhor , temos que aprender sobre
Encapsulamento e tipo de retorno de dados. Assunto que iremos ver no
prximo tpico.

4.4. Encapsulamento.
Encapsulamento uma forma de proteo do nosso cdigo, existem informaes que
queremos que outras classes vejam, outras no. Imagine a sua conta de e-mail. A conta do
seu usurio poder ser vista por outras pessoas, pois ele ir identificar o seu e-mails dos
demais, porm a sua senha algo privado onde s voc poder ter acesso a ela. Da
mesma forma que queremos mostrar ou proteger os nossos dados, uma classe tambm tem
as mesmas necessidades e podemos defini-las atravs do encapsulamento.

public - ou publico, qualquer classe pode ter acesso)

private - ou privado, apenas os mtodos da prpria classe pode manipular o


atributo)

protected - ou protegido, pode ser acessado apenas pela prpria classe ou pelas
suas subclasses).

Assim podemos alterar o public da nossa classe por outro valor de encapsulamento,
dependendo da necessidade de proteo dos nossos atributos ou mtodos. Por boas
prticas de programao, os atributos da nossa classe Pessoa ester como private.
Faa alterao de encapsulamento na classe Pessoa.

56

57

Curso Java SE - UTD

4.5. Retorno
Os mtodos podem realizar uma ao interna e podem influenciar em outros mtodos
atravs do seu Retorno. Ele pode representar os tipos primitivos de dados que conhecemos
como : int, string, double, float, chat, boolean por exemplo, ou pode retornar vazio,
simbolizado por void. Os mtodos que tiver retorno, dever ter dentro do seu corpo um
return que ir representar o resultado final da minha operao.
Veja o exemplo abaixo:

Neste exemplo alteramos o mtodo falarNome da classe pessoa. O tipo de retorno


desse mtodo String. Ento alm da classe imprimir a frase, ele dever guardar a String
em uma varivel chamada minhaFrase e retornar ela para ser usada em outras classes na
linha 23.

4.6. Construtores, mtodos seteres e geteres.


4.6.1. Construtores
So mtodos especiais, que so acionados no momento da construo da classe, ela
dever ter o mesmo nome da Classe criada. Imagine que para que uma pessoa possa
existir, ele precise inicialmente de um nome e data de nascimento. Ento podemos
construir o nosso construitor da seguinte forma:

Nesse cdigo o nosso construtor responsvel por alimentar os atributos nome e data de
nascimento da pessoa. tambm garantimos que ao momento da construo do objeto, uma
Pessoa no poder existir se no tiver um nome e uma data de nascimento.
Mas como eu poderei alterar o meu CPF, RG, e como poderei mostrar esses valores de
atributos? Assunto que veremos no prximo tpico.

4.6.2.Mtodos seteres e geteres


Os mtodos nomeados como set e get so responsveis respectivamente por alterar
um atributo e mostrar um atributo da minha classe. Para que o netbeans possa gerar esse
cdigo, iremos digitar : ALT+ INSERT > INSERIR CDIGO e marcar os atributos,
nome, cpf, rg.
Como eu poderei usar o meu construtor, meus mtodos do tipo set e get ? Este
assunto veremos no prximo tpico.

4.7. Estanciando (Construindo um Objeto)


Agora estamos prontos para construir o nosso objeto usando a nossa classe Pessoa
57

58

Curso Java SE - UTD

como referencia. Ento, iremos voltar a classe que tenha o mtodo main e realizar a
seguinte operao:

Agora estou estanciando o meu objeto e de acordo com meu construtor, eu preciso
obrigatoriamente de um nome = Fabrcio e uma data de nascimento = 17/02/87 todos
eles do tipo String. Vamos agora usar os mtodos da nossa classe criada.

Dessa forma podemos modificar e acessar qualquer varivel dependendo das nossas
necessidades. Todas as informaes do Fabrcio esto dentro de uma varivel do tipo
Pessoa chamada de x. Se eu quiser criar uma nova pessoa, posso cham-la de qualquer
outro valor.

4.8. Variveis Estticas


Variveis estticas so valores que se for alterado em um objeto de uma determinada
classe todos os objetos da estanciados da mesma classe, automaticamente ter o mesmo
valor Ele normalmente usado quando todas as classes tem algo em comum. Imagine a
seguinte situao.
A Classe Pessoa ter um atributo chamado : ondeVivo = Planeta Terra
Todas as pessoas moram em um planeta que
conhecemos por Planeta Terra. Porm
pesquisas mais recentes mostram que o nome do
nosso planeta deveria ser chamado de Planeta
gua pois nele encontra-se mais gua do que a
terra .
Se tivermos 300 objetos estanciados do tipo pessoa, como alterar ondeVivo =
Planeta gua em todos os objetos em uma nica instruo sem precisar percorrer
todos eles?
Basta criar uma varivel esttica no atributo ondeVivo, assim se alteramos em 1 dos
objetos essa varivel, todas elas sofrero a mesma alterao. Veja como cri-lo:

58

59

Curso Java SE - UTD

//Atributo esttico criado na classe Pessoa


private static String ondeVivo = "Planeta Terra";
//Mtodo set para alterar a varivel esttica
public static void setOndeVivo(String ondeVivo) {
Pessoa.ondeVivo = ondeVivo;
}
//Mtodo get para a varivel esttica
public static String getOndeVivo() {
return ondeVivo;
}

Conclumos ento que as variveis estticas no pertencem especificamente a nenhuma


instancia de objeto e sim uma referencia da classe. O que explica a substituio do termo
this para o nome da classe que que contm a varivel esttica, no exemplo acima
alteramos o termo this no mtodo setOndeVivo pelo nome da classe que contm a
varivel esttica (Pessoa).

4.9. Mtodos Estticos


O Mtodos Estticos se caracterizam por ser um referencia de mtodo da Classe, sem ter
que instanciar um objeto para utiliz-lo.

59

60

Curso Java SE - UTD

Capitulo 5.

Herana e Interface.

5.1. Introduo
Estudamos anteriormente como estruturar as nossas classes, agora precisamos gerar
uma interao entre classe criadas. Para isso no conceito de POO tambm temos que saber
Interface e herana. Iremos aprender casa uma delas, seu conceito e como implementlas.

5.2.Herana

fundamental para Java e outras linguagens de programao orientadas a objetos,o


conceito de herana,que permite ao cdigo definido em uma classe ser reutilizado em
outras classes.
Sintaxe de herana em java:
class NomeDaClasseASerCriada extends NomeDaClasseASerHerdada
Em Java,pode ser definido uma superclasse geral (mais abstrata), e depois estend-la com
subclasses mais especficas. A superclasse no sabe nada sobre as classes que herdam dela, mas
todas as subclasses precisam declarar explicitamente a relao de herana. Uma superclasse recebe
automaticamente as variveis de instncias acessveis e os mtodos definidos pela superclasse, mas
tambm livre para substituir mtodos da superclasse para definir comportamento mais
especficos. Os objetos de uma mesma classe podem tirar proveito de relaes de herana, onde
objetos recm-criados absorvem caractersticas de outros j existentes e adicionam-se novas
caractersticas.

60

61

Curso Java SE - UTD

5.3.Object: A superclasse csmica do java


A class Object: A classe Object o ltimo ancestral toda classe em java estende de
Object. Entretanto,nunca ser preciso gerar sua herana diretamente:
A superclasse terminal Object automaticamente inclusa se nenhuma superclasse for
mencionada explicitamente. Pelo fato de todas as classes em java estenderem Object,
importante familiarizar-se com os servios fornecidos pela classe Object. Remeteremos ao
leitor a pesquisarem em artigos na internet ou at mesmo ver a documentao on-line que
lista os vrios mtodos da classe Object,mas que s aparecem quando lidamos com
threads(linhas de execuo).Voc pode usar variveis do tipo Object para referir-se a
objetos de qualquer tipo:
claro que uma varivel do tipo Object somente ser til como um marcador genrico
para valores arbitrrios. Para fazer qualquer coisa especfica com o valor,voc precisa ter
algum conhecimento sobre o tipo original e,ento,aplicar uma converso: Em java,somente
os tipos primitivos(nmeros,caracteres e valores lgicos)no so objetos. Todos os tipos de
arrays,independentemente de serem arrays de objetos ou arrays de tipos primitivos,so
tipos de classes que estendem a classe Object.
Super: A palavra super seguida imediatamente de parnteses chama o construtor da
superclasse de mesma assinatura, deve ser a primeira instruo dentro de um construtor
da subclasse.
Super-classe: uma classe da qual se herda outras classes. A clusula opcional estende em
uma declarao de classe especifica a superclasse diretamente da classe atual. Uma classe dito ser
uma subclasse direta da classe,que se estende. A superclasse direta a classe a partir de cuja
aplicao a implementao da classe atual derivado. A clusula extends no deve aparecer na
definio da classe java.lang.Object,pois primordial a classe e no tem nenhuma superclasse
direta. Se a declarao de classe para qualquer outra classe no tem nenhuma clusula extends,
ento a classe tem a classe java.lang.Object como implcita superclasse direta.
Sub-classes: uma classe que herda de uma classe ou de uma interface. Uma subclasse herda
estado e comportamento de todos os seus antepassados. A superclasse o termo refere-se ancestral
direto de uma classe,assim como todas as suas classes ascendentes. Essa hierarquia de classes

segue uma apresentao na forma de rvore,em que a raiz a superclasse de todo o


sistema. Cada nvel abaixo dessa superclasse do sistema acrescenta funes especficas.

Exemplo 01: Neste exemplo vamos mostrar como proceder com esse poderoso recurso
do java que chamamos de herana simples.
Cdigo da superclasse Conta.

61

62

Curso Java SE - UTD

Cdigo da subclasse CPoupanca que estende da superclasse Conta.

Cdigo da subclasse CEspecial que estende da superclasse Conta.

62

63

Curso Java SE - UTD

Diagrama de classes representando a herana entre as classes citadas acima.

Nota: Java permite que uma classe herde apenas as caractersticas de uma nica classe,
ou seja, no pode haver heranas mltiplas. Porm, permitido heranas em cadeias, por
exemplo: se a classe Mamfero herda a classe Animal, quando fizermos a classe Cachorro
herdar a classe Mamfero, a classe Cachorro tambm herdar as caractersticas da classe
Animal.
Como estamos tratando de herana de
classes, toda classe tem seu mtodo construtor.
Portanto, se estamos trabalhando com duas
classes, temos dois mtodos construtores. Para
acessarmos o mtodo construtor da classe que
est sendo herdada usamos o super().

Exemplo 02:
Para demonstrar como definir o relacionamento de herana, considera-se o contexto de
63

64

Curso Java SE - UTD

ter que desenvolver um programa que simule o comportamento de vrios tipos de animais
como mostrado na figura ao lado em um determinado ambiente.
Inicialmente, apenas um grupo de
animais estar presente neste ambiente
e cada animal deve ser representado
por um objeto. Alm disso, os animais
movem-se no ambiente ao seu modo e
podem fazer um conjunto de coisas. O
programa dever prever que novos
tipos de animais podero ser includos
no ambiente.

O primeiro passo observar cada animal e definir o que cada objeto do tipo animal tem
em comum no que diz respeito aos atributos e comportamentos (mtodos). Deve-se definir
tambm como os tipos de animais se relacionam. Inicialmente, o programa deve simular o
comportamento dos animais ilustrados na figura, ou seja, de um leo,de um lobo,de um
gato, de um hipoptamo, de um tigre e de um cachorro .

O segundo passo consiste em projetar a superclasse, ou seja, a classe que representa o estado e o
comportamento em comum a todos os animais. Para este exemplo, como todos os objetos so
animais, a superclasse foi denominada como Animal e as variveis e mtodos em comuns a todos
os animais foram atribudos a ela, como ilustrado na Figura. Neste exemplo, cinco variveis foram
definidas: (o tipo de comida que o animal come), (o nvel de fome do animal), (representao da
altura e largura do espao que o animal vagar ao seu redor) e (as coordenadas X e Y do animal no
espao). Alm disso, quatro mtodos foram definidos para definir o comportamento dos animais:
(comportamento do animal ao fazer algum rudo),(comportamento 57 do animal ao comer),
(comportamento do animal dormindo) e (comportamento do animal quando no est nem
dormindo nem comendo, provavelmente vagueando no ambiente).

O terceiro passo o de decidir se alguma subclasse precisa de comportamentos


(mtodos) especficos ao seu tipo de subclasse. Analisando a classe Animal, pode-se extrair
que os mtodos devem ter implementaes diferentes em cada classe de animais, afinal,
cada tipo de animal tem comportamento distinto ao comer e fazer rudos. Assim, esses
mtodos da superclasse devem ser sobrescritos nas subclasses, ou seja, redefinidos. Os
mtodos no foram escolhidos para serem redefinidos por achar que esses
comportamentos podem ser generalizados a todos os tipos de animais.

5.3.1. Construtores da subclasse

64

65

Curso Java SE - UTD

Os construtores da superclasse no so herdados pela subclasse, logo, esta dever ter seus
prprios construtores para inicializar seus atributos. Todavia, ao instanciar um objeto da
subclasse, devemos inicializar aqueles atributos que ela est herdando, e o fazemos
chamando algum construtor da superclasse, usando a chamada super(...).

5.3.2. Classe Abstrata


Para entender o conceito de herana, precisamos primeiro entender No Portugus, a
palavra Abstrata refere-se a algo que no existe fisicamente, ento se convertermos essa
expresso em Java podemos dizer que Classe Abstrata uma classe que no pode ser um
Objeto. Assim ela precisar ser herdada ou implementada, no prximo tpico iremos ver
como funciona em um exemplo de cdigo.
Imagine que voc tenha uma classe Carros que tenha mtodos genricos comuns a todos
os veculos. Mas voc no quer que algum de fato crie um objeto carro genrico,abstrato.
Como se inicializaria o seu estado? De que cor ele seria?Quantos assentos? ou, mais
importante, de que forma ele se comportaria?Em outras palavra, como os mtodos seriam
implementados? Temos certeza de que o dono de uma BMW lhe diria que o carro dele
capaz de fazer coisas que o GOL apenas sonha em fazer.
A implementao pode ser dessa forma mostrada acima,como tambm pode ser como
segue no exemplo abaixo:

Dessa forma podemos dizer que MeuCarro que poder ser um Objeto, herda de
Carro que uma classe abstrata.
65

66

Curso Java SE - UTD

Na Classe que contm o mtodo Main, ns temos:

66

67

Curso Java SE - UTD

5.4.Interface
Interface uma espcie de superclasse 100% abstrata que define os mtodos que uma
subclasse deve suportar, mas no como esse suporte deve ser implementado. Isso porque
ao criar uma interface,estar definindo um contrato com o que a classe pode fazer,sem
mencionar nada sobre como o far. Uma interface um contrato. Qualquer tipo de classe
(concreta) e de qualquer rvore de herana pode implementar uma interface.
Exemplo 01:

Exemplo 02:

Exemplo 03:

Regras para as interfaces:


- Uma interface em Java uma coleo de mtodos abstratos que pode ser
implementada por uma classe.
- Uma interface na pode implementar outra interface ou classe.
- Os tipos de interface podem ser usados polimorficamente.
- Os mtodos de um interface no devem ser estticos.
- Uma interface deve ser declarada com a palavra-chave interface.
- Todos os mtodos de uma interface so implicitamente public e abstract. As interfaces
s podem ser declaradas. Uma interface pode estender uma ou mais interfaces
diferentes.
Todas as variveis definidas em uma interface devem ser public,static e final. As
interfaces s podem ser declarar constantes e no variveis de instncia.

67

68

Curso Java SE - UTD

Capitulo 6.

Tratamento de Excees

6.1. Capturando uma exceo usando o bloco (try e catch).


A linguagem java fornece aos desenvolvedores um mecanismo
sofisticado para manipulao de erros que produz cdigos de
manipulao eficientes e organizados: a manipulao de excees. A
manipulao de excees permite que os desenvolvedores detectem erros
facilmente sem escrever um cdigo especial para testar valores
retornados. Permite tambm manter o cdigo de manipulao de
excees nitidamente separado do cdigo que gerar a exceo. Alm
disso,permite que o mesmo cdigo de manipulao de excees lide com as diferentes
excees possveis.
A classe Throwable a nica classe cujas instncias diretas ou indiretas podem ser
usadas para serem lanadas. A classe Throwable pr-definida na linguagem Java,
juntamente com vrias outras classes definindo um grande nmero de categorias de erro.
Os programadores Java, por conveno, caso queiram criar novas excees devem estender
a classe Exception que uma subclasse de Throwable. Duas classes descendentes da classe
Throwable podem ser consideradas especiais: a classe Error e a classe RuntimeException. A
linguagem java no obriga o programador a tratar os lanamentos de exceo envolvendo
instncias da classe Error, da classe RuntimeException e das classes delas derivadas, todos
os outros lanamentos de exceo devem ser tratados pelo programador. Capturando uma
exceo com o bloco try e catch.
Vejamos a sintaxe.

O termo excees significa condio excepcional, e uma ocorrncia que altera o fluxo
normal do programa. Vrias coisas podem levar a excees,incluindo falhas do
hardware,exausto de recurso e os famosos erros. Quando isso acontece,ou seja quando
ocorre um evento excepcional ocorre em Java,diz se que uma exceo ser lanada.
Exemplo 01:

Nota: O mtodo calc se for chamado com y igual zero(0),gerar um erro e uma exceo
ser lanada, esse erro poder ser sinalizado no bloco try-catch,ento a execuo do
mtodo pular para a bloco de cdigo catch,onde ser mostrado uma mensagem de erro.

68

69

Curso Java SE - UTD

Exemplo 02:
Caso 01: Neste exemplo vamos chamar o mtodo converteStr(),passando uma string
numrica,que no nosso caso 8 e o resultado a converso da string em um nmero de
ponto flutuante,da a diviso feita e a execuo do programa acontece sem nenhum
problema.

Caso 02: Neste mesmo exemplo vamos chamar agora o mtodo converteStr(),passando
uma string no numrica,que no nosso caso a caractere 'n' e o resultado o lanamento
de uma exceo,jogando o fluxo de execuo do programa para o bloco catch,onde
imprime uma mensagem na no console.

6.1.1. Finally
Finally: o trecho de cdigo final. A funo bsica de finally sempre executar seu
bloco de dados mesmo que uma exceo seja lanada. muito til para liberar recursos do
sistema quando utilizamos, por exemplo, conexes de banco de dados e abertura de buffer
para leitura ou escrita de arquivos.

Resultado do cdigo acima:

69

70

Curso Java SE - UTD

6.1.2. Lanado uma exceo com o throws.


O objeto de exceo uma instncia da classe Exception ou de uma de uma de suas
subclasses. A clusula catch usa,como parmetro,uma instncia de objeto de uma tipo
derivado da classe Exception. A linguagem java exige que todo mtodo capture a exceo
verificada que pode vir a lanar ou ento declare que lanar a exceo. A declarao da
exceo faz parte da interface pblica do mtodo. Na declarao de uma exceo que
poder ser lanada,a palavra-chave throws usada em uma definio do mtodo,junto com
uma lista de todas as excees verificadas que podero ser lanadas.
Exemplo 01:

Exemplo 02:

6.1.3. Criando uma exceo com throw.


A mquina Virtual Java lana referncias para instncias de maneira implcita utilizando
as classes pr-definidas. O programador pode utilizar o comando throw de forma
explcita. Quando o fluxo de
controle atinge o comando
throw
<expresso>,
a
expresso avaliada. Esta
expresso corresponde, em
geral criao de um objeto
e resulta numa referncia,
p.
ex.
throw
new
ErroDoTipoX();. A partir da o
fluxo de controle ser
desviado para uma clusula catch apropriada de algum comando try-catch.
O fluxo de controle segue a cadeia dinmica dos registros de ativao das invocaes dos
mtodos, ou seja a execuo de um mtodo pode terminar (i) por que o fluxo de controle
70

71

Curso Java SE - UTD

atingiu o final do mtodo (return implcito, somente no caso de mtodos do tipo void!), (ii)
porque o fluxo de controle atingiu um comando return, ou (iii) porque foi executado um
throw implcito ou explcito que no foi apanhado por um comando try-catch daquele
mtodo. A procura por um try-catch apropriado propagada at o ponto em que h um
retorno para o mtodo main, neste caso a execuo do programa ser finalizada, com
mensagem de erro provida pela MVJ dizendo que uma exceo foi lanada sem que fosse
apanhada. E dever ser mostrado algo como:

Exemplos de excees j definidas no pacote java.lang:


ArithmeticException: indica situaes de erros em processamento aritmtico, tal
como uma diviso inteira por 0. A diviso de um valor real por 0 no gera uma exceo (o
resultado o valor infinito).
NumberFormatException: indica que tentou-se a converso de uma string para um
formato numrico,mas seu contedo no representava adequadamente um nmero para
aquele formato. uma subclasse de IllegalArgumentException;
IndexOutOfBounds: indica a tentativa de acesso a um elemento de um agregado
aqum ou alm dos limites vlidos. a superclasse de ArrayIndexOutOfBoundsException,
para arranjos, e de StringIndexOutOfBounds, para strings.
NullPointerException: indica que a aplicao tentou usar uma referncia a um objeto
que no foi ainda definida.
ClassNotFoundException: indica que a mquina virtual Java tentou carregar
uma classe mas no foi possvel encontr-la durante a execuo da aplicao.

71

72

Curso Java SE - UTD

Capitulo 7.

Herana (Polimorfismo )

7.1. Introduo
Neste capitulo veremos como funciona a interao com classes em Polimorfismo.
Usamos esse recurso quando queremos que modificar mtodos herdados para isso temos
que aprender o conceito e prtica de sobrecarga e sobrescrita. Veremos estes assuntos
no prximo tpico.

7.2. Sobrecarga.
Usamos sobrecarregar de mtodos quando temos um determinado mtodo com o
mesmo nome, porm com assinaturas diferentes, sou seja, parmetros diferentes, dessa
forma quando usamos um determinado mtodo com sobrecarga podemos escolher qual
mtodo sobrecarregado ser usado de acordo com o nmero e tipo de dados do
parmetros oferecidos. Veja um exemplo abaixo :

Na Classe animal criamos 2 mtodo chamado comer, o mtodo que no contm nenhum
parmetro, o animal apenas mostra a ao de comer, estado da carne. O nosso segundo
mtodo, tambm chama-se comer, porm ele tem um assinatura diferente, ele recebe
como parmetro um valor boleano que refere-se ao estado da carne, dessa forma o animal
pode simplesmente comer ou verificar o tipo de alimento antes de se alimentar.

7.3. SobreEscrita
Usamos sobrescrita de mtodos quando temos que modificar um mtodo herdado da
classe pai, para sobrescrever os mtodos teremos que criar o mesmo mtodo herdado na
classe filha com o nome assinaturas igual. Levando em considerao a classe Animal
criada no tpico anterior, veja no exemplo abaixo:

No exemplo anterior, o cachorro j herda o mtodo comer, porm o animal come


qualquer alimento, este nosso cachorro no comer qualquer alimento, ele s come rao. O
termo @Override no exemplo, no obrigatrio, apenas para avisar a IDE que este
72

73

Curso Java SE - UTD

um mtodo de sobrescrita.

7.4. Polimorfismo
Podemos dizer que polimorfismo quanto temos mtodos de sobrescritas distintos entre
classes filhas que referencia um mesmo Pai. Veja o exemplo abaixo.

Pessoa

Professor

Aluno

Note as roupas que eles usam. A pessoa por padro, tem um estilo de roupa, porm
dependendo da situao, temos que usar roupas especficas para cada situao. Um
professor tambm uma pessoa, porm do tipo Professor e ele precisa de um tipo
especfico de uniforme para dar suas aulas. O aluno tambm uma Pessoa, porm ele
precisa de um fardamento adequado para assistir as aulas. Assim ns temos a classe
Professor e Aluno herdando de Pessoa Porm cada uma delas tem mtodos
diferentes quando nos referimos como se vestir. Vamos ver como ficaria em cdigo java o
nosso Polimorfismo.

73

74

Curso Java SE - UTD

Classe Pai

Classe Filha de "Pessoa" que sobrescreve mtodo vestirRoupa

Classe Filha de "Pessoa" que sobrescreve mtodo vestirRoupa

74

75

Curso Java SE - UTD

Capitulo 8.

UML

8.1.Introduo
Neste captulo iremos aprender como, instalar e criar uma diagramao de classes
usando o Netbeans para a linguagem Java. UML significa : Unified Modeling
Language, ou seja Linguagem de Modelagem unificada. Modelar nossa cdigo com
objetivo de documentar e visualizar melhor o projeto.
Para realizar a instalao simples, basta ir em Ferramentas > Plugins e buscar por
UML. Este plugin est disponvel livremente a partir da verso 6.7.
Antes de comearmos a trabalhar com eles, precisam saber quais is tipos de diagramas
podemos desenvolver e qual a utilidade de cada uma dentro de um Projeto de qualquer
escala.Tipos de Diagramas.

8.1.1. Diagrama de Atividade:

Um diagrama de estado especial, onde a maioria dos estados estado de ao, e a

maioria das transies ativada por concluso das aes nos estados de origem.

O objetivo estudar os fluxos dirigidos por processamento interno, descrevendo as

atividades desempenhadas em uma operao.

8.1.2. Diagrama de Sequencia

Apresenta a interao de tempo dos objetos que participam na interao.

O diagrama de sequncia mostra a colaborao dinmica entre um nmero de


objetos, e visa mostrar a sequncia de mensagens enviadas entre objetos.

8.1.3. Diagrama de Caso de Uso

Casos de uso descrevem funcionalidades do sistema percebidas por atores externos.

Um ator uma pessoa (ou dispositivo, ou outro sistema) que interage com o
sistema.

8.1.4. Diagrama de Classe

Denota a estrutura esttica de um sistema. As classes representam coisas que so


manipuladas por um sistema. Esse diagrama considerado esttico porque a
estrutura de classes vlida em qualquer ponto do ciclo de vida do sistema.

Neste Curso aprenderemos como trabalhar com Diagrama de Classe, pois esse
diagrama bem prximo da criao e estruturao de classes e herana entre as classes
criadas.

75

76

Curso Java SE - UTD

8.2. Abrindo o Projeto


Criando um Novo Projeto de Diagrama

Nomeando Projeto de Diagrama

Escolhendo Diagrama de Classe

76

77

Curso Java SE - UTD

Entrando no Diagrama criado, podemos visualizar no Lado direito da IDE Netbeans, um


boto chamado Paleta ele ser responsvel abrir uma aba onde podemos montar os
pacotes de classe. Veja a interface da aplicao:

Na direita Clicando em Class, clique no palco principal que ser gerado uma nova
classe indefinida. Para alterar a Classe, basta clicar em Create Atributes para criar os
atributos , e Create Operation para criar os mtodos, lembre-se que para o diagrama,
primeiro vem o nome da varivel ou mtodo, em seguida vem o seu tipo:
Exemplo: nome : String
Veja como criar uma classe simples com o tipo, pessoa:

Dessa forma podemos criar qualquer classe com os seus atributos e mtodos de forma a
poder visualizar melhor a estrutura do projeto.
Para criar interface ou Herana, basta clicarmos em uma classe ao qual voc quer
montar uma relao e aparecer o seguinte menu ao lado:
Implementation podemos criar uma implementao, ou seja
uma interface.

Dependency Uma forma de gerar herana entre Classe em Java

77

78

Curso Java SE - UTD

Capitulo 9.

Fila e Pilha

Iremos estudar Alguns estilos de agrupamento e organizao de dados, onde podemos


listar, retirar ou colocar elementos desse grupo de dados de forma organizada, levando em
considerao a sua posio no grupo, para isso podemos estudar conceitos de Fila e Pilha
para essas aplicaes, veremos nos prximos tpicos como trabalhar com cada uma delas.

9.1. Fila
Imagine que voc tem uma Fila de atendimento em um Banco.
O que podemos observar em uma Fila?

A fila poder est vazia, onde o


caixa no ir ter que trabalhar.

A fila poder est cheia, onde no


poder entrar ningum mais na fila
at que pelo menos saia uma
pessoa dela.

Quando algum novo chega, ele vai para o final da fila.

A pessoa que atendida, sempre o primeiro em uma fila e logo depois de ser
atendido, ele sai da fila, dando lugar a outras pessoas alterando a ordem de
chamada de todo mundo. Quem era o terceiro, passa a ser o segundo, quem era o
segundo passa a ser primeiro na fila.

Tudo o que acontece em uma fila normal tambm pode ser implementado na
Programao Java.

9.1.1. Implementando Fila em Java


Para que possamos implementar uma fila em Java temos que usar os mtodos da
interface Queue da classe LinkedList Dessa forma:

Queue fila = new LinkedList();


O Objeto fila ser responsvel por conter mtodo ao qual poderemos incluir, retirar,
e mostrar o prximo elemento da fila, veja na tabela abaixo os seus mtodos e suas
funes:
Mtodo

Funo

element(Object);

Mostra o primeiro elemento da fila sem remov-lo

offer();

Insere um novo elemento da fila

poll();

Retorna e retira o prximo elemento da fila. Retorna null se a


fila estiver vazia

78

79

Curso Java SE - UTD

Veja a implementao abaixo:

Os elementos nesse exemplo esto inseridos na seguinte ordem


5

Retirando os 3 primeiros elementos da Fila com o mtodo Poll, temos:


7

Inserindo o Elemento 10 e 1 na Fila usando o mtodo offer , temos:

10

Sendo assim, se usarmos o mtodo Poll mais 5 vezes, estes elementos seriam retornados e
retirados da fila nessa ordem mantendo a fila vazia. Quando a Fila estiver vazia, o comando Poll
passar a retornar null.
Vrios sistemas usam esse recurso, como sistema de atendimento ao cliente, um sistema de fila de
impressora onde os primeiros documentos a serem impresso tero prioridade em relao aos outros
documento que sero impresso em seguida. Pesquise por mais implementaes usando o recurso de
Fila.

79

80

Curso Java SE - UTD

9.2. Pilha
Imagine uma Pilha de Pratos a ser lavados o que podemos observar?

A pilha poder est vazia, onde no precisamos


lavar nenhum prato

A pilha poder est cheia, onde no poder entrar


nenhum prato a mais, at ser lavado algum

O prato que que chegar na pilha estar logo acima


dos demais.

O prato a ser lavado justamento o de cima ou seja,


o ultimo prato da pilha, ento os ltimos pratos a entrarem na pilha, sero os
primeiro a ser lavados, logo que eles forem lavados eles sairo da pilha, dando
espao para os pratos de baixo a ser lavados.

Claramente podemos perceber o velho ditado Os ltimos sero os primeiros e esta


regra tambm poder ser implementado em JAVA.

9.2.1. Implementando Pilha em Java


Para que possamos implementar uma pilha em Java temos que usar a Classe Stack,
dessa forma:

Stack pilha = new Stack();


O Objeto pilha ser responsvel por conter mtodo ao qual poderemos incluir,
retirar, e mostrar o ultimo elemento da pilha, veja na tabela abaixo os seus mtodos e suas
funes:

Mtodo

Funo

empty()

Verifica se a pilha est vazia retornando um Boolean

push();

Insere um novo elemento da pilha

pop();

Retorna e retira o ultimo elemento da pilha.

peek();

Retorna o ultimo elemento da pilha sem retir-lo.

Veja uma implementao pratica:

80

81

Curso Java SE - UTD

Os elementos nesse exemplo esto inseridos na seguinte ordem:


5

Retirando os 3 primeiros elementos da pilha com o mtodo pop, temos:


5

Inserindo o Elemento 10 e 1 na Pilha usando o mtodo push , temos:

10

Sendo assim, se usarmos o mtodo pop mais 4 vezes, estes elementos seriam retornados e
retirados da pilha na ordem inversa mantendo a pilha vazia. O Comando pop no retorna null
quando a pilha estiver vazia, ento recomanda-se sempre verificar se contm elementos na pilha
usando o mtodo empty.
Vrios sistemas usam esse recurso, um deles bem usado por ns sem percebermos, imagine que
est digitando um texto e precisa desfazer uma operao. Cada elemento de Input posto em
uma pilha e quando usamos o CTRL+Z como usar um pop na pilha de retirando apenas o
ultimo elemento digitado.Pesquise por mais implementaes usando o recurso de Pilha.

81

Curso de Java SE - UTD

Capitulo 10. Colees: List e Map


10.1. Introduo a Colees/Collections

Aprendemos em captulos anteriores que existe uma estrutura de dados chamada Array.
Essa estrutura de dados ela foi criada para guardar na memria do computador dados
primitivos ou objetos do mesmo tipo, de maneira organizada (bloco de dados contnuo),
em que cada informao pode ser acessada por ndices(index),
A estrutura de dados Array muito inflexvel, preciso definir seu tamanho assim que
ns a criamos. E isso pode gerar um problema para ns programadores Java.
Vamos analisar a seguinte situao:
Criaremos um Array para guardar os nomes de uma lista de 10 alunos do Curso de Java
UTD:

Mas se no meio do meu programa eu precisar acrescentar a minha lista mais 20 alunos.
Como o tamanho do Array alunosNomes foi definido com 10 posies ento no seria
possvel adicionar os 20 novos alunos a essa estrutura, teramos que tratar isso. Uma das
alternativas para fazer isso acrescentar o seguinte cdigo:

82

Curso de Java SE - UTD

Como facilitar isto?


Como usar o conceito de Array, porm com um pouco mais de flexibilidade?
Colees podem ser a sada para este problema. Uma das formas de pensar nas colees
como Arrays turbinadas, incrementadas com vrias funcionalidades e regras.
A definio formal de Colees : estruturas de dados utilizadas para armazenar e
manipular informaes, ou seja, so objetos que representam um grupo de objetos.
Esse captulo tem como objetivo abordar as principais funcionalidades e regras de duas
das principais colees do Java: List e Map.

83

Curso de Java SE - UTD

10.2.

Collection List ou Coleo Lista

Uma lista uma coleo de elementos arrumados numa ordem linear, isto , onde cada
elemento tem um antecessor (exceto o primeiro) e um sucessor (exceto o ltimo).
Normalmente implementada como "Array" ou "Lista Encadeada". A Lista pode ser
mantida ordenada ou no e as operaes mais importantes de uma coleo do tipo Lista
so:
Adio de elementos

Adicionar um objeto em qualquer lugar da lista, fornecendo o ndice desejado;

Remoo de elementos

Remover um objeto presente em qualquer lugar da lista, fornecendo o ndice


desejado;
Acesso aos elementos

Obter o elemento de qualquer posio da lista, fornecendo o ndice desejado;

Iterar sobre os elementos;

Pesquisa de elementos

Descobrir se um certo elemento est na lista;

Descobrir o ndice de um certo elemento na lista (onde est);

Indagar sobre atributos

Obter o nmero de elementos da coleo;

Em Java existem trs classes que trabalham com a Coleo do tipo Lista ou List elas se
encontram no pacote/package java.util . So elas:

Vector

ArrayList

LinkedList

Escolhemos explanar nesse captulo a classe Java mais utilizada para implementar listas
que a classe ArrayList.

84

Curso de Java SE - UTD

10.3.

ArrayList

Acessando a documentao do Java 7 podemos visualizar todas as especificaes dessa


classe, usada para programar colees do tipo lista. Abaixo tabela com todos os mtodos da
classe ArrayList:

85

Curso de Java SE - UTD

Desses mtodos listados na documentao do Java 7 iremos estudar os mtodos


principais, os quais fazem as aes de adio de elementos, remoo de elementos, acesso
aos elementos, pesquisa de elementos e indagar sobre atributos de uma determinada lista.

10.3.1.

Criando uma Lista em Java usando a Classe ArrayList

Para criar uma lista usando a Classe ArrayList do Java, escreva em seu programa a
seguinte linha de cdigo:

tipo: tipo do objeto que voc quer guarda na lista. Ex: Integer, String, Carro, Pessoa...

Exemplo:

Na verso 7 do Java voc tambm pode criar uma lista dessa forma:

Observao:
Todas os cdigos que trabalharem com listas usando a classe ArrayList precisam
importar a classe ArrayList. Isso pode ser feito adicionando a seguinte instruo no
cabealho da classe:
import java.util.ArrayList;

10.3.2.

Adicionando elementos em uma Lista

Agora que voc j criou seu objeto Lista voc pode adicionar elementos dentro dela. As
Listas quando criadas elas no possuem nenhum elemento, ou seja, elas so Listas Vazias.
Na Lista, diferente do Array, voc no especifica seu tamanho, ela cresce de forma
dinmica medida que voc acrescenta dados a ela.
Vamos aprender como adicionar elementos a uma Lista, para isso iremos usar o mtodo
add() que pertence a classe ArrayList.

86

Curso de Java SE - UTD

Exemplo:

O mtodo add(), usado da forma mostrada acima ele sempre coloca o novo dado
adicionado lista na ultima posio da mesma, mas podemos utiliz-lo de outra maneira,
de tal forma que podemos escolher a posio em que queremos adicionar o novo elemento.
Vamos ver como fica essa outra forma de usar mtodo add().

Exemplo:

Para visualizar todos os lados da lista na forma de uma String use o mtodo toString(),
desta forma:

Vamos aplicar esse mtodo no exemplo em que criamos uma lista de anos, ficar desta
maneira:

87

Curso de Java SE - UTD

Sada do programa:

10.3.3.

Removendo elementos de uma Lista

Para remover um dado da lista utilizamos o mtodo remove() da classe ArrayList. O


mtodo remove() funciona da seguinte forma:

Vamos aplicar esse mtodo no exemplo em que criamos uma lista de anos, ficar desta
maneira:

88

Curso de Java SE - UTD

Outra forma de usar o mtodo remove() passando para o mtodo o objeto que voc
quer remover. Ficando desta forma:

Exemplo:

Sada do programa sem o mtodo remove():

Sada do programa aplicando o mtodo remove():

10.3.4.

Acessando elementos da Lista

Para acessar um valor de uma determinada lista usamos o mtodo get() da classe
ArrayList dessa forma:

Exemplo:

Temos mtodos na classe ArrayList para auxiliar na interao da lista, ou seja, percorrer
a lista acessando os seus valores em todas as direes possveis.
Esses mtodos precisam, alm da lista que iram auxiliar a percorre, um objeto do tipo
ListIterator onde esse objeto ser como um leitor de posies da lista que pode
89

Curso de Java SE - UTD

percorrer a lista em todos os sentidos possveis.


Vamos entender melhor com o seguinte exemplo:
Vamos criar uma lista em Java, usando a classe ArrayList, para guardar o nome das
linhas de nibus de Fortaleza.

Agora vamos criar um objeto do tipo ListIterator, onde esse objeto ser como um leitor
de posies da lista que pode ser deslocado para frente e para trs ao longo de uma lista.
Para criar um objeto do tipo ListIterator precisamos importar a classe que cria esse objeto
para o nosso programa, pois esse objeto no pode ser instanciado pela classe ArrayList. A
importao da classe feita adicionando a seguinte instruo no cabealho de sua classe:
import java.util.ListIterator;
Aps importar o mtodo podemos criar nosso objeto do tipo ListIterator da seguinte
maneira:

Por fim, podemos usar os mtodos da classe ArrayList que nos ajudam a percorrer uma
lista, da seguinte forma:

90

Curso de Java SE - UTD

Sada do programa:

De forma semelhante ao mtodo hasNext() e o mtodo next() podemos ainda usar em


nossos programas Java os seguintes mtodos:
Mtodos para auxiliar percorre uma Lista usando a classe ArrayList
hasNext(): retorna true se o elemento lido pelo percorredorLista tem sucessor, caso
contrrio retorna false;
hasPrevious(): retorna true se o elemento lido pelo percorredorLista tem antecessor,
caso contrrio retorna false;
next(): faz o percorreLista avanar para a posio seguinte da lista e retornar o novo
valor lido;
previous(): faz o percorreLista retroceder para a posio anterior da lista e retornar o
novo valor lido;
nextIndex(): retorna o ndice do elemento sucessor ao elemento lido pelo percorreLista;
previousIndex(): retorna o ndice do elemento antecessor ao elemento lido pelo
percorreLista;
91

Curso de Java SE - UTD

10.3.5.

Pesquisando elementos na Lista

Pesquisar um elemento na lista bastante simples. Vamos usar o mtodo indexOf()


que se encontra na classe ArrayList para pesquisa em uma lista. Esse mtodo retorna o
valor do ndice do objeto procurado se ele existir na lista, caso contrrio retorna -1.

Exemplo:

Sada do programa:

92

Curso de Java SE - UTD

10.4.

Collection Map ou Coleo Mapa

Um mapa armazena pares (chave, valor) chamados itens, essas chaves e valores podem
ser de qualquer tipo, portanto, a chave utilizada para achar um elemento rapidamente.
Estruturas especiais so usadas para que a pesquisa seja rpida, como "Tabela Hash" ou
"rvore". Os dados armazenados nos mapas podem ser mantidos ordenados ou no (com
respeito s chaves).
A coleo do tipo Mapa difere das Listas por diversas caractersticas, as principais so:

as estruturas de dados que as implementam;

na coleo do tipo Mapa podemos escolher o tipo e o valor que tero as


chaves(ndices), atravs delas teremos acesso aos dados. As chaves (ndices) e dados dos
Mapas podem ser de qualquer tipo, inclusive um objeto. J nas Listas somente os valores
armazenados podem ser de qualquer tipo, seus ndices so sempre nmeros inteiros
indexados a partir do zero de forma automtica, medida que vamos adicionando
elementos coleo.
As operaes mais importantes de uma coleo do tipo Mapa so:
Adio de elementos

Adicionar um item no mapa (fornecendo chave e valor)

Remoo de elementos

Remover um item com chave dada

Acesso aos elementos

Iterar sobre os itens

Pesquisa de elementos

Descobrir se um elemento com chave dada est na coleo

Indagar sobre atributos

Obter o nmero de elementos

Observe que o acesso coleo sempre feita conhecendo a chave

Vamos utilizar a classe HashMap para trabalhar com colees do tipo mapa ou map.

93

Curso de Java SE - UTD

10.5.

HashMap

A classe HashMap uma implementao da interface Map do pacote java.util, e


possibilita trabalhar com mapeamento de objetos no esquema chave/valor, ou seja,
informada a chave, resgato o valor.
Acessando a documentao do Java 7 podemos visualizar todas as especificaes dessa
classe, usada para programar colees do tipo mapa/map. Abaixo tabela com todos os
mtodos da classe HashMap:

Vamos explanar os principais mtodos da classe HashMap, mtodos que nos permitir
criar, adicionar, remover, selecionar e pesquisar itens em uma coleo do tipo Map.

10.5.1.

Criando uma coleo do tipo Mapa usando a Classe HashMap

Para criar um mapa usando a Classe HashMap do Java, escreva em seu programa a
seguinte linha de cdigo:
tipo_da_chave: coloque o tipo que ter a chave/ndice do seu Map, essa chave ser
usada para acessar os valores guardados no Map;
tipo_do_valor: coloque o tipo que ter os valores que sero guardados em seu Map;
Pronto, dessa forma j instanciamos

uma coleo do tipo Map usando a classe


94

Curso de Java SE - UTD

HashMap.
Agora temos que inserir elementos a coleo do tipo Map , pois s criamos o Map, mas
no h elementos dentro dele.
Lembre se de importar a Classe HashMap para seu programa, j que estamos usando-a
para implementar e trabalhar com Colees do tipo Mapa. Podemos importar a classe
colocando a seguinte instruo no cabealho do programa o qual estamos escrevendo:
import java.util.HashMap;

10.5.2.

Adicionando elementos em uma coleo do tipo Mapa

Aps criar o seu Map, podemos adicionar um elemento usando o mtodo put() da
Classe HashMap da seguinte forma:

objeto_chave: valor do objeto que ser a chave de acesso para os valores do mapa;
objeto_valor: valor do objeto que ser guardado no mapa;
Exemplo:
Vamos criar um Map para guardar estados e suas respectivas capitais. Os estados sero
as chaves e as capitais sero os valores guardados no Mapa, ambos sero do tipo String.

Agora vamos adicionar os valores ao nosso mapa usando o mtodo put, da seguinte
forma:

Vamos usar o mtodo toString() para visualizar como esto os dados dentro do nosso
mapa, da seguinte forma:

Sada do Programa:

95

Curso de Java SE - UTD

10.5.3.

Removendo elementos em uma coleo do tipo Mapa

Para remover elementos de uma coleo do tipo Mapa usando os mtodos da Classe
HashMap usamos o mtodo remove().

objeto_chave: chave de acesso do elemento a ser removido do mapa;

O mtodo remove() retorna uma String com o valor removido do mapa ou retorna o
valor null se no for achado nenhum valor associado a chave passada no argumento do
mtodo.
Exemplo:
Vamos remover uma capital do mapa cidadeEstado criado anteriormente. O cdigo ir
ficar dessa maneira:

Sada do programa:

96

Curso de Java SE - UTD

10.5.4.
Selecionando/Pesquisando elementos em uma coleo do tipo
Mapa
O mtodo de seleo get() da classe HashMap o mesmo mtodo usado para se
pesquisar um valor dentro de um mapa. Esse mtodo funciona da seguinte forma:

objeto_chave: chave de acesso do elemento a ser selecionado/pesquisado do mapa;


Exemplo:

Sada do programa:

10.5.5.

Nmero de elementos em uma coleo do tipo Mapa

Para sabermos o nmero de elementos contido em um mapa podemos utilizar o mtodo


size(), esse mtodo pode ser usado de maneira semelhante com colees do tipo Lista
usando a classe ArrayList.
O mtodo size() funciona da seguinte forma:

A chamada ao mtodo size() nos retorna um valor inteiro que a quantidade de


elementos de um mapa.

97

Curso de Java SE - UTD

Exemplo:

Sada do programa:

98

Curso de Java SE - UTD

Capitulo 11.

Interface Grfica com Usurio


GUI

Vamos trabalhar agora a interface


grfica do seu programa em Java!

11.1. Interface Grfica com usurio - GUI


A Interface Grfica com o Usurio, tambm conhecido como GUI - Graphical User
Interface, em Java, feita atravs de bibliotecas de classes, sendo que a primeira a surgir
foi a AWT(Abstract Window Toolkit). A AWT surgiu j na verso 1.0, mas se tornou
confivel a partir da verso 1.1. A maneira como as classes dessa biblioteca trabalham
garante a criao dos elementos da interface de usurio seguindo o comportamento
destinado s ferramentas GUI nativas de cada plataforma (Windows, Mac, Solaris, ...).
Alguns exemplos destes elementos so: botes, listas, menus, componentes de textos,
contineres (janelas e barras de menus), caixas de dilogo para abrir ou salvar arquivos,
alm de elementos para manipulao de imagens, fontes e cores.
A portabilidade de plataforma funcionava bem em aplicaes simples, mas aplicaes
que envolviam elementos mais complexos, como menus e barras de rolagem, por exemplo,
apresentavam diferenas de comportamento conforme a plataforma. O que aconteceu foi
que as aplicaes visuais feitas em Java no se pareciam, e nem tinham as mesmas
funcionalidades, com as aplicaes convencionais de cada plataforma.

99

Curso de Java SE - UTD

A partir da verso 2 do Java, a JFC (Java Foundation Classes) apresentou novos recursos
para a construo da GUI das aplicaes, o que melhorou muito os problemas de
portabilidade. So eles:

Java 2D: novas funes para desenhos e grficos.

Drag & Drop: clicar, arrastar, copiar e colar.

Swing: biblioteca de classes extenso da AWT, onde so apresentados novos


componentes de interface e o que conhecido por look and feel, que uma
adaptao perfeita da GUI ao sistema operacional especfico de desenvolvimento.

bom salientar que o Swing no substitui o AWT, mas o kit de ferramentas GUI mais
utilizado para desenvolvimento de aplicaes visuais. O AWT continua existindo,
mantendo a mesma arquitetura criada para o Java verso 1.1.
O Swing possui muito mais recursos, alm de garantir maior portabilidade e, em boa
parte dos casos, mais fcil de usar. Isso no significa que ou se utiliza AWT ou se utiliza
Swing, normalmente o que acontece que elementos das duas bibliotecas so utilizados
conjuntamente nas aplicaes.

11.2. Bibliotecas AWT e SWING


So as fontes das classes que utilizaremos a partir daqui. Nelas moram os componentes
grficos para Java, e por isso devemos import-las no incio de nossas classes
gerenciadoras de telas:

import javax.swing.*;

import java.awt.*;

11.3. JFrame
Pode parecer estranho para quem vem de outras linguagens, como o Delphi ou o VB,
mas em Java, cada tipo de componente grfico uma classe com atributos e mtodos
prprios. E para utiliz-las, devemos instanci-las.

11.3.1.

Camadas JFrame

Antes que possamos criar nossa primeira janela precisamos conhecer como funciona a
hierarquia dos elementos que so responsveis visualizao grfica.
Frame
RootPane
LayeredPane
ContentPane
GlassPane
Onde:

100

Curso de Java SE - UTD

1. RootPane Representa uma camada que ir gerenciar todas as camadas internas.


2. LayeredPane Contm uma regio para Barra de Menu e o ContentPane
3. ContentPane Contm todos os Componentes como um campo de texto,campo
de seleo de opes, etc.
4. GlassPane Camada que por padro invisvel, porm pode ser usado para
mostrar algum componente por cima das demais, como uma imagem.
Agora que sabemos como como funciona um Jframe iremos criar nossa primeira janela
em java.

11.3.2.

Nossa primeira Janela com JFrame

A primeira e mais simples chama-se JFrame, e cria telas retangulares sem nada dentro,
um espao onde trabalharemos logo depois.

O mtodo SetBounds trabalha com a localizao e tamanho da tela, sendo a seguinte


ordem: distncia do canto esquerdo da tela, distncia do topo da tela, largura e altura.
tela.getContentPane().setBackground(Color.RED);
Aqui, invocamos o mtodo que verifica qual o campo de Content do JFrame, ou seja, a
regio onde no est o menu nem as bordas, e muda sua cor a partir do mtodo set
Background. Eu usei uma biblioteca de cores, a Color, e defini a janela como vermelha;
Poderia ter usado azul, cinza, verde, etc.
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Aqui, eu determino qual a ao a executar quando este JFrame for fechado. No caso, ele
fecha o programa todo, num efeito de BREAK. A instruo DISPOSE_ON_CLOSE apenas
levar o JFrame a fechar sem derrubar o programa todo.
tela.setLayout(null);
Aqui, escolhi um Layout para o meu JFrame. Ou melhor, escolhi que seja nenhum.
Existem Layouts prontos para JFrames, onde os botes ficam dispostos em forma de
fileira, ou nos cantos, ou expandidos. A maioria tem um resultado grotesco. Se quisermos
desenhar nossa tela com liberdade para faz-la bonita, temos que escolher o NULL;
tela.setVisible(true);
Depois de preparado, o JFrame pode j ficar visvel. Este passo vem no final de toda a
sua montagem.
Agora vamos ver como ficou nossa janela.

101

Curso de Java SE - UTD

11.4. Criando uma classe com propriedades SWING


No tpico anterior aprendemos como construir uma Janela usando as propriedades do
JFRAME diretamente. Para a nossa janela criada, o mtodo main tinha a responsabilidade
direta de criar uma janela. Para essa situao, se quisssemos criar uma nova janela
tnhamos que chamar novamente a Classe JFrame e atribuir todas as caractersticas
novamente linha a linha. Podemos construir uma janela de uma forma melhor criando um
prprio modelo com mtodos, encapsulamento, herana e os demais recursos aprendidos
sobre orientao a objetos. Para criar o nosso modelo de JFrame precisamos primeiro criar
uma classe e herd-la de JFRAME dessa forma:

Assim nossa classe chamada MinhaJanela herda todas as propriedades de JFrame


atravs da classe Pai.
Podemos definir um padro para qualquer janela criada partindo de MinhaJanela,
vamos agora definir que toda janela nossa ter obrigatoriamente um ttulo. Basta
inserirmos um construtor e redirecionar esse valor para classe que tem a responsabilidade
de receber o ttulo de uma Janela.

No construtor
podemos tambm
definir qualquer
outra propriedade na sua chamada, como coordenadas, cor do plano de fundo,
procedimento utilizado quando for fechado a janela,layout, visibilidade, etc. Veja o
Exemplo abaixo ainda no mesmo construtor :

102

Curso de Java SE - UTD

Agora indicamos que qualquer instancia de MinhaJanela ter as mesmas


propriedades, sendo diferenciadas apenas pelo seu Ttulo.
Vamos instanciar no mtodo main a classe que acabamos de definir:

Temos ento o mesmo resultado do tpico anterior, perceba que se quisermos criar uma
2 janela por exemplo, no precisamos definir todas as propriedades novamente, basta
instanciar uma nova MinhaJanela definindo um segundo ttulo, assim teremos uma nova
janela.
Usando herana, podemos atravs da nossa classe definida acessar os elementos do
Jframe baseado no seu nvel de encapsulamento. No Exemplo abaixo usaremos o mtodo
setLocation() para alterar a localizao da nosssa janela. Esse mtodo no foi criado por
ns, mas foi definido pelas classes Pai nas definies de herana da Classe Jframe.

Temos ento o seguinte resultado final:

Iremos usar o exemplo da Classe Minha Janela para criar os componentes nos prximos
tpicos.

103

Curso de Java SE - UTD

11.5. JLabel
um pequeno componente com o qual colocamos pedaos de texto sem nenhuma
funo, a no ser a de indicar para qu servem os campos de uma tela qualquer.

O cdigo acima no apresenta grandes novidades. Apenas instanciamos o Jlabel, dandolhe um texto qualquer para exibir. Depois, demos o mesmo setBounds nele, em seguida
fizemos a ao realmente revolucionria:
super.getContentPane().add(texto);
Adicionamos o objeto texto na tela usando super.getContentPane(). Note que o
setBounds do texto passa a usar como bordas as bordas do JFrame. E fica contido nele.
O JLabel pode ter desenhos por dentro, mas veremos isso mais adiante, quando
tratarmos do Icon, outro tipo de objeto Java.
O resultado de nossa janela esse:

104

Curso de Java SE - UTD

11.6. JButton
O JButton , finalmente, o boto. Colocamos ele nas telas com inmeras funes. Estas
funes sero tratadas mais adiante, quando chegarmos s aulas sobre Eventos. Por
enquanto, basta-nos desenhar os botes.
O JButton poder ser instanciado de trs formas diferentes:
1. JButton() aqui, teremos depois que rodar um mtodo setText(algum texto)
para dar-lhe um contedo(um contedo que aparece para o usurio).
2. JButton(String) aqui, escrevemos algum texto para aparecer no boto e o
usurio saber do que se trata.
3. JButton(icon) neste caso, adicionamos uma figura ao boto para dar-lhe uma
aparncia personalizada.
Veja este cdigo:

No exemplo acima, usamos praticamente a mesma tela criada antes, porm adicionamos
as rotinas de criao de um boto. Primeiro, instanciamos a classe JButton e usamos os
mtodos j conhecidos setBounds para definir suas coordenadas.

105

Curso de Java SE - UTD

A nossa janela ficar assim:

11.7. JTextField
O JTextField uma caixa utilizada para que o usurio possa escrever um texto de uma
linha s. Tratasse de um componente bastante simples, que tem basicamente as mesmas
especificaes dos que acabamos de ver: setBounds, setBackground, setForeground, e o
ADD da tela sobre ele.
Enriquecendo o cdigo anterior, adicionando um JTextField:

O tratamento do texto de um JTextField dar-se- por meio de dois mtodos bastante


simples:
getText() servir para capturar o qu o usurio digitou no campo.
setText() servir para determinarmos que texto deve ir no campo. Muito til quando
se abre um registro de um banco de dados e o campo JTextField deve receber um campo de
registro para alterao.

106

Curso de Java SE - UTD

A nossa janela ficar assim aps acrescentar o JtextField:

11.8. Icon
A classe Icon tem um uso bastante simples, mas muito importante. Com ela, podemos
carregar uma imagem (devidamente criada em um arquivo JPG ou PNG), para dentro do
programa, utilizando esta imagem como quisermos.
O comando para isso bastante simples. Basta instanciar a classe Icon criando uma
ImageIcon que carregar o arquivo, cujo nome ou localizao completa.
Comando assim:
Icon imagem = new ImageIcon(arquivo.jpg);
Existe ainda uma funcionalidade que muita gente desconhece: O formato de imagem
PNG, que capaz de armazenar instrues sobre transparncias, quando lido, acaba numa
imagem com transparncias, pois o Java consegue respeitar bem estes parmetros.
Depois de carregarmos uma imagem para dentro de uma varivel, podemos atribu-la a
uma srie de objetos atravs do mtodo setIcon.
Exemplos:
JButton botao = new JButton();
botao.setIcon(imagem);
JLabel rotulo = new JLabel();
rotulo.setIcon(imagem);
Um detalhe importante a notar que, quando atribumos o Icon a um JButton, o boto
ganha o desenho mas permanece com o aspecto de boto, mudando a cor da borda
quando colocamos o mouse sobre ele.
J quando atribumos o Icon a uma JLabel, a imagem fica parecendo solta no ar entro da
tela. E a, a transparncia tem realmente sua funo efetiva, uma vez que o fundo atrs da
JLabel aparece plenamente.
possvel fazer botes redondos, triangulares ou com qualquer forma, usando Jlabel,
simplesmente desenhando o boto, colocando em uma JLabel e, na funo do boto,
107

Curso de Java SE - UTD

incluir um comando para mudar o Icon da JLabel, trocando-o por uma figura do mesmo
boto, mas com aparncia de pressionado.

11.9. Editando fonte com o setFont()


Podemos formatar as fontes de nossos botes e rtulos...
Vamos usar o mtodo setFont dessa forma:

Nossa janela ficar assim:

11.10.

JMenuBar, JMenu e JMenuItem

Estas classes so utilizadas sempre em conjunto, para criar um menu na parte superior
do JFrame, e deixar seu software com aquela facilidade de uso que os usurios modernos
exigem.
Aqui, comeamos a trabalhar uma modalidade de programao que costumo chamar
informalmente de empilhamento de objetos, pois os objetos s funcionam quando
colocamos um dentro do outro em uma espcie de pirmide.
O objeto que serve de base o JMenuBar, adicionado diretamente ao JFrame, e sobre ele
vo todas as coisas. Ele a barra clara no alto do JFrame, dentro da qual os menus ficaro.
Depois, temos os JMenu, que ficam dentro da MenuBar e podem, inclusive, ficar um
dentro do outro. Dentro dos JMenu, ficam os JMenuItem, que tm uma funo cada um.
Para ativar suas funes, utilizaremos os Listeners, mais adiante. Deixemos isso para outro
captulo.
Criando uma janela, um JMenuBar(container de menus), Menus(JMenu) e por fim itens
de menus(JMenuItem).

108

Curso de Java SE - UTD

Agora vamos adicionar o JMenuBar dentro da janela, depois adicionar os JMenus


dentro do JmenuBar, e por fim adicionar dentro do JMenu itens de menus(JMenuItem) .

109

Curso de Java SE - UTD

Deixando nossa janela visvel:

Agora vamos ver como ficou nossa nossa janela :

11.11.

JCheckBox

Uma JCheckBox um daqueles componentes em que vemos uma caixinha quadrada


com uma frase ao lado, e podemos marcar ou desmarcar a caixinha quadrada.
As CheckBoxes no so usadas para fazer escolhas com apenas uma opo vlida,
podendo ser todas marcadas ou todas desmarcadas livremente, desde que o programador
no coloque restries no prprio cdigo.
Veja como trabalhar com JCheckBox no exemplo de cdigo abaixo:

110

Curso de Java SE - UTD

Depois, para termos um retorno do valor de cada JCheckBox, utilizamos o mtodo


isSelected(), que retorna um valor boolean.
Assim:
boolean x = pizza.isSelected();
Ou ainda:
If (pizza.isSelected()) {
- Funes a serem executadas.
}
Veja como ficou nossa janela:
111

Curso de Java SE - UTD

11.12.

JRadioButton

O JRadioButton funciona apenas quando pensamos nele inserido em um grupo. Eu


posso colocar quantas opes quiser, formando um menu, e se todos os meus
JRadioButtons estiverem no mesmo grupo, o usurio s poder marcar um deles. Ao
marcar um, os outros perdem a marcao.

Veja o cdigo abaixo e saiba como trabalhar com JRadioButton.


Veja como ficou nossa janela:

112

Curso de Java SE - UTD

11.13.

JComboBox

A JComboBox desenha uma caixinha parecida com a JTextField, s que ao invs de


termos um texto a escrever, temos uma seta com a qual abrimos uma fileira de
possibilidades de preenchimento para a caixa.
Veja como trabalhar como trabalhar com JcomboBox, observando o exemplo abaixo:

113

Curso de Java SE - UTD

Para obter o retorno das informaes, temos uma srie de mtodos que nos dizem o que,
afinal, o usurio escolheu. Os mais usados so os seguintes:
comb.getSelectedItem()
Este retorna o texto que est na caixa do Combo. Poder ser usado especialmente para
quando colocamos o setEditable em TRUE, ou seja, quando o usurio pode escrever na
caixa. O retorno deste mtodo uma String, com o texto da caixa.
comb.getSelectedIndex();
Este mtodo retorna o ndice do item selecionado (como se as opes fossem um vetor).
Caso o usurio possa escrever algo na caixa de texto, e escreva alguma coisa que no consta
das opes fornecidas, ento o ndice que retorna o -1. Portanto, s use se o setEditable
for FALSE.

11.14.

Mais Componentes Swing

Existem mais componentes Swing, alm dos mostrados at aqui. Foram mostrados os
principais componentes. Caso voc precise ou deseje conhecer mais componentes Swing
acesse:
http://docs.oracle.com/javase/7/docs/api/

Capitulo 12.

Gerenciadores de Layout

12.1. Gerenciadores de Layout


Gerenciamento de layout ( Layout Management ) o processo de determinar o tamanho
e a posio dos componentes na janela grfica do programa. ele o responsvel por
determinar onde o componente ir ficar, como ir ficar, qual o comportamento a ser
tomado na hora de redimensionar a tela.
Por padro o Java vem com cinco gerenciadores de layout: BorderLayout, BoxLayout,
FlowLayout, GridBagLayout, GridLayout e um adicional chamado CardLayout. So os
gerenciadores de layout que determinam como os componentes iro ficar em seu
programa, portanto um bom conhecimento sobre o funcionamento dos mesmos faz-se
necessrio para ter domnio de programao grfica em Java.
Geralmente, quando chamamos o mtodo "add" para adicionar um componente na tela,
ele ser posicionado de acordo com o gerenciador de layout previamente configurado. A
maior parte simplesmente vai adicionando os componentes com base na ordem em que
foram programados, porm alguns outros, como o BorderLayout, necessitam que voc
informe a posio relativa no container.
A escolha do gerenciador de layout depende muito das necessidades do programa. Por
padro todos objetos JPanel so configurados para usar o FlowLayout, enquanto um
JFrame e JDialog j usam o BorderLayout como padro.
Em ambos os casos usado o mtodo "setLayout" para especificar um novo layout
manager, sendo necessrio passar para este mtodo o tipo que desejamos. Abaixo h um
exemplo para cada tipo de gerenciador de layout, ficando assim fcil para vermos como
cada um se comporta.

114

Curso de Java SE - UTD

12.2.

BorderLayout

O primeiro exemplo mostra como um BorderLayout funciona. Digite o seguinte cdigo e


salve como "BorderLayoutTest.java":

Veja como ficou nossa janela:

12.3.BoxLayout
Um BoxLayout coloca os componentes em uma nica linha ou coluna, permitindo ainda
que voc especifique o alinhamento deles. Digite o seguinte programa e salve em um
arquivo chamado "BoxLayoutTest.java":

115

Curso de Java SE - UTD

Nossa janela ficar dessa forma:

12.4.

FlowLayout

Como dito anteriormente, um FlowLayout o gerenciador padro de todo JPanel, caso


no seja especificado outro. FlowLayout posiciona os componentes lado a lado, e em
termos seria a mesma coisa que usar um BoxLayout com a propriedade X_AXIS setada
( no nosso exemplo anterior usamos Y_AXIS ). O seguinte programa,
"FlowLayoutTest.java", demostra isso:

116

Curso de Java SE - UTD

Veja como ficou nossa janela:

12.5.GridLayout
Um GridLayout atua como uma grade de uma planilha de clculo, colocando os
componentes em linhas e colunas pr-determinadas e deixando os componentes com o
mesmo tamanho. Veja isso no programa "GridLayoutTest.java":

117

Curso de Java SE - UTD

Veja como ficou nossa janela:

12.6.

GridBabLayout

O mais flexvel gerenciador de layout o GridBagLayout. Ele permite colocar


componentes em grades de colunas, sendo possvel um componente ocupar mais de uma
coluna ao mesmo tempo. As linhas tambm no precisam necessariamente ter os mesmos
tamanhos, ou seja, voc pode configurar diferentes larguras e alturas de acordo com a
necessidade. Eis o programa "GridBaglayoutTest.java":

118

Curso de Java SE - UTD

Veja como ficou nossa janela:

Logicamente possvel fazer muito mais com os gerenciadores de layout, h vrias


maneiras de configurar e utilizar. Para obter mais informaes sobre os mtodos
disponveis para cada um consulte a API, disponvel em:
http://docs.oracle.com/javase/7/docs/api/

119

Curso de Java SE - UTD

Capitulo 13.

Eventos (Listeners)

13.1. ActionListener
Vamos estudar algo muito interessante: o ActionListener. Trata-se de uma classe que
detecta se houve uma ao no objeto a que ela est associada (um boto, por exemplo), e
que, dependendo da ao executada, rodar uma funo qualquer. Vejamos um exemplo
de cdigo usando o ActionListener:

At aqui, no fizemos nada de diferente. Criamos a JFrame e um boto.


ActionListener ac = new ActionListener() {
Aqui, instanciamos a classe ActionListener, mas modificamos um de seus mtodos, no
caso, o ActionPerformed, que tem o poder de fazer alguma coisa quando o usurio clicar no
objeto que tem ActionListener.
public void actionPerformed(ActionEvent e) {
A declarao acima um mtodo, o mesmo que citamos antes. O argumento dele um
evento ocorrido que fica em uma lista de eventos possveis determinados pelo usurio,
como veremos mais adiante.
if ("botao1".equals(e.getActionCommand())) {
JOptionPane.showMessageDialog(null, "Apertou o boto!", "Ol!",
JOptionPane.INFORMATION_MESSAGE);
}
Aqui, a coisa simples: caso o ActionCommand do evento e seja igual a botao1, uma
caixa com uma mensagem aparecer na tela.
}
};
Quando alteramos um mtodo da classe no momento de sua instanciao, terminamos
com chaves e ponto e vrgula; Agora, vem o final, montar a tela e colocar este
ActionListener para funcionar.
botao.setActionCommand("botao1");
botao.addActionListener(ac);
120

Curso de Java SE - UTD

Acima, eu determinei qual o ActionCommand do boto (no caso botao1), e depois


adicionei o ActionListener ao boto, fazendo com que ele passe a detectar quando o
usurio clica no boto, acionando o mtodo ActionPerformed.
tela.setLayout(null);
tela.add(botao);
tela.setVisible(true);
}
}

13.2.FocusListener
O FocusListener se parece com o ActionListener em seu modo de construo, mas serve
para detectar quando o foco (ou seja, o cursor, a seleo, no o ponteiro do mouse) est
sobre um objeto ou no.
Ele possui dois mtodos que precisam ser implementados: o focusGained e
o focusLost, um para quando o objeto ganha foco e outro para quando perde.

121

Curso de Java SE - UTD

13.3.KeyEvent
O KeyEvent serve para que eu possa coordenar as aes do usurio com o teclado
quando ele est escrevendo em algum espao ou utilizando alguma funo. Posso atribuir
KeyListener a qualquer objeto grfico do Java QUALQUER! e detectar o que, afinal, o
meu usurio est apertando no teclado.

Acima, defini a ao do mtodo keyPressed, ou seja, quando o usurio enfia o dedo no


boto.

Acima, defini a ao a executar para quando o usurio tira o dedo do boto que havia
pressionado.
122

Curso de Java SE - UTD

O mtodo keyTyped funciona quando o aperto da tecla faz efeito. Isso quer dizer que se
eu botar o dedo numa letra do teclado, e no tirar mais, e esta letra ficar se repetindo, o
evento keyTyped tambm ficar.

NOTA: Pode-se detectar qual o boto apertado pelo usurio explorando a varivel
KeyEvent e, que retornar o cdigo da tecla apertada.

13.4.

MouseListener

O MouseListener, como seu nome obviamente revela, serve para tratarmos eventos
relacionados ao uso do mouse.

123

Curso de Java SE - UTD

No mtodo acima, o mouseClicked, ou detecto que o usurio deu um ou mais cliques no


meu componente que possui o MouseListener. Bom. Uma vez definido que isto ocorre, eu
resolvi dificultar um pouco as coisas, colocando em prtica o mtodo getClickCount, que
detecta quantas clicadas rpidas o usurio deu sobre o objeto. Com isso, posso definir
aes para o clique, o duplo clique, o triplo clique, at o milionsimo clique (os usurios
que ficariam cansados, mas tudo bem).

O mtodo mouseEntered ocorre quando o mouse adentra, quando o ponteiro passar por
cima.

Obviamente, o mouseExited ocorre quando o ponteiro sair de cima do objeto.

mousePressed um evento que continua em ao enquanto o usurio no tirar o dedo de


cima do boto do mouse, ficando com ele apertado.

O evento mouseReleased acontece quando o usurio finalmente larga o boto.

124

Curso de Java SE - UTD

Ns podemos saber qual a localizao do ponteiro do mouse utilizando dois mtodos:


getX() retorna a posio do mouse no eixo X (horizontal) dentro do objeto a que
estamos atribuindo o MouseListener.
getY() Faz o mesmo, s que com a posio do eixo Y (vertical).

125

Curso de Java SE - UTD

Capitulo 14. Java e Banco de Dados: JDBC


14.1. Introduo
Vamos aprender como persistir(gravar) os dados da nossa aplicao em um Banco de
dados e tambm a executar os comandos SQL utilizando um programa Java. No Java
existem vrias formas de se fazer essa funcionalidade, todavia explanaremos a persistncia
utilizando o driver JDBC(Java Database Connectivity).
Desenvolveremos uma agenda de contatos usando a linguagem de programao Java. A
base de dados se chamar Agenda e teremos uma tabela chamada contato com os campos
id, nomeContato e telefone. O SGDB ser o MySQL Server.
Abaixo arquitetura do banco de dados que ser utilizado e registros j existentes na
tabela contato.

14.2.

Comunicao: Java e Mysql

Para que sua aplicao Java consiga se


comunicar com o SGBD MySQL,
precisamos usar um recurso chamado de
Driver JDBC.
JDBC um conjunto de classes e
interfaces (API) escritas em Java que
possibilitam o envio de instrues SQL
para qualquer banco de dados relacional,
ou seja, existem classes escritas pelas
empresas que desenvolveram os SGDB's que j conhecemos: MySQL Server, Oracle
Database, Sql Server... cada uma implementou o driver JDBC de uma forma que possibilite
a comunicao do SGBD que voc pretende usar com uma aplicao Java. Ento temos
uma implementao do driver JDBC para cada tipo de SGBD. Essas classes(API JDBC) so
disponibilizadas no site do SGBD que voc deseja utilizar.

126

Curso de Java SE - UTD

14.3.

Baixando o driver JDBC

Sabemos que para nossa aplicao Java possa se comunicar com o Banco de dados
precisamos utilizar um conjunto de classes Java(API) escritas por terceiros que chamamos
de Driver JDBC. E que cada SGDB tem um driver JDBC especfico. Vamos ento fazer o
download do driver JDBC que iremos utilizar em nosso projeto Agenda.
O driver JDBC escrito para o MySQL Server, tambm chamado pela MySQL de
Conector J encontra-se no link abaixo:
http://dev.mysql.com/downloads/connector/j/

Escolha o sistema operacional:

Escolha o formato de compresso de sua preferncia clicando no respectivo boto de


download:

O site do MySQL ir lhe redirecionar para uma pgina de cadastro(opcional). Voc pode
pular esse cadastro clicando no link No thanks, just start my download.(No obrigado,
apenas iniciar meu download) veja imagem abaixo:

127

Curso de Java SE - UTD

Escolha a pasta onde voc deseja salvar o arquivo e clique em Salvar.

Aps finalizao do download descomprima o arquivo baixado.

Dentro da pasta descompactada voc encontrar o driver JDBC para o SGBD MySQL Server, um
arquivo no formato .jar, que seria todas as classes que implementam o driver JDBC compactadas e
prontas para utilizao em seu programa Java.

128

Curso de Java SE - UTD

14.4.
IDE Eclipse: Importando o driver JDBC para o
nosso projeto
1. Crie um novo projeto Java na IDE Eclipse:

129

Curso de Java SE - UTD

2. Importando o driver JDBC:


Clique em Java Build Path selecione a aba

Clique com o boto direito sobre o cone Agenda

Libraries e clique no boto Add External

e escolha a opo:

JARs...

Build Path -> Configure Build Path

Navegue at o arquivo .jar que voc

Prontinho, o driver j pode ser usado

baixou no tpico 15.2 e clique sobre o

por seu projeto Java.

arquivo 2 vezes.

130

Curso de Java SE - UTD

14.5.IDE NetBeans: Importando o driver JDBC para o nosso


projeto
1. Crie um novo projeto Java na IDE NetBeans:

2. Importando o driver JDBC:

Prontinho, o driver j pode


ser usado por seu projeto

Clique com o boto direito sobre

Java.

o cone Bibliotecas e escolha a


opo Adicionar JAR/Pasta...

Navegue at o arquivo .jar que


voc baixou no tpico 15.2 e
clique sobre o arquivo 2 vezes.

131

Curso de Java SE - UTD

14.6.

JDBC: Criando conexo com o Banco de Dados

J temos o que precisamos para manipular o MySQL Server atravs de nosso programa
Java. Vamos criar uma conexo entre o Banco de Dados e nossa aplicao Java.
Para abrir uma conexo com um banco de dados, precisamos utilizar sempre um driver.
A classe DriverManager a responsvel por se comunicar com todos os drivers que voc
deixou disponvel. Para isso, invocamos o mtodo esttico getConnection com uma String
que indica a qual banco desejamos nos conectar.

Essa String - chamada de String de conexo JDBC - que utilizaremos para acessar o
MySQL tem sempre a seguinte forma:
jdbc:mysql://ip/nome_do_banco

Devemos substituir ip pelo IP da mquina do servidor e nome_do_banco pelo nome do


banco de dados a ser utilizado.
Ateno! Abaixo uma lista de String de conexo JDBC dos principais SGBDs do
mercado:
SGBD
DB2

String de conexo JDBC


jdbc:db2:servidor:porta/banco

PostgreSQL jdbc:postgresql://servidor:porta/banco
SQL Server

14.6.1.

jdbc:sqlserver://servidor:porta;databaseName=banco

MySQL

jdbc:mysql://servidor:porta/banco

Java DB

jdbc:derby://servidor:porta/banco

Sybase

jdbc:sybase:Tds:servidor:porta/banco

Oracle

jdbc:oracle:thin:@servidor:porta:banco

Minha primeira Conexo

1. Criaremos um Package(pacote) chamado jdbc para melhor organizar as classes


desenvolvidas neste captulo. Observe na imagem abaixo:

132

Curso de Java SE - UTD


Clique com o boto direito sobre a pasta src New Package

Digite o nome do Package: jdbc

2. Vamos criar dentro do Package jdbc uma classe e cham-la de Conexao.


Clique com o boto direito sobre o

Digite o nome da Classe: Conexao

Package jdbc New Class

133

Curso de Java SE - UTD

3. Implementando classe Conexao.

I. Na linha 11 temos a criao da varivel url que do tipo String, ela ir receber a
String de conexo JDBC j discutido no tpico 15.5.
II. Na linha 12 criamos uma varivel conexao que um objeto do tipo
Connection(interface contida dentro do pacote java.sql). Por isso que fizemos o
import da linha 5. Esse pacote contm vrias classes e interfaces que so utilizadas
pelo driver JDBC. O mtodo getConnection um mtodo esttico da classe
DriverManager. Esse mtodo responsvel por solicitar uma conexo com o
banco de dados.
O mtodo getConnection sobrecarregado dentro de sua classe de origem,
utilizamos a opo do mtodo que recebe 3 parmetros, so eles: url de conexo
JDBC, login do usurio que ir utilizar o Mysql e senha do mesmo.
Lembre-se! Esse login e senha aquele utilizado para acessar o MySQL atravs do
MySQL Client(Captulo 3: Instalao 3.11/3.12).
O mtodo getConnection retorna uma conexo de sua aplicao com o banco,
caso no ocorra nenhum erro nos dados enviados para o mtodo ou no
carregamento/importao do driver JDBC.
Se um erro ocorrer uma exceo checada do tipo SQLException ser lanada. Nesse
exemplo no estamos capturando essa exceo com o bloco try-catch, mas
lanando a mesma para ser tratada para quem chamar o mtodo main(definio
de throws). Fizemos isso s por motivos didticos, mas em um projeto real temos
que colocar o bloco try-catch para capturar e tratar a possvel exceo lanada.
Iremos fazer isso futuramente.
Caso tudo ocorra bem ser impresso na tela a mensagem Conectado.
III.Na linha 14 fechamos o canal de conexo entre o banco e sua aplicao. No esquea
de fechar a conexo, aps fazer as operaes desejadas no banco.

14.6.2.

Ajustando a classe Conexao.

Vamos fazer alguns ajustes na classe Conexao implementada no tpico anterior para que
ela fique no padro ideal para aplicarmos no projeto. Veja abaixo como ficou a classe aps
as modificaes:

134

Curso de Java SE - UTD

I. Criamos 3 constantes(linha 10,11,12). Elas sero os argumentos passados para o


mtodo getConnection(linha 17).
II. Retiramos o mtodo main dessa classe, pois ela no ser a classe principal da
aplicao. Substitumos o mtodo main pelo mtodo esttico factoryConexao()
que retorna uma conexo, se no ocorrer nenhuma exceo, caso contrrio
imprimir uma mensagem informando o usurio que houve um problema e
retornar um valor nulo.
III.Outra modificao feita foi o tratamento da exceo(try-catch) no utilizando
mais o throws. O mtodo getConnection(linha 17) pode lanar uma exceo
checada do tipo SQLException ento temos que colocar essa regio do cdigo dentro
de um bloco try-catch para que possamos capturar a exceo lanada.

14.7. JDBC: Inserindo dados no banco de dados


Antes de criarmos a classe responsvel por fazer a
operao de insero de dados no banco vamos criar
uma classe que represente um contato de nossa agenda,
no qual os atributos da classe ser os campos contidos
na tabela contato(Tablea 14.1). Denominamos esse
tipo de classe que s contm atributos, mtodos de
acesso get/set de JavaBeans ou beans. Os beans nos
ajudar a fazer as operaes de C.R.U.D em nosso
banco de dados.

14.7.1.

Criando a Classe Contato

Crie uma classe chamada Contato(ver tpico 15.5.1). Essa classe conter os atributos
id do tipo Integer, nomeContato e telefone do tipo String com o modificador de
acesso private e os mtodos de acesso get/set para os respectivos atributos. Nossa classe
Contato ficar dessa forma:

135

Curso de Java SE - UTD

14.7.2.

Criando a Classe ContatoDao

Agora, vamos criar uma classe chamada ContatoDao(ver tpico 15.5.1) responsvel
por todas as operaes de acesso e C.R.U.D referentes aos dados dos contatos que sero
persistidos no banco de dados Agenda. A classe ContatoDao a princpio vai conter apenas
um atributo privado chamado de conexao que vai armazenar uma conexo com o banco
quando uma operao for solicitada pelo usurio.

Esta idia, inocente primeira vista, capaz de isolar todo o acesso a banco em classes
bem simples, cuja instncia um objeto responsvel por acessar os dados. Da
responsabilidade deste objeto surgiu o nome de Data Access Object ou simplesmente
DAO, um dos mais famosos padres de projeto (design pattern).
Vamos adicionar a classe ContatoDao o mtodo de insereContato responsvel por
inserir um objeto Contato na tabela contato do banco Agenda. A implementao do
mtodo ficou dessa forma:

136

Curso de Java SE - UTD

Na implementao da classe ContatoDao temos:


I. Na linha 20 escrevemos uma instruo de insero SQL e armazenamos na
varivel do tipo String chamada sql. Perceba, na instruo INSERT INTO...
temos algo diferente do que estudamos: dois pontos de interrogao. Os pontos de
interrogao sero substitudos por dados do contato que ser inserido na tabela
contato. Veremos isso em breve.
II. Na linha 22 o atributo conexao incializado com uma conexao. Essa inicializao
feita pelo mtodo esttico factoryConexao(), escrito na classe Conexao desenvolvida
em tpicos passados;
III.Linha 26 temos o mtodo prepareStatement: abre um canal de comunicao
especfico para instrues sql por onde ser enviado a instruo de insero,
definida na linha 20, para o MySQL Server. Esse mtodo pode lanar uma exceo
checada SQLException, por isso colocamos a chamada ao mtodo entre try-catch e
passamos a instruo sql como argumento para o mtodo, instruo a qual voc
deseja enviar para o MySQL.
IV. Na linha 27 estamos substituindo o primeiro ponto de interrogao contida na
instruo sql da linha 20 por um dos atributos(nomeContato) do objeto
contato recebido como parmetro pelo mtodo insereContato. Essa substituio
feita pelo mtodo pertencente ao objeto PreparedStatement stmt chamado
setString. O primeiro parmetro passado para o mtodo qual interrogao ser
substituda na instruo sql. J o segundo parmetro a informao que ser
colocado no lugar do ponto de interrogao. Como a informao a ser colocada no
lugar do ponto de interrogao do tipo String ento usamos o setString, mas se ela
fosse de outro tipo, por exemplo inteiro, teramos que usar o setInt e assim
analogamente.
V. Na linha 28 fazemos o mesmo passo da instruo na linha 27, a nica diferena
que estamos substituindo a segunda interrogao pelo atributo telefone do objeto
contato recebido como parmetro pelo mtodo insereContato.
137

Curso de Java SE - UTD

VI. Depois da instruo sql pronta com todos as substituies feitas vamos enviar o
comando sql construdo pelo canal de comunicao aberto(PreparedStatement
stmt) utilizando o mtodo execute pertencente ao objeto stmt.
VII.
Se nenhuma exceo for lanada os dados do seu contato j estaro na tabela
contato do banco de dados Agenda, caso contrrio a exceo lanada ser capturada
pelo(s) catch informando para o usurio que um problema aconteceu e retornar o
valor false.
VIII.
Ns precisamos fechar os 2 canais de comunicao com o banco que abrimos:
conexao e o stmt; Independente se a operao ocorreu bem ou no. Para isso
utilizamos o bloco finally(linha 39) que o cdigo dentro dele sempre ser
executado.
IX. Na linha 42 fechamos o canal por onde foi enviado a instruo sql. Fazemos isso
chamando o mtodo close do objeto stmt. Esse mtodo pode lanar uma exceo
por isso colocamos a instruo stmt.close(linha 42) dentro de um bloc try-catch
para caso acontea uma exceo na hora da execuo da instruo, a exceo ser
capturada avisando para o usurio sobre o problema.
X. Na linha 45 fechamos a conexo armazenada no atributo conexao da classe
ContatoDao. Nesse utilizamos o mtodo close pertencente ao objeto
Connection conexao, para fechar a conexo com o banco. Colocamos essa
instruo em um bloco try-catch, pois pode lanar uma exceo checada.
Ateno: No podemos esquecer de fazer os tpicos X e XI, pois abertura de conexes,
sesses, threads so recursos caros e o mal gerenciamento pode causar um funcionamento
instvel de nossa aplicao.

14.7.3.

Usando a classe ContatoDao: Classe Agenda

A classe ContatoDao est pronta para efetuar inseres de contatos no banco de dados
Agenda, mas especificamente na tabela contato. Vamos criar uma classe chamada
Agenda(ver tpico 15.5.1) dentro do pacote jdbc que efetuar a insero de um contato.
A classe Agenda foi escrita desta forma:

Na classe Agenda temos:


I. Na linha 8 fizemos a assinatura padro do mtodo main ou mtodo principal Java.
O mtodo main vai ser o primeiro mtodo a ser executado em nosso projeto
Agenda.
138

Curso de Java SE - UTD

II. Na linha 11 foi criado o objeto c1 que do tipo Contato, classe criada em tpicos
anteriores.
III.Nas linhas 12 e 13 utilizamos o respectivo mtodos set para inicializar os atributos
do objeto c1, pois esses atributos so privados sendo possvel a modificao ou
acesso dos valores contidos nos atributos atravs dos mtodos get e set(conceito
de encapsulamento).
IV. Na linha 12 criamos um objeto bd do tipo ContatoDao, classe criada no tpico
15.6.2. Esse objeto ser o nosso objeto DAO(Data Access Object), atravs dele
podemos efetuar todas as operaes no Banco de Dados.
V. Na linha 13 atravs de uma simples chamada ao mtodo insereContato
conseguimos fazer a insero de um contato, ou seja, os valores armazenados nos
atributos do objeto c1 sero inseridos na tabela contato.

Observe como ficou a tabela contato aps a execuo da classe Agenda:

Um novo registro surgiu. Registro com campo id igual a 4.

14.8.

JDBC: inserindo vrios registros

Aprendemos no tpico anterior como inserir um contato em nossa agenda, mas se fosse
preciso inserir vrios contatos de uma s vez.

14.8.1.

Sobrecarregando mtodo insereContatos

Da forma que escrevemos o mtodo insereContato teramos que chamar vrias vezes o
mesmo, que por sua vez abrir vrias vezes um PreparedStatement que como um
canal por onde ser enviado a instruo com os dados a serem manipulados no banco para
o Mysql e isso ter que ser feito todas as vezes que um novo contato for inserido.
Lembre-se, quanto menos conexes e statements forem criados
proporcionar um melhor desempenho do seu sistema e evitar
inconsistncias.
139

Curso de Java SE - UTD

Ento vamos sobrecarregar o mtodo insereContato para que em um nico


PreparedStatement ele consiga enviar para o banco vrios contatos de uma nica vez.
O novo mtodo que sobrecarregar o mtodo insereContato vai ficar assim:

Ateno, no esquea de fazer o import abaixo, pois utilizaremos esse tipo


de objeto no parmetro do mtodo insereContato:

A diferena entre o mtodo insereContato(Contato contato) e


insereContato(List<Contato> contatos), alm do tipo de parmetro recebido por ambos
so os mtodos addBatch e executeBatch. Esses mtodos so utilizados para enviar
vrias instrues sql de uma nica vez, no caso vrios INSERT INTO...
No mtodo insereContato(List<Contato> contatos) temos:
I. Na linha 54 a assinatura do mtodo. Nela observamos que o mtodo recebe uma
lista de contatos, ou seja, uma estrutura de dados do tipo lista com vrios objetos
contatos armazenados. Esse objetos sero inseridos em nosso banco de dados.
II. Na linha 61 foi escrito uma estrutura de repetio conhecida como foreach, que
um for especial, estrutura de repetio feita para percorrer listas de objetos. A cada
interao do for acessado um objeto da lista contatos e armazenado na varivel
Contato c, a ordem de acesso ser de acordo com a ordem de insero na lista. O
que h dentro do for se repete at que seja acessado o ltimo elemento da lista.
III.
Nas linhas 62 e 63 os valores armazenados nos atributos do objeto
Contato c substituir os pontos de interrogao da instruo sql na linha 56.
IV.
Na linha 64 o PreparedStatement que j foi configurado nas linhas 62 e
63 vai ser empacotado em um lote(addBatch) e a cada interao do for uma nova
140

Curso de Java SE - UTD

instru sql adicionada ao PreparedStatement criado, por fim sero enviados


todos de uma vez para o Mysql Server.
V. Na linha 66 temos, fora do lao for, o envio do lote com todas as instrues sql
que foram configuradas e empacotados(addBatch). O mtodo executeBatch
responsvel por esse envio.

14.8.2.

Utilizando o mtodo que insere vrios contatos: insereContato

Vamos adicionar 10 contatos em nossa Agenda de uma nica vez utilizando o mtodo
insereContato que acabamos de implementar utilizando a classe Agenda, o cdigo ficar
dessa forma:

Agora, na classe Agenda temos:


I. Nas linhas 3 e 4 foram feitos duas importaes de classe: ArrayList e List.
Utilizaremos objetos desses tipos no decorrer da classe Agenda.
II. Linhas 9 19 foram comentadas. Essas linhas representam o cdigo que foi
escrito no tpico 15.6.3. No precisaremos delas, pois vamos inserir vrios
contatos de uma nica vez, e no somente um, como estava programado antes.
III. Na linha 22 criamos uma lista vazia do tipo ArrayList de contatos.
IV. Na linha 23 escrevemos um for de 10 interaes para insero de contatos
dentro do ArrayList.
V. Na linha 24 criamos um objeto contato a cada interao do lao for.
VI. Nas linhas 25 e 26 acontece a inicializao dos atributos do objeto Contato c
criado na linha 24, isso acontece a cada interao do lao for.
VII.
Na linha 27 adicionamos o objeto contato, com os atributos preenchidos,
dentro do ArrayList contatos criado na linha 22;

141

Curso de Java SE - UTD

Aps a execuo da classe Agenda a nossa tabela contato se mostrar desta forma:

14.9. JDBC: Listando registros


Aprendemos a criar conexes, inserir um contato ou vrios de uma vez. Vamos aprender
como listar os registros contidos em uma tabela dentro de um banco de dados.
Utilizaremos em nosso exemplo a tabela contato, a qual foi trabalhada no tpico anterior.

14.9.1.

Implementando mtodo listaContatos

Criaremos um novo mtodo para a classe ContatoDao chamado de listaContatos. O


novo mtodo ser responsvel por retornar uma lista de objetos contatos extrados da
tabela contato. O cdigo vai ficar dessa forma:

No mtodo listaContatos temos:


I. Na linha 91 temos a assinatura do mtodo. Informando que o mtodo retorna uma
142

Curso de Java SE - UTD

lista de objetos do tipo Contato.


II. Na linha 92 foi instanciado uma lista de contatos. Se tudo ocorrer bem, essa lista
ser preenchida com objetos contatos gerados por dados vindos da tabela contato.
III.Na linha 93 temos a instruo sql que ser executada.
IV. Na linha 94 declarado um objeto do tipo PreparedStatement;
V. Na linha 95 declarado um objeto do tipo ResultSet, que ser responsvel por
armazenar o resultado da consulta que fizermos no banco de dados Agenda.
VI. Na linha 96 uma conexo criada e armazenada no atributo conexao.
VII.

Na linha 98 foi criado um canal por onde ser enviado a instruo sql.

VIII.
Na linha 99 um objeto do tipo ResultSet foi criado com o retorno do mtodo
executeQuery, o qual responsvel por realizar, especificamente, consultas sql no
banco de dados. O retorno da consulta programada na linha 93 representado no
Java por um objeto do tipo ResultSet, um tipo de lista.
IX. Na linha 100 temos um lao de repetio while. Na expresso de controle do
while foi colocado um mtodo next. Esse mtodo pertence ao objeto do tipo
ResultSet chamado de resultadoConsulta e ele acessa a prximo objeto da lista
resultadoConsulta e retorna true se houver tal objeto. Quando no houver um
prximo objeto a ser acessado o mtodo retornar false e o lao de repetio
parar.
X. Na linha 102 usamos o mtodo getInt passando como parmetro um valor inteiro.
Esse valor inteiro representa um ndice, onde o primeiro campo do registro no
momento acessado representado pelo nmero 1(um), o segundo pelo numero
2(dois)... O retorno do mtodo getInt nessa linha o valor contido no campo id da
tabela contato.
XI. Na linha 103 usamos o mtodo getString passando como parmetro um valor
inteiro. Esse valor inteiro representa um ndice, onde o primeiro campo do registro
no momento acessado representado pelo nmero 1(um), o segundo pelo numero
2(dois)... O retorno do mtodo getString nessa linha o valor contido no campo
contato na tabela contato.
XII.
Na linha 105 tambm utilizamos o mtodo getString, mas agora com uma
String como parmetro, essa String corresponde ao nome do campo que queremos
acessar no registro que est sendo no momento apontado. O retorno do mtodo
getString nessa linha o valor contido no campo telefone da tabela contato.
XIII.
Na linha 106 109 criamos e inicializamos os atributos de um objeto
contato com as informaes retornadas do banco de dados.
XIV.
Na linha 110 adicionamos o objeto gerado, nas linhas 106 109, dentro
da lista contatos instanciada na linha 92.
XV.
Nas linhas 113 a 116 temos um catch com dois tipos de excees. Como o
tratamento para ambas so iguais ento em vez de dois catch, um para cada tipo de
exceo, utilizamos o operador | que permite que um mesmo catch capture mais de
uma exceo.
XVI.
Dentro do bloco finally colocamos o cdigo para fechamento do Connection,
do ResultSet e do PreparedStatement. Todas essas instcias precisam ser fechadas
utilizando o mtodo close();

143

Curso de Java SE - UTD

14.9.2.

Utilizando o mtodo listaContatos

Vamos fazer algumas modificaes na classe Agenda para testarmos o mtodo


listaContatos.Veja como ficou a classe Agenda:

Modificamos na classe Agenda:


I. Comentamos o cdigo at a linha 33.
II. Na linha 34 criamos o objeto que nos fornece acesso ao banco de dados. O objeto
ContatoDao bd.
III.Na linha 35 referenciamos uma lista de contatos utilizando a varivel contatos.
Essa lista inicializa com o retorno do mtodo listaContatos, mtodo esse que nos
retorna uma lista de objetos do tipo Contato, onde os atributos desses objetos
foram inicializados com os valores contidos na tabela contato.
IV. Na linha 36 temos um foreach para percorrer a lista de objetos do tipo Contato,
inicializada na linha 35. A cada interao do lao um objeto da lista contatos
acessado.
V. Na linha 37 impresso na tela os atributos do objeto acessado na linha 36 pela
iterao do foreach.

14.10.

JDBC: Excluso de registro

Para excluir um registro usaremos um cdigo semelhante ao encontrado no mtodo


insereContato . A nica mudana que em vez de enviar o objeto contato que ser inserido
no banco, enviamos o id do registro que desejamos excluir.

144

Curso de Java SE - UTD

14.10.1.

Implementando o mtodo deletaContato

Implementamos o mtodo deletaContato, adicionamos ele a clase ContatoDao que


recebe por parmetro o id do registro a ser deletado. Na instruo sql utilizamos o id junto
a clusula WHERE para filtrar o registro que ser excludo.

14.11.JDBC: Atualizao de registro


Para encerarmos o C.R.U.D usando o JDBC, vamos implementar o processo de
atualizao de registro, utilizaremos o id do registro como referncia para escolha de qual
ser atualizado.

14.11.1.

Implementando mtodo editaContato

O mtodo editaContato ser adicionado na classe ContaoDao. Esse mtodo


semelhante ao mtodo deletaContato e insereContato. A diferena que o mtodo
editaContato recebe o id e um objeto do tipo Contato. O id para selecionar o registro a
ser editado e os atributos do objeto novoContato sobrescrevero os valores antigos
contidos no registro selecionado.

145

Curso de Java SE - UTD

14.12.

Exerccios propostos

1. Faa adaptaes nos cdigos estudados nesse captulo e implemente uma agenda
com a interface grfica(GUI) abaixo:

2. Crie um novo menu na GUI da questo anterior chamado editar. Ao clicar nessa
opo o usurio ser levado para uma tela onde a interface pedir o cdigo do
contato a ser editado depois os dados desse contato sero buscados na tabela
contato e exibido na GUI. A GUI deve permitindo que o usurio edite as
informaes do mesmo e grave essas novas informaes no banco quando clicado
no boto alterar que conter na parte inferior da GUI.
3. Adicione um novo item de menu a GUI e o chame de Excluir. Clicando no item de
menu Excluir o programa deve pedir o cdigo do contato a ser excludo, que aps
digitado precisar chamar o mtodo deletaContato que por sua vez deletar o
registro na tabela contato que contm no campo id o cdigo correspondente ao
digitado pelo usurio.
Ateno! Faa todos os tratamentos para que seu cdigo no lance
excees. Bom trabalho!

146

Curso de Java SE - UTD

Capitulo 15.

Java e Banco de Dados:


Hibernate

15.1. Introduo
O JDBC uma das formas mais diretas para integrar um software em Java com um
Banco de Dados(BD). Com essa tecnologia podemos fazer diversos tipos de operaes no
banco, atendendo nossas necessidades em relao a persistncia de dados. Contudo, a
medida que a aplicao cresce e surge dificuldades em permanecermos usando o JDBC.
Algumas desvantagens do JDBC:

30 % do cdigo da aplicao gasto com JDBC;

Todas as funes CRUD (Create, Retrieve, Update and Delete) precisam ser
codificadas;

Cdigo JDBC no portvel em relao ao SGBD, caso o SGBD da aplicao seja


modificado algumas instrues SQL podem precisar ser recodificados; e

No possui suporte para herana e polimorfismo de objetos.

A estrutura utilizada pelos BD relacionais para alocar os dados difere da utilizada pelas
aplicaes orientadas a objetos, por isso precisamos restruturar os dados que vem do BD
relacional para serem organizados em objetos e vice-versa. Fazer isso para diversos tipos
de objetos que precisam ser persistido trabalhoso de ser implementado.
Para facilitar esse processo de transformao de dados que
trafegam entre a aplicao e o BD podemos utilizar o conceito de
ORM.
Mapeamento objeto-relacional (ou ORM, do ingls: Objectrelational mapping) uma tcnica de desenvolvimento utilizada
para padronizar e reduzir o trabalho de estruturao e
restruturao de dados que transitam entre a aplicao que regida
pelo paradigma orientado a objetos e o BD que por sua vez utiliza o
paradigma procedural.
Quando usamos a tcnica de ORM as tabelas do
banco de dados so representadas atravs de classes,
os registros de cada tabela so representados com
objetos das classes correspondentes e os atributos
pertencentes a esses objetos representam os campos
do registro.
Com esta tcnica, o programador no precisa se
preocupar com os comandos em linguagem SQL; ele
usar uma interface de programao simples que faz
todo o trabalho de persistncia.

147

Curso de Java SE - UTD

Vrias tecnologias implementam o conceito ORM, veja abaixo algumas delas:

Hibernate, RedHat;

OpenJPA, da Apache;

TopLink, da Oracle;

EclipseLink, da Eclipse Fundation;

Com o intuito de facilitar a utilizao das ferramentas listadas acima e torn-las


compatveis com os outros recursos da plataforma Java, elas so padronizadas pela
especificao Java Persistence API (JPA) que por sua vez faz parte de uma especificao
maior chamada Enterprise JavaBeans(EJB).
Veremos, os passos principais para utilizar uma implementao da JPA. Em particular,
utilizaremos o Hibernate e o sistema gerenciador de banco de dados MySQL.

15.2.Hibernate uma implementao ORM


O Hibernate uma tecnologia robusta e confivel, um dos projetos ou vertentes dessa
tecnologia a implementao da tcnica ORM. Encontramos essa implementao hoje no
mercado para a linguagem Java e h uma verso para .NET chamada NHibernate. Essa
tecnologia a mais utilizada entre as empresas quando se trata de persistncia de dados.
O Hibernate ORM um dos projetos contidos na tecnologia Hibernate. Podemos
encontrar dentro desse projeto h 3 pacotes e suas dependncias que se importado para
seu projeto implementam para sua aplicao: tcnica ORM, annotations JPA e toda a
especificao JPA 2.
Abaixo nome dos 3 pacotes principais do Hibernate ORM e suas funcionalidades:

Hibernate Core: tambm conhecido como Hibernate 3 ou simplesmente


Hibernate. a base de todo o conjunto de solues para persistncia que essa
tecnologia oferece, contendo um API nativa e o mapeamento objeto-relacional
feito utilizando arquivos xml. Tem uma linguagem prpria semelhante ao SQL,
denominada Hibernate Query Language(HQL), e conta com interfaces para
realizao de consultas.

Hibernate Annotations: uma nova forma de fazer mapeamento objetorelacional utilizando annotations, um tipo de tag especial semelhante ao JavaDoc.
Essas tags foram padronizadas segundo o padro JPA, mas o Hibernate tambm
adicionou algumas tags prprias. A vantagem de se usar as annotations a reduo
de linhas de cdigo, ao fazer mapeamento objeto-relacional, em relao
mapeamento utilizando o uso de XML.

Hibernate EntityManager: uma camada que atende aos conceitos de


programao de interfaces e funcionalidades de consultas, entre outros aspectos
constantes no JPA. Essa interface l o metadado ORM e realiza operaes de
persistncia. No EntityManager encontramos o Hibernate Core.

15.3.Arquitetura Hibernate
Apesar de tantas ferramentas e classes compondo seu ncleo a arquitetura do Hibernate
pode ser simplificada conforme a imagem abaixo:

148

Curso de Java SE - UTD

A figura lista dois tipos de mapeamento, annotations ou XML, apesar de ser possvel
utilizar os dois, no recomendado.

15.4.Baixando o Hibernate
Entre no site oficial: http://www.hibernate.org e clique nas reas onde o cursor do
mouse est sobre.

149

Curso de Java SE - UTD

15.5.Instalando o Hibernate
Dentro do arquivo baixado no tpico anterior tem todos os jars necessrios para o bom
funcionamento do Hibernate. Utilizaremos nessa apostila a verso mais nova do
Hibernate, verso 4.3.4 ou Hibernate 4.

1. Vamos criar um projeto na IDE Eclipse como o nome AgendaHibernate.


Instalaremos o Hibernate 4 a esse projeto. Desenvolveremos uma agenda de
contatos utilizando a mesma arquitetura do captulo anterior, mas agora
utilizaremos o Hibernate para nos ajudar na persistncia de dados no BD, alm
disso incrementaremos novas funcionalidades a nossa agenda. Criando um novo
projeto no eclipse:

2. Vamos criar uma pasta dentro do projeto AgendaHibernate chamada de lib. Nessa
pasta colocaremos todos os JARs necessrios para o funcionamento do Hibernate.
Criando pasta lib. Veja abaixo:

150

Curso de Java SE - UTD

3. Descomprima o arquivo hibernate-release-4.3.4.Final e copie todos os aquivos da


pasta lib/required, que se encontra na pasta gerada aps a descompactao, para
a pasta lib que se encontra no projeto AgendaHibernate.

4. Vamos adicionar o driver(mysql-connector-java-5.1.28-bin.jar) jdbc para


SGBD Mysql Server, dentro da pasta lib do nosso projeto AgendaHibernate, pois o
Hibernate utiliza este driver.

151

Curso de Java SE - UTD

5. Tambm vamos adicionar a pasta lib do nosso projeto um outro pool de conexo.
Pool de conexo um objeto que disponibiliza uma coleo de conexes com o BD
para ser utilizadas por sua aplicao, no sendo preciso ficar abrindo conexes. O
Hibernante j tem um pool de conexo nativo, mas no recomendado para o
ambiente de produo, pois falta diversos recursos encontrados em qualquer pool
de conexo decente. O pool de conexo que adicionaremos est dentro da pasta
/lib/optional/c3p0 da pasta gerada ao descompactar o Hibernate. Copie todos os
arquivos dessa pasta e cole dentro da pasta lib do projeto AgendaHibernate.

6. Para finalizar a instalao vamos adicionar todos os .JARs da pasta lib de nosso
projeto no Build Path do mesmo.

152

Curso de Java SE - UTD

153

Curso de Java SE - UTD

Prontinho! Hibernate instalado e pronto para ser utilizado.

15.6.Criando uma conexo com o Hibernate


Precisamos criar o arquivo de configurao do Hibernate que pode ser utilizado um
arquivo XML ou uma classe.
Criaremos um arquivo xml chamado hibernate.cfg.xml responsvel por armazenar a
configurao do hibernate.

15.6.1.

Criando o arquivo xml na raiz da pasta src utilizando o eclipse.

154

Curso de Java SE - UTD

15.6.2.

Escrevendo o arquivo de configurao do Hibernate.

Analisando o arquivo rapidamente, no primeiro conjunto de linhas vemos a


configurao da conexo com o banco de dados MySQL, em seguida, as opes de debug e,
por ltimo, a configurao para o pool de conexes. O leitor pode ficar vontade para
modificar esse arquivo ou mesmo comentar a parte de debug, se assim o desejar.
Explicando um pouco mais o arquivo: reparamos que o primeiro bloco de
configurao a propriedade que mais chama a ateno a dialect. Ela sempre ter como
valor uma classe Dialect. Essa classe ensina o Hibernate a conversar com o banco de dados
em questo. Todas as particularidades de sintaxe dos comandos SQL esto descritas
internamente nessa classe. Todo banco de dados precisa ter uma classe Dialect para que o
Hibernate consiga conversar com ele, alm, claro, do driver JDBC.
Talvez voc j tenha lido, em referncias ao Hibernate, alguma coisa
sobre a classe MySQLDialect, diferente da classe MySQL5InnoDBDialect que
estamos usando agora. A classe MySQL5InnDBDialect mais completa que a
MySQLDialect, pois capaz de criar as tabelas do banco de dados com a opo
de delete cascade e update cascade. Nenhum jar novo necessrio para isso.
Essa classe padro do Hibernate.

155

Curso de Java SE - UTD

As demais propriedades deste bloco j so conhecidas do contexto JDBC e


informam, respectivamente, a classe do driver JDBC, a URL de conexo, o usurio e a
senha.

A configurao de pool de conexo tem as seguintes propriedades:


Propriedade

Descrio

c3po.min_size

Nmero mnimo de conexes que o C3PO mantm


preparadas todo o tempo.

c3po.max_size

Nmero mximo de conexes no pool. Caso esse limite seja


ultrapassado uma exceo ser lanada.

c3po.timeout

Tempo limite para remoo de conexo inativa do pool. No


exemplo, 300 segundos.

c3po.max_statements

Mximo de 50 declaraes preparadas iro para cache. O uso


de cacheamento de declaraes preparadas essencial para
melhorar o desempenho do Hibernate.

c3p0.idle_test_period

Tempo de inatividade em segundos antes que uma conexo


seja automaticamente validada.

A configurao de depurao tem as seguintes propriedades:


Propriedades

Descrio

show_sql

Estamos habilitando que todas as sadas sql realizadas


apaream no console.

format_sql

Imprime o comando SQL executado de forma legvel tanto no


console como no log.

generate_statistics

Habilita o Hibernate a coletar estatsticas para posterior


ajustes de desempenho.

use_sql_comments

Se a opo estiver habilitada, o Hibernate ir gerar


comentrios junto ao SQL para facilitar a depurao.

Alm das propriedades apresentadas podemos ainda comentar mais trs que
poderiam ser adicionadas ao arquivo conforme a necessidade:
Propriedade

hibernate.hbm2ddl.auto

Descrio
Automaticamente valida ou exporta a
estrutura do banco de dados contendo as
instrues DDL desse banco quando
SessionFactory criada, construindo,
dessa forma, a estrutura do banco de
dados automaticamente. Com a opo
createdrop configurada, por exemplo o
banco de dados excludo quando a
SessionFactory fechada. No
156

Curso de Java SE - UTD

recomendado o uso dessa configurao. A


opo mais utilizada a update, que
sempre atualizar a estrutura do banco de
dados conforme as classes mapeadas.
Como opes para esse elemento podemos
utilizar validate, update, create ou
createdrop.

hibernate.transaction.auto_close_session

Se esta propriedade estiver ativada no


arquivo de configurao a sesso ser
fechada automaticamente aps a concluso
de uma transao. Parmetros: true ou
false.
Especifica o nome de uma classe para ser a
TransactionFactory para uso junto
Hibernate Transaction APL. O padro
JDBCTransactionFactory.

hinernate.transaction.factory_class

Claro que existem outas configuraes alem das mencionadas que podem ser
includas no arquivo de configurao. No entanto, caso alguma configurao
complementar seja necessria aos exemplos criados, isso ser explicado ao longo do livro.
Caso deseje consultar outras possibilidades, visite o site
http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch03.html#configurationoptional, onde possvel ver a documentao da configurao do Hibernate na ntegra.
Precisamos agora escrever o cdigo-fonte que far a ponte entre o arquivo de
configurao e a conexo com o banco. Para isso, vamos criar duas classes: HibernateUtil e
TesteConexaoHibernateMysql no package conexao. Vamos criar primeiro HibernateUtil.
Ateno! Para ajudar na criao do arquivo xml de configurao do
Hibernate podemos instalar um plugin do eclipse chamado JBoss Tools que
encontrado facilmente no Eclipse Marcketplace do IDE Eclipse.

15.6.3.

Criando o pacote conexao

Vamos criar um pacote para armazenar a classe que aplicar as configuraes


armazenadas no arquivo hibernate.cfg.xml e ser responsvel tambm por criar uma
SessionFactory que um objeto robusto o qual atravs dele podemos estabelecer uma
conexo Hibernate com o BD, alm de outras funcionalidades. Esse pacote tambm
armazenar a classe TesteConexaoHibernateMysql, onde usando a classe HibernateUtil
criaremos uma conexo teste como o MySQL.

157

Curso de Java SE - UTD

15.6.4.

Criando e escrevendo a classe HibernateUtil.

Classe criada, vamos implementar seu cdigo. O cdigo da classe HibernateUtil a


princpio ficar dessa forma:

Essa classe tem um mtodo esttico chamado constroiSessionFactory() que invocado


logo no incio da classe e o retorno desse mtodo um objeto SessionFactory que
armazenado no atributo privado, final e esttico sessao. Esse atributo sessao vai ser
inicializado automaticamente assim que a JVM executar nossa aplicao.

158

Curso de Java SE - UTD

O mtodo esttico
constroiSessionFactory() responsvel
por carregar todas as configuraes do
Hibernate utilizando um objeto do tipo
Configuration. Com o mtodo
configure contido nessa classe as
configuraes armazenadas no arquivo
hibernate.cfg.xml so carregadas e com o
mtodo buildSessionFactory() uma
conexo com o banco de dados
realizado. Caso no seja passado o nome ou a localizao do arquivo de configurao o
Hibernate procurar na raiz do projeto, se no for encontrado, uma exceo ser lanado.
Tambm desenvolvemos um mtodo esttico chamado getSessionFactory(), esse mtodo
repensvel por retornar uma sesso Hibernate que se encontra dentro do atributo
privado chamado sessao.
Ateno! Perrceba que o mtodo buildSessionFactory() est riscado. Isso
significa que para o Hibernate 4 esse mtodo no o mtodo adequado para
construes de SessionFactory, ele foi utilizado nas verses anteriores do
Hibernate. Veja abaixo como ficou a implementao do HibernateUtil na
verso mais recente do Hibernate:

15.6.5.

Criando e escrevendo a classe TesteConexaoHibernateMysql

J temos a classe HibernateUtil que faz todo o processo de configurao e cria o objeto
SessionFactory do Hibernate. Agora utilizando a classe TesteConexaoHibernateMysql
vamos verificar se conseguimos abrir uma conexo com o BD utilizando o Hibernate.
O cdigo fica dessa forma:
159

Curso de Java SE - UTD

Fizemos uma chamada ao mtodo esttico getSessionFactory() que acessa o atributo


privado da classe HibernateUtil que armazena um objeto SessionFactory.
Com o obejeto do tipo SessionFactory em mos vamos abrir uma sesso (conexo
Hibernate e BD) utilizando o mtodo pertencente a esse objeto chamado openSession(), se
tudo ocorrer bem a mensagem Conectado ser impresso no console.
Abaixo temos as informaes de sada em nosso console:
Mar 20, 2014 11:37:37 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
Mar 20, 2014 11:37:38 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.4.Final}
Mar 20, 2014 11:37:38 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Mar 20, 2014 11:37:38 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Mar 20, 2014 11:37:38 AM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: hibernate.cfg.xml
Mar 20, 2014 11:37:38 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate.cfg.xml
Mar 20, 2014 11:37:38 AM org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity
WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead.
Refer to Hibernate 3.6 Migration Guide!
Mar 20, 2014 11:37:38 AM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Mar 20, 2014 11:37:38 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH010002: C3P0 using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost/Agenda
Mar 20, 2014 11:37:38 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH000046: Connection properties: {user=root, password=****}
Mar 20, 2014 11:37:38 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH000006: Autocommit mode: false
Mar 20, 2014 11:37:38 AM com.mchange.v2.log.MLog <clinit>
INFO: MLog clients using java 1.4+ standard logging.
Mar 20, 2014 11:37:38 AM com.mchange.v2.c3p0.C3P0Registry banner
INFO: Initializing c3p0-0.9.2.1 [built 20-March-2013 10:47:27 +0000; debug? true; trace: 10]
Mar 20, 2014 11:37:38 AM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@2eb867ef [ connectionPoolDataSource ->
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@4eace1f5 [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000,
autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName ->
null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false,
factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hge13k901q4qffj1d870ue|3e50039c,
idleConnectionTestPeriod -> 3000, initialPoolSize -> 5, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 300,
maxIdleTimeExcessConnections -> 0, maxPoolSize -> 20, maxStatements -> 50, maxStatementsPerConnection -> 0, minPoolSize -> 5, nestedDataSource ->
com.mchange.v2.c3p0.DriverManagerDataSource@7bb27220 [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken ->
1hge13k901q4qffj1d870ue|6c809f30, jdbcUrl -> jdbc:mysql://localhost/Agenda, properties -> {user=******, password=******} ], preferredTestQuery ->
null, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false,
unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation ->
null, identityToken -> 1hge13k901q4qffj1d870ue|486ba2ed, numHelperThreads -> 3 ]
Mar 20, 2014 11:37:38 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
Mar 20, 2014 11:37:38 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
Mar 20, 2014 11:37:38 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
Mar 20, 2014 11:37:38 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory

160

Curso de Java SE - UTD


Conectado
Mar 20, 2014 11:37:39 AM org.hibernate.engine.internal.StatisticalLoggingSessionEventListener end
INFO: Session Metrics {
0 nanoseconds spent acquiring 0 JDBC connections;
0 nanoseconds spent releasing 0 JDBC connections;
0 nanoseconds spent preparing 0 JDBC statements;
0 nanoseconds spent executing 0 JDBC statements;
0 nanoseconds spent executing 0 JDBC batches;
0 nanoseconds spent performing 0 L2C puts;
0 nanoseconds spent performing 0 L2C hits;
0 nanoseconds spent performing 0 L2C misses;
0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections)
}

Analisando os dados de sada, temos informaes de inicializao das configuraes do


Hibernate em azul e dados estatsticos sobre operaes do Hibernate em verde( mostrado
devido propriedade <property name="hibernate.generate_statistics">true</property>).
Entre os logs de inicializao e estatsticas est a palavra Conectado que mandamos
imprimir caso tudo ocorresse bem com a configurao do nosso Hibernate. Tudo est
OK!
Ateno! Perceba que destaquei em vermelho uma informao nos logs de inicializao
do Hibernate. Essa informao est nos alertando que o Hibernate verificou se seu driver
JDBC(por consequncia o MySQL Server) suporta um determinado recurso que trabalha
com o tipo de dado BLOB ou CLOB, ao fazer essa verificao ele nos aconselha a desabilitar
esse recurso pois o nosso driver no d esse suporte. Podemos fazer isso adicionando a
seguinte propriedade em nosso arquivo de configurao Hibernate(hibernate.cfg.xml):
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>

15.7.Hibernate C.R.U.D de um objeto simples sem


relacionamentos
J aprendemos a fazer o download, a instalao, a configurao e a criao conexo com
BD do Hibernate. Vamos agora utiliz-lo para persistir dados no MySQL.
Ns j estudamos que a tcnica ORM proporciona a persistncia de objetos em banco de
dados relacionais de forma transparente. Para essa transparncia acontecer precisamos
fazer um mapeamento das classes que tero seus objetos persistidos.
Esse mapeamento pode ser feito de duas formas utilizando um arquivo
NomeDaClasse.hbm.xml ou usando annotations. Vamos mostrar o mapeamento da classe
Contato.java utilizando um arquivo .xml chamado Contato.hbm.xml. A estrutura da classe
Contato do projeto AgendaHibernate ser a mesma do captulo anterior(tpico Criando
a Classe Contato).

15.7.1.

Criando pacote modelo

Vamos criar um pacote em nosso projeto AgendaHibernate


chamado modelo e colocar dentro desse pacote a classe
Contato.java e o arquivo de mapeamento da respectiva classe
chamado Contato.hbm.xml. A arquitetura do nosso projeto
ficar dessa forma.

15.7.2.

Mapeando a Classe Contato

Vamos mapear a classe Contato utilizando o arquivo xml chamado Contato.hbm.xml. O


nosso arquivo de mapeamento ficar dessa forma:
161

Curso de Java SE - UTD

A tag hibernate-mapping representa o incio do mapeamento. Nessa tag temos os


atributir package que indica o pacote da classe que vamos mapear e schema o BD que
manipularemos.
A tag class indica o incio do
mapeamento da classe, o atributo name
informa o nome da classe que vamos
comear a mapear e o atributo table
informa a tabela associada a essa classe.
A tag id indica qual o campo
identificador de registro.
Na tag id temos o atributo column
que representa o campo da tabela que
ser associado a um dos atributos definido na classe que estamos mapeando. O campo id
da tabela contato estar associado ao atributo id da classe Contato. O atributo id da classe
Contato est ligado ao campo id devido o atributo da tag id chamado name.
A tag generator dentro da tag id informa que o campo id ser auto increment, ou seja,
a cada insero esse campo ser acrescido de uma unidade de forma automtica.
Na tag property temos o mapeamento dos demais campos da tabela contato com os
atributos correspondentes definidos na classe Contato.
Ateno, o atributo name da tag id e da tag property comum a ambas, esse atributo se
torna opcional se o nome do campo na tabela que est sendo mapeada igual ao nome
definido na classe que est sendo associado a respectiva tabela.
Na linha 11 temos o atributo type, importante para definir o tipo de dado que ser
armazenado a informao persistida.
Para finalizar o mapeamento, adicione uma referncia do mapeamento construdo ao
arquivo de configurao do Hibernate(hibernate.cfg.xml):

162

Curso de Java SE - UTD

15.7.3.

Classe ContatoDao com Hibernate: inserindo

Crie uma classe ContatoDao no pacote modelo. A classe ContatoDao ser responsvel
por dar acesse aos dados que se encontram no banco, referentes ao objeto Contato. A
arquitetuara do nosso projeto ficar dessa forma:

Vamos escrever o cdigo responsvel por fazer inseres de objetos do tipo Contato no
BD usando a API do Hibernate. Veja o cdigo abaixo:

163

Curso de Java SE - UTD

Na classe ContatoDao declaramos dois atributos privados: sessao e transacao. Esses


atributos sero utilizados pelos mtodos que realizaro o CRUD, sessao vai armazenar a
conexo aberta com o BD e o objeto transacao permitir que desfazamos todas as
operaes feitas ao BD se algumas dessas derem errado.
Temos o mtodo fecharSessao() esse mtodo ser utilizado para fechar todas as sessoes
abertas pelos demais mtodos da classe. Esse mtodo utiliza o mtodo close() pertencente
ao objeto sessao para fazer encerramento de uma sesso, faz isso de forma segura atravs
dentro de um try-catch para tratamento de possveis excees.
Tambm temos o mtodo inserir(Contato c). Esse mtodo responsvel por persistir um
objeto Contato c recebido como parmetro do mtodo, no BD. O mtodo inserir utiliza um
objeto do tipo SessionFactory, retornado na chamada do mtodo esttico
getSessionFactory() pertencente a classe HibernateUtil, para abrir uma sesso com o BD.
Esse objeto do tipo SessionFactory possui um mtodo chamado openSession() que abre
uma sessao com BD e armazena no atributo sessao.
O atributo sessao invoca o mtodo beginTransaction() que retorna um objeto do tipo
Transaction que armazenado no atributo transacao. A partir dessa instruo toda(s) a(s)
operao(es) que for(em) feita(s) no BD podero ser desfeitas utilizando o mtodo
rollback() pertencente ao objeto transacao, desde que no seja executado o mtodo
commit() pertencente ao mesmo objeto. O mtodo commit aplica todas as operaes
realizadas em uma transao.
Caso alguma operao de uma transao no seja executada corretamente uma exceo
ser lana e a mesma ser capturada no bloco catch, o qual apresentar uma mensagem
informando o usurio do problema e desfar todas as operaes at ento executadas
164

Curso de Java SE - UTD

depois da chamada do mtodo beginTransaction().

15.7.4.

Classe ContatoDao com Hibernate: listando

Para retornar objetos da base de dados, usaremos a linguagem HQL que similar a
linguagem SQL, mas essa linguagem referenciar nomes usados no mapeamento das
tabelas em vez de nomes de tabelas e colunas usados na base de dados. Ela uma poderosa
linguagem de consulta que se parece muito com a SQL, mas a HQL totalmente orientada
a objeto, incluindo os paradigmas de herana, polimorfismo e encapsulamento. No
Hibernate, podemos escolher tanto em usar a SQL quanto a HQL. Escolhendo a HQL,
poderemos executar as solicitaes SQL sobre as classes de persistncia do Java em vez de
tabelas no banco de dados.
Vamos escrever o mtodo que listar todos os registros da tabela contato utilizando uma
consulta HQL. O cdigo desse mtodo ficar desta forma:

Perceba que nesse mtodo utilizamos um mtodo novo do objeto sessao: mtodo
createQuery(). Esse mtodo realiza uma consulta HQL nas classes mapeadas, ou seja, em
vez de voc utilizar o nome da tabela(contato) que deseja realizar a consulta, utilizasse a
classe(Contato) que representa essa tabela. Veremos logo mais, no mtodo buscar() outro
exemplo do uso do HQL. A consulta armazenada em um objeto do tipo Query que possui
um mtodo chamado list() que transforma a consulta retornada em um objeto do tipo
List.

15.7.5.

Classe ContatoDao com Hibernate: buscando

Vamos implementar o mtodo buscar() que receber como parmetro o id de um


Contato e se encarregar de buscar e retornar o objeto Contato com esse id, caso no
encontre retorna null.

165

Curso de Java SE - UTD

Perceba que o mtodo createQuery() dessa vez faz uma consulta usando a clusula
where. Implementamos uma consulta HQL que procura na classe mapeada Contato, que
representa a tabela contato, um objeto contato com o atributo id = parametro. O valor
do parametro definido no mtodo serInteger().
Utilizamos outro mtodo do objeto sessao, uniqueResult(). Esse mtodo retorna
utilizado para retorna um nico objeto em uma consulta. Caso no encontre o objeto que
atenda os requisitos da consulta o mtodo retorna null, caso encontre mais de um objeto
que atenda a consulta lana uma exceo do tipo HibernateException.

15.7.6.

Classe ContatoDao com Hibernate: removendo

Vamos criar um mtodo chamado remover() que receber um id e usando o HQL


removeremos do BD tal objeto persistido que tem esse id como atributo. Veja o cdigo
abaixo:

No mtodo remover() temos o mtodo get pertencente ao objeto sessao. O mtodo get
recebe como parmetro uma classe e um id. Como desejamos buscar um contato, a classe
que representa a tabela contato a Classe Contato, ento utilizando reflexo recuperamos
uma referncia dessa classe atravs do atributo esttico class. E o outro parmetro o id
do objeto contato que desejamos excluir.
Outro mtodo do objeto sessao o delete(). Esse mtodo recebe o objeto que deve ser
166

Curso de Java SE - UTD

deletado como parmetro e o mesmo se existir removido.

15.7.7.

Classe ContatoDao com Hibernate: atualizando

Para finalizarmos a nossa classe ContatoDao s falta implementarmos o mtodo


atualizar() esse mtodo atualizar um objeto Contato contido em nosso BD. O mtodo
atualizar() receber o novo objeto do tipo Conato e o id do objeto que ter seus atributos
modificados.
Veja como ficou o cdigo:

Utilizamos o mtodo update() pertencente ao objeto sessao. Esse mtodo recebe um


objeto do tipo Contato com o mesmo id de um objeto j persistido na tabela contato do
nosso BD, mas com os valores dos demais atributos diferentes do objeto que se encontra
persistido. Esse novoContato passado para o mtodo update() substituir o respectivo
objeto persistido.

15.7.8.

Mtodos da interface Session

A interface de uma Session possui diversos mtodos disponveis. Na tabela abaixo


mostrado um breve resumo das vrias categorias de mtodos disponveis:
Mtodo
save()

saveOrUpdate()

merge()

persist()
get()
getEntityName()

Descrio
Salva um objeto na base de dados. Este mtodo no deveria
ser chamado por um objeto que foi salvo na base de dados.
Salva um objeto na base de dados ou atualiza a base de
dados se o objeto j existe. Este mtodo menos eficiente
que o mtodo save(), pois ele necessidade fazer um SELECT
para checar se o objeto j existe, mas no falhar se o objeto
j foi salvo.
Mescla os campos de um objeto no persistente dentro de
um objeto persistente apropriado (determinado pelo ID). Se
tal objeto no existe na base de dados, ento um criado e
salvo.
Reassocia um objeto com a sesso, dessa forma as alteraes
feitas no objeto sero persistidas.
Recupera um objeto especfico da base de dados pelo objeto
identificador.
Retorna o nome da entidade.
167

Curso de Java SE - UTD

getIdentifier()
load()
refresh()
update()
delete()
createFilter()
enableFilter()
disableFilter()
getEnabledFilter()
createQuery()
getNamedQuery()
cancelQuery()
createCriteria()
beginTransaction()
getTransaction()
lock()
contains()
clear()
evict()

flush()
isOpen()
isDirty()
getCacheMode()
setCacheMode()
getCurrentLockMode()
setFlushMode()

Determina o identificador para um objeto especfico


associado com a sesso.
Carrega um objeto da base de dados pelo identificador do
objeto (deveremos usar get() se estivermos certo que o
objeto est na base de dados).
Atualiza o estado de um objeto associado da base de dados.
Atualiza a base de dados com alteraes de um objeto.
Deleta um objeto da base de dados.
Cria um filtro (consulta) para restringir operaes na base
de dados.
Permite um filtro nomeado nas consultas produzidas pelo
createFilter().
Disabilita um filtro nomeado.
Retorna um objeto filtro habilitado atualmente.
Cria uma consulta no Hibernate para ser aplicado na base
de dados.
Retorna uma consulta de um arquivo de mapeamento.
Cancela a execuo de qualquer consulta atualmente em
progresso de outra thread.
Cria um objeto Criteria para operaes de consulta.
Inicia uma transao.
Retorna o objeto de transao atual. Este mtodo no
retorna null quando no h transaes em progresso, o
mtodo retorna uma propriedade do objeto retornado como
false.
Recebe um bloqueio da base de dados para um objeto.
Determina se um objeto especfico est associado com a
base de dados.
Limpa a sesso de todas as instncias carregadas e cancela
qualquer salvamento, atualizao ou deleo que no tenha
sido completado.
Desassocia um objeto da sesso para que as alteraes
posteriores a ele no sejam persistentes.
Libera todas as alteraes pendentes no banco de dados todos salvamentos, atualizaes e excluses sero
realizados. Essencialmente, este mtodo sincroniza a sesso
com o banco de dados.
Determina se a sesso foi fechada.
Determina se a sesso est sincronizada com a base de
dados.
Determina o modo de cache atualmente empregado.
Altera o modo de cache atualmente empregado.
Determina o modo de bloqueio atualmente empregado.
Determina o modo de liberao atualmente usado. As
opes so liberar depois de todos as operaes, liberar
quando necessrio, nunca liberar, ou liberar apenas no
commit.
168

Curso de Java SE - UTD

setReadOnly()

close()

getSessionFactory()
connection()
disconnect()
reconnect()
isConnected()

Marca um objeto persistente como apenas leitura (ou como


de escrita). Existem menores benefcios de performance
marcando um objeto como apenas leitura, mas alteraes
nos estados sero ignorados at que ele seja marcado como
de escrita.
Fecha a sesso e a conexo com a base de dados. Libera
outros recursos (como cache). Nao devemos realizar
qualquer operaes sobre o objeto de sesso aps chamar
close().
Retorna uma referncia do objeto SessionFactory que criou
a instncia do Session atual.
Retorna uma referncia da conexo da base de dados.
Desconecta da conexo atual com a base de dados.
Reconecta com a base de dados.
Determina se a conexo com a base de dados est
conectada.

Como j vimos, geralmente usaremos as Sesses para criar, atualizar, pesquisar e deletar
objetos.

15.8.
Mapeamento de objetos utilizando Annotations e
Hibernate
Vamos fazer o mapeamento da
classe Contato utilizando
Annotation, no mais com o
arquivo xml Contato.hbm.xml.
Annotation(representado pela
inicial @), um recurso da
Plataforma Java, introduzido
como padro de linguagem na
verso 1.5, esse recurso nos
permite utilizar tags dentro do
cdigo fonte da classe que ser
mapeada, as quais mapeiam a
respectiva classe e dispensa o
arquivo xml.
Vamos criar uma classe
ContatoAnnotation. Essa classe
ser semelhante a classe Contato.
A nica diferena ser as
annotations que sero digitadas
para mapear a classe e dispensar
o uso do arquivo xml. O cdigo
da classe ContatoAnnotation vai
ficar como na imagem ao lado.
Veja na tabela abaixo os
atributos que cada annotation
aceita:
169

Curso de Java SE - UTD

Tag

Parmetros que a tag pode aceitar

@Entity

name: especifica o nome da classe que est sendo mapeada. Por


padro no necessria.

@Table

name: especifica o nome da tabela no bloco de dados.


catalog: configura um catlogo para sua classe.
schema: configura um schema para sua classe.
uniqueConstraints: adiciona restries do tipo nica s
colunas da tabela.

@Id

No h parmetros para essa notao. Usando essa propriedade,


indica-se que determinada propriedade de uma classe faz parte
da chave primria de uma tabela ou a prpria chave primria.

@GeneratedValue

Ao usar essa notao estamos dizendo que o valor gerado ser


baseado em uma estratgia prvia de determinado banco para
autonumerao.

@Column

columnDefinition: serve para definir as propriedades de uma


coluna durante sua criao. til quando se gera a DDL para a
coluna.
insertable: serve para definir se uma coluna entrar na
instruo de insert. O padro true.
length: atribui o tamanho de uma coluna.
name: atribui um nome alternativo a uma coluna. til quando
o nome da propriedade da classe no igual ao nome de uma
coluna da tabela do banco de dados.
nullable: se a coluna no pode aceitar valores nulos, configure
essa propriedade como false.
precision: atribui a preciso de uma coluna, geralmente em
campos numricos.
scale: configura a escala(tamanho)de uma coluna, geralmente
em campos numricos.
table: define se determinada coluna associada a uma tabela
secundria.
unique: com essa notao a coluna no estar disponvel para
aceitar valores duplicados.
updatable: serve para definir se uma coluna entrar na
instruo de update. O padro true.

170

Curso de Java SE - UTD

Agora, vamos fazer uma alterao no arquivo hibernate.cfg.xml. Adicionaremos ao


arquivo hibernate.cfg.xml uma tag( <mapping class="modelo.ContatoAnnotation"/> ) que
informa ao Hibernate que a classe ContatoAnnotation um arquivo de mapeamento. Veja
como ficou o cdigo:

Tambm precisamos fazer uma pequena alterao na classe HibernateUtil. Veja a


alterao abaixo:

Criamos uma cpia da classe ContatoDao e renomeamos para ContatoDaoAnnotation,


tambm trocamos o tipo de dado Contato para ContatoAnnotation em todos os locais
dentro do fonte da classe ContatoAnnotation que referenciava a classe Contato.
Ficando dessa forma:
package modelo;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import conexao.HibernateUtil;
public class ContatoDaoAnnotation {
private Session sessao;
private Transaction transacao;
private void fecharSessao(){
171

Curso de Java SE - UTD

try{
sessao.close();
}catch(Exception e){
System.out.println("Problema ao fechar a sessao: "+e);
}
}
public void inserir(ContatoAnnotation c){
try{
this.sessao = HibernateUtil.getSessionFactory().openSession();
this.transacao = sessao.beginTransaction();
sessao.save(c);
this.transacao.commit();
}catch(HibernateException e){
System.out.println("Problema ao inserir o contato: "+e);
this.transacao.rollback();
}finally{
this.fecharSessao();
}
}
public List<ContatoAnnotation> listar(){
List<ContatoAnnotation> listaContato = null;
Query consulta;
try{
this.sessao = HibernateUtil.getSessionFactory().openSession();
this.transacao = sessao.beginTransaction();
consulta = sessao.createQuery("from ContatoAnnotation");
listaContato = consulta.list();
transacao.commit();
return listaContato;
}catch(HibernateException e){
System.out.println("Problema ao cosultar: "+e);
this.transacao.rollback();
}finally{
this.fecharSessao();
}
return listaContato;
}
public ContatoAnnotation buscar(Integer id){
Query resultado;
ContatoAnnotation c = null;
try{
this.sessao = HibernateUtil.getSessionFactory().openSession();
this.transacao = sessao.beginTransaction();
resultado = sessao.createQuery("from ContatoAnnotation where id
= :parametro");
resultado.setInteger("parametro", id);
c = (ContatoAnnotation)resultado.uniqueResult();
this.transacao.commit();
return c;
172

Curso de Java SE - UTD

}catch(HibernateException e){
System.out.println("Problema na consulta: "+e);
this.transacao.rollback();
}finally{
this.fecharSessao();
}
return c;
}
public void remover(Integer id){
try{
this.sessao = HibernateUtil.getSessionFactory().openSession();
this.transacao = sessao.beginTransaction();
/** busca objeto do tipo Contato com o id informado. Utilize o
mtodo get ou load.*/
ContatoAnnotation c =
(ContatoAnnotation)sessao.get(ContatoAnnotation.class, id);
if(c != null){
this.sessao.delete(c);
}
this.transacao.commit();
}catch(HibernateException e){
System.out.println("Problema ao remover: "+e);
this.transacao.rollback();
}finally{
this.fecharSessao();
}
}

public void atualizar(ContatoAnnotation novoContao){


try{
this.sessao = HibernateUtil.getSessionFactory().openSession();
this.transacao = sessao.beginTransaction();
this.sessao.update(novoContao);
this.transacao.commit();
}catch(HibernateException e){
System.out.println("Problema ao editar: "+e);
this.transacao.rollback();
}finally{
this.fecharSessao();
}
}

Faa o teste de todos os mtodos da classe ContatoDaoAnnotation. Criando


uma classe dentro do pacote modelo chamada de Agenda. Crie o mtodo main
dentro dessa classe e dentro desse mtodo faa seus testes e veja se tudo est
implementado corretamente.

173

Curso de Java SE - UTD

15.9.Relacionamentos entre tabelas: Hibernate e Annotation


Vamos adicionar mais entidades ao nosso projeto AgendaHibernate, deixando nossa
agenda com mais funcionalidades. Para isso, precisamos elaborar para nosso BD uma
Modelagem Entidade Relacional(MER) e depois mapear os objetos de nossa aplicao com
suas entidades correspondentes utilizando as annotation. Aprenderemos como realizar
mapeamento objeto relacional(ORM) de tabelas que se relacionam.
Ao fazermos um mapeamento de um objeto relacional de tabelas que se relacionam no
BD podemos encontrar as seguintes relaes:
Relacionamentos

Tag(Annotation)

Relacionamento um para um(1:1)

@OneToOne

Relacionamento um para muitos(1:N)

@OneToMany

Relacionamento muitos para um(N:1)

@ManyToOne

Relacionamento muitos para muitos(N:N)

@ManyToMany

Tabela relacionamentos

15.9.1.

Modelando o Banco de Dados Relacional: Agenda

Utilizando um programa que faz modelagem entidade relacional(MER), MySQL


Workbench por exemplo, vamos fazer o diagrama MER e reestruturar o banco de dados
Agenda usado nos exemplos anteriores. Veja como ficou a modelagem do nosso Banco de
Dados:

Veja abaixo o cdigo SQL para gerar o modelo feito acima:


SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
CREATE SCHEMA IF NOT EXISTS `agenda` DEFAULT CHARACTER SET utf8 COLLATE

174

Curso de Java SE - UTD


utf8_general_ci ;
USE `agenda` ;
-- ------------------------------------------------------ Table `agenda`.`endereco`
-- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `agenda`.`endereco` (
`id` INT NOT NULL AUTO_INCREMENT,
`rua` VARCHAR(45) NULL,
`numero` VARCHAR(45) NULL,
`bairro` VARCHAR(45) NULL,
`cep` VARCHAR(45) NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
-- ------------------------------------------------------ Table `agenda`.`contato`
-- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `agenda`.`contato` (
`id` INT NOT NULL AUTO_INCREMENT,
`nomeContato` VARCHAR(45) NOT NULL,
`endereco_id` INT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_contato_endereco_idx` (`endereco_id` ASC),
CONSTRAINT `fk_contato_endereco`
FOREIGN KEY (`endereco_id`)
REFERENCES `agenda`.`endereco` (`id`)
ON DELETE NO ACTION
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- ------------------------------------------------------ Table `agenda`.`grupo`
-- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `agenda`.`grupo` (
`id` INT NOT NULL AUTO_INCREMENT,
`nomeGrupo` VARCHAR(45) NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
-- ------------------------------------------------------ Table `agenda`.`telefone`
-- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `agenda`.`telefone` (
`id` INT NOT NULL AUTO_INCREMENT,
`telefone` VARCHAR(45) NULL,
`contato_id` INT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_telefone_contato1_idx` (`contato_id` ASC),
UNIQUE INDEX `telefone_UNIQUE` (`telefone` ASC),
CONSTRAINT `fk_telefone_contato1`
FOREIGN KEY (`contato_id`)
REFERENCES `agenda`.`contato` (`id`)
ON DELETE NO ACTION
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- ------------------------------------------------------ Table `agenda`.`contato_grupo`

175

Curso de Java SE - UTD


-- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `agenda`.`contato_grupo` (
`contato_id` INT NOT NULL,
`grupo_id` INT NOT NULL,
PRIMARY KEY (`contato_id`, `grupo_id`),
INDEX `fk_contato_has_grupo_grupo1_idx` (`grupo_id` ASC),
INDEX `fk_contato_has_grupo_contato1_idx` (`contato_id` ASC),
CONSTRAINT `fk_contato_has_grupo_contato1`
FOREIGN KEY (`contato_id`)
REFERENCES `agenda`.`contato` (`id`)
ON DELETE NO ACTION
ON UPDATE CASCADE,
CONSTRAINT `fk_contato_has_grupo_grupo1`
FOREIGN KEY (`grupo_id`)
REFERENCES `agenda`.`grupo` (`id`)
ON DELETE NO ACTION
ON UPDATE CASCADE)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Observe que nessa modelagem temos todos os relacionamentos descritos na tabela


relacionamentos. Temos os relacionamentos abaixo:

Relacionamento 1:1 entre as tabelas contato e endereco;

Relacionamento 1:N entre as tabelas contato e telefone;

Relacionamento N:1 entre as tabelas telefone e contato;

Relacionamento N:N entre as tabelas contato e grupo;

Vamos fazer as devidas modificaes em nosso projeto AgendaHibernate para que o


mesmo persista seus dados corretamente nessa nova estrutura do BD,mas antes de
montarmos as classes de mapeamento do novo modelo do BD, precisamos ver alguns
conceitos importantssimo, para no acontecer problemas mais na frente.
Veremos a seguir que preciso da implementao da interface Serializable, sobrescrita
do mtodo equals() e hasCode() em todas as classes persistveis, para um bom
funcionamento do Hibernate.

15.9.2.
HashCode, equals e interface Serializable e sua relao como
Hibernate.
As melhores prticas do Hibernate recomendam ao mximo que os mtodos equals
e hashCode sejam sobrescrito nas classes persistveis de seu projeto.
Isso necessrio porque a implementao dos mtodos equals e hashCode
existentes na classe Object s considera endereo de memria do objeto. Isso significa que
se duas instncias de uma mesma classe, com os mesmos dados internamente, forem
comparadas com == ou obj1.equals(obj2), o resultado ser false, pois elas esto em
endereos de memria diferentes.
A comparao usando == sempre considera apenas o endereo de memria do
objeto, mas, para o Hibernate o interessante que o contedo seja comparado, o que pode
ser alcanado reimplementado os mtodos equals e hashCode.

176

Curso de Java SE - UTD

Para uma simples regra do Java, sempre que voc reimplementar o mtodo equals
dever fazer isso com o hashCode tambm.
Uma implementao manual desses mtodos nos obrigaria a comparar
individualmente cada propriedade dos objetos, alm de comparar o tipo do objetoem
questo, o que seria uma tarefa bastante penosa.
Porm, para facilitar a vida dos desenvolvedores, a Eclipse IDE tem um recurso para
gerar automaticamente os mtodos hashCode e equalscom base nas propriedades da
classe. Para gerar automaticamente, clique com o boto direito do mouse no corpo da
classe, escolha Source Generate hashCode and equals, selecione todas as propriedades
da classe e clique em OK.
Existem vrios textos j publicados sobre a linguagem Java que explicam, tanto do ponto
de vista da arquitetura como de implementao, o motivo pelo qual devemos ter os
mtodos hashCode e equals implementados em nossas classes. O foco aqui no explicar a
teoria por trs desses conceitos, mas dizer que uma boa prtica ter esses mtodos
reimplementados nas classes de seu projeto, independentemente de estarmos trabalhando
com o Hibernate. Contudo, para aqueles que desejarem se aprofundar sobre o assunto fica
a sugesto de leitura dos artigos em ingls constantes nestes links:
htpp://community.jboss.org/wiki/EqualsandHashCode
htpp://www.ibm.com/developerworks/java/library/j-jtp05273.html
O uso da interface serializable est vinculado necessidade eventual de transformar
um objeto em uma sequncia (stream) de bytes, que poder ser gravada ou transmitida de
alguma maneira. A serializao deve garantir que essa sequncia de dados possa ser
convertida novamente no objeto original, ou seja, desserializada. Usa-se serializao
quando desejamos gravar objetos em arquivos e transmiti-los por alguma via como, por
exemplo, sockets ou rmi.
Alm disso, quando um objeto serializado no Java, essa sequncia de bytes carrega
consigo um nmero que identifica a verso da classe usada durante o processo. Esse
nmero um requisito quando uma classe for implementar a interface Serializable. O
nmero ser sempre armazenado na propriedade serialVersionUID, ou seja, o
identificador de verso de serializao de uma classe. Com base nesse nmero, possvel
saber se o objeto que estamos recuperando de uma verso compatvel com a verso da
classe que foi utilizada quando serializamos o objeto.
Explicado o motivo pelo qual devemos implementar esses mtodos em nossas
classes, mais adiante no projeto veremos como colocar isso nas classes com a ajuda da IDE
Eclipse de uma maneira prtica.

15.9.3.

Mapeamento de entidades: endereco

Vamos mapear primeiramente a tabela endereo por no ter nenhuma chave


estrangeira. Criaremos uma classe chamada Endereco e colocaremos annotations para
fazermos o mapeamento entre ela e a tabela endereco que se encontra em nosso BD.

177

Curso de Java SE - UTD

Ao criar a classe Endereco a arquitetura do projeto AgendaHibernate se encontra desta

foma:
Veja como ficou a implementao da Class Endereco:

Observando a implementao da classe Endereco no temos nenhuma annotation


diferente das j utilizadas na classe ContatoAnnotation.
Para finalizarmos o mapeamento temos que adicionar ao arquivo de configurao do
hibernate(hibernate.cfg.xml) a tag que indica para o hibernate que a classe Endereco
uma classe de persistncia.
178

Curso de Java SE - UTD

Adicione o cdigo a seguir no documento de configurao do


hiberntate(hibernate.cfg.xml):
<mapping class="modelo.Endereco"/>

Devemos implementar a interface Serializeble, os mtodos hashCode() equals como boas


prticas na utilizao do Hibernate.
Faremos isso com ajuda da IDE Eclipese.
Primeiramente, vamos implementar o mtodo hashCode() e equals() utilizando o
Eclipse.
Clique no menu Source Generate hasCode and equals e marque apenas o atributo id.
O atributo id ser a referncia para comparao entre objetos dessa classe. Veja os passos
nas imagens abaixo.

Cdigo gerado pelo Eclipse:

179

Curso de Java SE - UTD

Agora vamos implementar a interface Serializable. Veja abaixo:

Pronto, Class Endereco mapeada e pronta para ser utilizada.

15.9.4.

Class EnderecoDao

Vamos criar a classe EnderecoDao que vai ficar dessa forma:


package modelo;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import conexao.HibernateUtil;
public class EnderecoDao {

180

Curso de Java SE - UTD


private Session sessao;
private Transaction transacao;
private void fecharSessao(){
try{
if(sessao.isOpen()){
sessao.close();
}
}catch(Exception e){
System.out.println("Problema ao fechar a sessao: "+e);
}
}
public void inserir(Endereco c){
try{
this.sessao =
HibernateUtil.getSessionFactory().getCurrentSession();
this.transacao = sessao.beginTransaction();
sessao.save(c);
this.transacao.commit();
}catch(HibernateException e){
System.out.println("Problema ao inserir: "+e);
this.transacao.rollback();
}finally{
this.fecharSessao();
}
}
public List<Endereco> listar(){
List<Endereco> listaContato = null;
Query consulta;
try{
this.sessao =
HibernateUtil.getSessionFactory().getCurrentSession();
this.transacao = sessao.beginTransaction();
consulta = sessao.createQuery("from Endereco");
listaContato = consulta.list();
transacao.commit();
return listaContato;
}catch(HibernateException e){
System.out.println("Problema ao cosultar: "+e);
this.transacao.rollback();
}finally{
this.fecharSessao();
}
return listaContato;
}
public Endereco buscar(Integer id){
Query resultado;
Endereco c = null;
try{
this.sessao =
HibernateUtil.getSessionFactory().getCurrentSession();
this.transacao = sessao.beginTransaction();
resultado = sessao.createQuery("from Endereco where id =
:parametro");
resultado.setInteger("parametro", id);
c = (Endereco)resultado.uniqueResult();
this.transacao.commit();
return c;

181

Curso de Java SE - UTD


}catch(HibernateException e){
System.out.println("Problema na consulta: "+e);
this.transacao.rollback();
}finally{
this.fecharSessao();
}
return c;
}
public void remover(Integer id){
try{
this.sessao =
HibernateUtil.getSessionFactory().getCurrentSession();
this.transacao = sessao.beginTransaction();
/** busca objeto do tipo Contato com o id informado. Utilize o
mtodo get ou load.*/
Endereco c = (Endereco)sessao.get(Endereco.class, id);
if(c != null){
this.sessao.delete(c);
}
this.transacao.commit();
}catch(HibernateException e){
System.out.println("Problema ao remover: "+e);
this.transacao.rollback();
}finally{
this.fecharSessao();
}
}
public void atualizar(Endereco novo){
try{
this.sessao =
HibernateUtil.getSessionFactory().getCurrentSession();
this.transacao = sessao.beginTransaction();
this.sessao.update(novo);
this.transacao.commit();
}catch(HibernateException e){
System.out.println("Problema ao editar: "+e);
this.transacao.rollback();
}finally{
this.fecharSessao();
}
}
}

A implementao da classe EnderecoDao ficou semelhante a classe


ContatoDaoAnnotation. A diferena vai ser que todas as referncias ao tipo
ContatoAnnotation sero substitudos pelo tipo Endereco. Outra diferena o uso do
mtodo getCurrentSession() no lugar do mtodo openSession(). O mtodo
getCurrentSession() captura uma sessao corrente j aberta, caso no exista abre a sesso.
Para a utilizao desse mtodo precisamos adicionar a seguinte tag ao arquivo de
configurao do Hibernate(hibernate.cfg.xml):
<property name="hibernate.current_session_context_class">thread</property>

Alm da adio do mtodo getCurrentSession(), tambm modificamos o mtodo


fecharSessao() que agora verifica se existe uma sessao aberta utilizando o mtodo
182

Curso de Java SE - UTD

isOpen() pertencente ao objeto session. A partir de agora ocultaremos a implementao


das demais classes Dao, pois todas elas so semelhantes a EndereoDao.

15.9.5.

Mapeamento de entidades: Telefone

Criamos uma classe Telefone para representar a tabela telefone. O mapeamento dessa
classe ficou desta forma:

No mapeamento da classe Telefone temos a seguinte


annotation :

Essa annotation representa a relao entre as tabelas


telefone contato, que uma relao de N:1, ou seja temo N
telefones para 1 contato. Como mostra o diagrama ao lado.
Lembrando que s fizemos o mapeamento unidirecional,
ou seja, o relacionamento 1:N existente entre as duas tabelas
ainda ser feito na classe ContatoAnnotation a qual
representa a tabela contato.

183

Curso de Java SE - UTD

15.9.6.

Mapeamento de entidades: ContatoAnnotation

Em nosso projeto atual a classe ContatoAnnotation j est mapeada utilizando as


hibernate annotations. Mas houve alteraes na tabela contato. Aps as modificaes a
classe ficar desta forma:

A tabela contato possui 3 relacionamentos so eles:

contato grupo 1:N : um contato pode ter vrios grupos


Esse relacionamento representado pela annotation:

184

Curso de Java SE - UTD

O atributo telefones armazena todos os telefones associados a um determinado contato.


mappedBy: informa para o hibernate o atributo da classe Telefone que armazena a
chave estrangeira a qual representa o contato associado ao telefone.
fetch: informa ao hibernate que ao carregar os registros da tabela contato em nossa
aplicao traga tambm os respectivos telefones. Acontece um JOIN entre as tabelas.

contato endereco 1:1 : um contato pode ter apenas um endereo


Esse relacionamento representado pela annotation:

@JoinColumn: informa ao hibernate que a coluna endereco_id uma chave estrangeira


que representa um endereo. As chaves estrangeiras apesar de serem do tipo inteiro, no
hibernate representamos com um atributo objeto do tipo correspondente segundo o
mapeamento feito.

contato grupo N:N : um contato pode estar em vrios grupos e um grupo de


185

Curso de Java SE - UTD

ter vrios contatos.


Esse relacionamento representado pela annotation:

@ JoinTable: essa notao vai representar a tabela gerada entre a tabela contato e grupo
quando fazemos o relacionamento entre as mesmas.
name: nome da tabela intermediria
joinColumns= faz a ligao entre o campo contato_id, que representa um contato na
tabela contato_grupo, e o campo id da tabela contato;
inverseJoinColumns: faz o mesmo que o joinColumns, mas agora com o atributo
grupo_id que representa um grupo na tabela contato_grupo.
Na tabela Grupo vamos ter uma notao semelhante a vista acima com a diferena que
agora o mapeamento vai ser feito pela viso da tabela Grupo, ficando dessa forma:

186

Curso de Java SE - UTD

15.9.7.

Mapeamento de entidades: Grupo

Criamos uma classe Grupo para representar a tabela grupo. O mapeamento dessa classe
ficou desta forma:

15.10.

Consultas utilizando: Classe Criteria

O Hibernate prov trs tipos diferentes para retornar informaes, uma a HQL, outra
forma atravs de consultas nativas e a terceira forma atravs da API Criteria.
A API Criteria nos permite construir consultas estruturadas utilizando Java, e ainda
prov uma checagem de sintaxe em tempo de compilao que no possvel com uma
linguagem de consulta como HQL ou SQL. A API Criteria tambm fornece projeo,
agregao e outras funcionalidades.
No restante do artigo verificaremos melhor o que essa API e o que ela oferece aos
desenvolvedores Hibernate.

15.10.1.

API Criteria

A API Criteria possui a interface org.hibernate.Criteria que est disponvel com todos os
mtodos fornecidas pela API. Atravs dessa API podemos construir consultas de forma
programtica. A interface Session do Hibernate contm vrios mtodos createCriteria()
que recebem como parmetro uma classe de um objeto persistente ou o nome da entidade
187

Curso de Java SE - UTD

e, dessa forma, o Hibernate criar um objeto Criteria que retorna instncias das classes de
objetos persistentes quando a aplicao executa uma consulta com a API. Na Listagem 1
temos um exemplo introdutrio.
Listagem 1. Exemplo utilizando createCriteria.
Criteria crit = session.createCriteria(Produto.class);
List results = crit.list();

Nessa pesquisa temos como retorno todos os objetos que so instncia da classe
Produto. Classes derivadas de produto tambm so retornadas.

15.10.2.

Restries com Criteria

A API Criteria tambm permite que possamos criar restries onde restringimos os
objetos retornados. Um exemplo disso seria retornar apenas produtos que tenham um
preo abaixo de 30 reais. Para usar restries da API utilizamos o mtodo add() que espera
receber um objeto org.hibernate.criterion.Criterion que representa um restrio
individual. Tambm podemos ter mais que uma restrio para uma consulta.
Embora possam criar nossos prprios objetos implementando o objeto Criterion ou
estendendo um objeto Criterion j existente, recomenda-se que os desenvolvedores usem
objetos Criterion embutidos da lgica de negcio da aplicao. Tambm podemos criar
nossa prpria classe factory que retorna instncias do objeto Criterion do Hibernate
apropriadamente configurados para as restries da nossa aplicao.
Usamos mtodos de fbrica (factory) na classe org.hibernate.criterion.Restrictions para
obter instncias dos objetos Criterion. Para retornar objeto que possuem um valor de
propriedade que igual nossa restrio, usamos o mtodo eq() em Restrictions. A
assinatura do mtodo :
public static SimpleExpression eq(String propertyName, Object value)

Podemos passar o mtodo eq() para o mtodo add() no objeto Criteria. Segue na
Listagem 2 um exemplo de como procuraramos um teclado nos produtos:
Listagem 2. Criando uma restrio com eq().
Criteria crit = session.createCriteria(Produto.class);
crit.add(Restrictions.eq("nome","Teclado"));
List results = crit.list();

Se quisssemos procurar produtos que no tivessem teclado faramos como na


Listagem 3, utilizando o mtodo ne():
Listagem 3. Criando uma restrio com ne().
Criteria crit = session.createCriteria(Produto.class);
crit.add(Restrictions.ne("nome","Teclado"));
List results = crit.list();

Objetos nulos podem ser encontrados utilizando isNull(), ou ento podemos utiliza
isNotNull() para pesquisar objetos no nulos, como na Listagem 4.
Listagem 4. Criando uma restrio com isNull().
Criteria crit = session.createCriteria(Produto.class);
crit.add(Restrictions.isNull("nome"));
List results = crit.list();

188

Curso de Java SE - UTD

Outra pesquisa muito utilizada quando queremos retornar objetos que possuem
algumas propriedades em comum, como a clusula LIKE do SQL. Para isso utilizamos o
mtodo ilike() ou like(). A diferena que o mtodo ilike() case-insensitive, ou seja,
maisculas ou minsculas so desprezadas. Segue na Listagem 5 um exemplo da
utilizao de like.
Listagem 5. Criando uma restrio com like().
Criteria crit = session.createCriteria(Produto.class);
crit.add(Restrictions.like("nome","Tec%"));
List results = crit.list();

O smbolo "%" utilizado para combinar partes de uma String. Dessa forma, tudo que
comear com Tec e tiver quaisquer outros caracteres sero retornados.
Os mtodos ilike e like possuem duas assinaturas:
public static SimpleExpression like(String propertyName, Object value);

ou
public static SimpleExpression like(String propertyName, String value,
MatchMode matchMode);

Podemos notar a presena de um MatchMode matchMode a mais na terceira assinatura


do segundo mtodo. O objeto org.hibernate.criterion.MatchMode utilizado para
especificar como combinar os valores especificados. O objeto MatchMode possui quatro
diferentes combinaes:

ANYWHERE: Qualquer parte na String.


END: Final da String.
EXACT: Combinao exata.
START: Inicio da String.

Segue na Listagem 6 um exemplo que usa o mtodo ilike() para pesquisar combinaes
de case-insensitive no final da String.
Listagem 6. Criando uma restrio com ilike().
Criteria crit = session.createCriteria(Produto.class);
crit.add(Restrictions.ilike("nome","browser", MatchMode.END));
List results = crit.list();

A API Criteria tambm oferece mtodos para comparaes como gt() (greater-than) que
verifica se maior que, ge() (greater-than-or-equal-to) que verifica se maior que e igual,
lt() (less-than) que verifica se menor, e por fim le() (less-than-or-equal-to) que verifica se
menor e igual. No exemplo da Listagem 7 pesquisamos por produtos que tenham um
valor menor que 30 reais.
Listagem 7. Pesquisando valores menores que 30.
Criteria crit = session.createCriteria(Produto.class);
crit.add(Restrictions.gt("preco",new Double(30.0)));
List results = crit.list();

A API Criteria permite consultas mais complexas. No exemplo da Listagem 8 temos


duas restries, o Hibernate interpreta isso como um AND.
Listagem 8. Criando mais de uma restrio (equivalente a AND).
Criteria crit = session.createCriteria(Produto.class);
crit.add(Restrictions.gt("preco",new Double(30.0)));

189

Curso de Java SE - UTD


crit.add(Restrictions.like("nome","Tec%"));
List results = crit.list();

Nesse caso estamos pesquisando produto com preo maior que 30 reais que tenham um
nome comeando com Tec.
Para fazer um OR nessas duas restries teramos que utilizar o mtodo or() como na
Listagem 9.
Listagem 9. Criando mais de uma restrio com OR.
Criteria crit = session.createCriteria(Produto.class);
Criterion preco = Restrictions.gt("preco",new Double(30.0));
Criterion nome = Restrictions.like("nome","Tec%");
LogicalExpression orExp = Restrictions.or(preco,nome);
crit.add(orExp);
List results = crit.list();

Quando temos trs OR ou mais podemos representar isso de uma forma melhor
utilizado o objeto org.hibernate.criterion.Disjunction. Para representar uma expresso
AND com mais que dois Criteria podemos usar o mtodo conjunction(). Segue na
Listagem 10 um exemplo utilizando disjunction.
Listagem 10. Utilizando disjunction() com Criteria.
Criteria crit = session.createCriteria(Produto.class);
Criterion preco = Restrictions.gt("preco",new Double(25.0));
Criterion nome = Restrictions.like("nome","Tec%");
Criterion desc = Restrictions.ilike("descricao","teclas%");
Disjunction disjunction = Restrictions.disjunction();
disjunction.add(preco);
disjunction.add(nome);
disjunction.add(desc);
crit.add(disjunction);
List results = crit.list();

O ltimo tipo de restrio o sqlRestriction(). Essa restrio permite especificarmos um


SQL diretamente na API Criteria. Essa restrio necessria quando queremos usar
clusulas SQL que o Hibernate no suporta atravs da API Criteria. Veja a Listagem 11.
Listagem 11. Utilizando sqlRestriction() com Criteria.
Criteria crit = session.createCriteria(Produto.class);
crit.add(Restrictions.sqlRestriction("{alias}.nome like 'Tec%'"));
List results = crit.list();

O {alias} utilizado quando no sabemos o nome da tabela que a nossa classe utiliza.
Dessa forma, {alias} significa o nome da tabela da classe.
O mtodo sqlRestriction() possui ainda mais dois mtodos que permitem passar
paramtros e valores JDBC para o comando SQL.

15.10.3.

Paginando Resultados

Criteria tambm faz paginao sobre os resultados de uma consulta. Existem dois
mtodos na interface da API Criteria para realizar a paginao, so eles: setFirstResult() e
setMaxResults(). O mtodo setFirstResult() requer um inteiro que representa a primeira
linha no conjunto de dados retornado, iniciando com a linha 0. O mtodo setMaxResults()
retorna um nmero fixo de objetos. Segue na Listagem 12 um exemplo da utilizao dos
mtodos.
190

Curso de Java SE - UTD

Listagem 12. Limitando os resultados com setFirstResult() e setMaxResults().


Criteria crit = session.createCriteria(Produto.class);
crit.setFirstResult(1);
crit.setMaxResults(2);
List results = crit.list();

15.10.4.

Retornando Resultados nicos

Algumas vezes desejamos retornar zero ou um nico objeto para algumas consultas. Isso
acontece quando usamos agregaes como COUNT ou porque as restries na consulta
levam a um resultado nico. Podemos limitar os resultados de qualquer consulta setando
apenas setMaxResults() para que ele retorne um nico objeto. Porm, existe outra forma
de fazer isso que tem como resultado um Object ao invs de um List, o mtodo
uniqueResult(). O mtodo uniqueResult() retorna um nico resultado ou null. Caso
tenhamos mais de um resultado lanada uma exceo NonUniqueResultException. Na
Listagem 13 temos um exemplo da sua utilizao.
Listagem 13. Retornando resultados nico com uniqueResult().
Criteria crit = session.createCriteria(Produto.class);
Criterion preco = Restrictions.gt("preco",new Double(25.0));
crit.setMaxResults(1);
Produto produto = (Produto) crit.uniqueResult();

15.10.5.

Ordenando Resultados

A API Criteria oferece aos desenvolvedores a classe org.hibernate.criterion.Order para


ordenar os resultados em ascendente ou descendente de acordo com as propriedades do
objeto. Segue na Listagem 14 um exemplo da sua utilizao.
Listagem 14. Ordenando resultados com asc() e desc().
Criteria crit = session.createCriteria(Produto.class);
crit.add(Restrictions.gt("preco",new Double(25.0)));
crit.addOrder(Order.desc("preco"));
List resultado = crit.list();

Os mtodos asc() e desc() so utilizados para ordenar de forma ascendente ou


descendente respectivamente.

15.10.6.

Associaes

Para adicionar uma restrio na que classe que esta associada com Criteria, precisamos
criar outro objeto Criteria, e passar o nome da propriedade da classe associada para o
mtodo createCriteria(). Dessa forma, teremos outro objeto Criteria. Segue na Listagem
15 temos um exemplo da utilizao da associao onde se criou um novo objeto Criteria
para a propriedade produtos e adicionou-se uma restrio para um atributo da
propriedade.
Listagem 15. Utilizando associaes com Criteria.
Criteria crit = session.createCriteria(Suplementos.class);
Criteria prdCrit = crit.createCriteria("produtos");
prdCrit.add(Restrictions.gt("preco",new Double(25.0)));
List results = crit.list();

191

Curso de Java SE - UTD

15.10.7.

Projeo e Agregao

Para usar projees comeamos com um objeto org.hibernate.criterion.Projection que


precisa de uma fbrica org.hibernate.criterion.Projections. A classe Projections similar
classe Restrictions.
Depois que temos um objeto Projection, adicione isto para um objeto Criteria com o
mtodo setProjection(). Quando um objeto Criteria executa, a lista contm referncia a
objetos que podemos fazer um cast para o tipo apropriado. Na Listagem 16 temos um
exemplo da sua utilizao.
Listagem 16. Utilizando projees com Criteria.
Criteria crit = session.createCriteria(Produto.class);
crit.setProjection(Projections.rowCount());
List results = crit.list();

Podemos notar que a projeo contm uma funo agregada. Outras funes agregadas
so listadas abaixo:

avg(String propertyName): Retorna a mdia do valor da propriedade.


count(String propertyName): Conta o nmero de vezes que a propriedade ocorre.
countDistinct(String propertyName): Conta o nmero de valores nicos que contm
a propriedade.
max(String propertyName): Calcula o valor mximo dos valores da propriedade.
min(String propertyName): Calcula o valor mnimo dos valores da propriedade.
sum(String propertyName): Calcula a soma total dos valores da propriedade.

Tambm podemos ter uma lista de projees, como mostra o exemplo da Listagem 17.
Listagem 17. Criando uma lista de projees.
Criteria crit = session.createCriteria(Produto.class);
ProjectionList projList = Projections.projectionList();
projList.add(Projections.max("preco"));
projList.add(Projections.min("preco"));
projList.add(Projections.avg("preco"));
projList.add(Projections.countDistinct("descricao"));
crit.setProjection(projList);
List results = crit.list();

Utilizando projees tambm podemos retornar apenas propriedades individuais ao


invs de entidades. Para isso basta utilizarmos o mtodo property() na classe Projections.
Na Listagem 18 temos um exemplo que demonstra isso.
Listagem 18. Retornando Propriedades ao invs de Entidades.
Criteria crit = session.createCriteria(Produto.class);
ProjectionList projList = Projections.projectionList();
projList.add(Projections.property("nome"));
projList.add(Projections.property("descricao"));
crit.setProjection(projList);
List results = crit.list();

Retornar propriedades tambm melhor para a performance da aplicao, pois com isso
temos uma reduo substancial no trfego de dados na rede.
Por fim, tambm temos a possibilidade de agrupar resultados, semelhante a clausula
GROUP BY no SQL. A projeo groupProperty faz isso de forma simples. Na Listagem 19
temos um exemplo demonstrado o seu uso.
Listagem 19. Utilizando groupProperty() com Criteria
192

Curso de Java SE - UTD


Criteria crit = session.createCriteria(Produto.class);
ProjectionList projList = Projections.projectionList();
projList.add(Projections.groupProperty("nome"));
projList.add(Projections.groupProperty("preco"));
crit.setProjection(projList);
List results = crit.list();

193

Curso de Java SE - UTD

Bibliografia

http://www.guj.com.br/

http://pt.wikipedia.org/wiki

http://jedi.wv.com.br/

http://docs.oracle.com/javase/7/docs/api/

http://jacques.dsc.ufcg.edu.br/cursos/p2/html/ed/colecoes.htm

http://www.xti.com.br/carreira/universidade-xti.htm

http://pt.scribd.com/doc/86301078/Apostila-Java

Hibernate - JBoss Community, disponvel em www.hibernate.org/


Documentao de Referncia Hibernate, disponvel em
https://docs.jboss.org/hibernate/core/3.6/reference/pt-BR/html/index.html

http://www.hibernate.org/hib_docs/v3/reference/en/html/queryhql.html

Artigo Hibernate API Criteria: Realizando consultas

http://www.devmedia.com.br/hibernate-api-criteria-realizandoconsultas/29627#ixzz2xYra6bpa

Programao Java Para a Web - Alexandre Altair De Melo; Dcio Heinzelmann,


Novatec

194

Cid Ferreira Gomes


Governador do Estado do Cear
Maria Izolda Cela de Arruda Coelho
Secretria da Educao do Estado
Maurcio Holanda Maia
Secretrio adjunto da Secretaria da
Educao do Estado

Ren Teixeira Barreira


Secretrio da Cincia, Tecnologia e
Educao Superior do Estado
Almir Bittencourt
Secretrio adjunto da Cincia,
Tecnologia e Educao Superior do Estado

Andrea Arajo Rocha


Coordenadora da Educao Profissional
SEDUC

Ricardo Costa e Silva


Coordenador da Educao Profissional
SECITECE

Jlio Csar Cavalcante Bezerra


Coordenador do Projeto e-Jovem
SEDUC

Ticiana Gonalves Vieira


Coordenadora Tcnica de Universidade
do Trabalho Digital - UTD

Fabricio Silva Rosal


Projeto e-Jovem - SEDUC
Edio de Contedo
Francisco Jonas Rodrigues Jnior
Projeto e-Jovem - SEDUC
Edio de Contedo