Introdução à Programação em Java
Introdução à Programação em Java
Licensed under the Creative Commons Attribution-NonCommercial 3.0 Unported License (the
“License”). You may not use this file except in compliance with the License. You may obtain a
copy of the License at [Link] Unless required
by applicable law or agreed to in writing, software distributed under the License is distributed on an
“AS IS ” BASIS , WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and limitations under the License.
I Introdução
1 Prefácio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2 Quem é o autor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
II Visão geral
3.1 Introdução 15
III Configuração
VI Conclusão
11 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
11.1 O que você aprendeu 103
11.2 Melhorias 103
Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Livros 105
Artigos 105
I
Introdução
1 Prefácio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2 Quem é o autor . . . . . . . . . . . . . . . . . . . . . 11
1. Prefácio
Este livro não tem a pretensão de ensinar programação em Java para pessoas que não tenham
conhecimentos básicos de programação e orientação à objetos. Assim, seguiremos utilizando a
plataforma de desenvolvimento Java SE Development Kit (JDK), programação em linguagem
Java, ainda que de um modo bem básico, afim de aclimatar você com esta linguagem e as demais
que advirão.
As experiências como alunos e professores mostrou aos autores desta apostila os principais
pontos de dificuldades no aprendizado. Isso motivou uma abordagem um pouco diferente para esta
apostila em relação ao que é comum na maioria dos livros sobre o assunto.
A cada seção, apresentaremos diversos programas que servirão de motivação para os principais
conceitos da linguagem Java. Os programas complementarão o aprendizado, pois ajudam a fixar
os conceitos vistos no livro e estimulam o estudante para conceitos avançados que fogem do escopo
deste livro.
Este livro foi composto usando a linguagem de typesetting LATEX 2ε usando a paleta de cores
oficial da Oracle conforme javalicensinglogo.
2. Quem é o autor
Eu, professor Flávio Augusto de Freitas integro os quadros do Instituto Federal de Educação,
Ciência e Tecnologia do Sudeste de Minas Gerais - Campus Rio Pomba desde o ano de 1996.
Possuo graduação em Formação Prof. Disc. Especial. 2º Grau - Esquema I - CEFET-PR
Unidade de Curitiba (1996) e graduação em Tecnologia em Processamento de Dados pelo Centro
de Ensino Superior de Juiz de Fora (1994).
Sou Especialista em Matemática pela Unigranrio - RJ (1999). Atualmente sou professor de
EBTT - IF Sudeste de Minas Gerais de Rio Pomba e professor da graduação no curso de Ciência
da Computação.
Tenho experiência na área de Ciência da Computação, com ênfase em Engenharia de Software,
atuando principalmente nos seguintes temas: Android, Java e Matemática.
II
Visão geral
3.1 Introdução
O JAVA foi desenvolvido pela Sun Microsystems Inc em 1991, posteriormente adquirido pela
Oracle Corporation. Foi desenvolvido por James Gosling e Patrick Naughton. É uma linguagem
de programação simples. Escrever, compilar e depurar um programa é fácil em java. Ajuda a criar
programas modulares e códigos reutilizáveis.
bytecode
Como discutido acima, o compilador javac do JDK compila o código-fonte java no bytecode
para que ele possa ser executado pela JVM. O bytecode é salvo em um arquivo .class pelo
compilador.
16 Capítulo 3. Visão geral sobre a linguagem Java
Ao explicar a JVM e o bytecode, usamos o termo JDK. Vamos discutir sobre isso. Como o
nome sugere, este é um kit completo de desenvolvimento java que inclui JRE (Java Runtime
Environment), compiladores e várias ferramentas como JavaDoc, depurador Java etc.
Para criar, compilar e executar o programa Java, você precisará do JDK instalado no seu
computador.
O JRE faz parte do JDK, o que significa que o JDK inclui o JRE. Quando o JRE está instalado
no seu sistema, você pode executar um programa java, mas não poderá compilá-lo. O JRE inclui
JVM, plugins de navegador e suporte a applets. Quando você só precisa executar um programa
java no seu computador, precisa apenas do JRE.
Estes são os termos java básicos que confundem iniciantes em java. Para obter o glossário java
completo, consulte o link [Link]
[Link].
Simples
Java é considerada uma linguagem simples, porque não possui recursos complexos, como sobre-
carga do operador, herança múltipla, ponteiros e alocação de memória explícita.
Linguagem robusta
Robusto significa confiável. A linguagem de programação Java é desenvolvida de maneira a
enfatizar a verificação antecipada de possíveis erros, por isso o compilador java é capaz de detectar
erros que não são fáceis de detectar em outras linguagens de programação. Os principais recursos
do java que o tornam robusto são coleta de lixo, tratamento de exceções e alocação de memória.
Seguro
Não temos ponteiros e não podemos acessar matrizes fora dos limites (você obtém ArrayIndexOu-
tOfBoundsException se tentar fazê-lo) em java. É por isso que várias falhas de segurança, como
corrupção de pilha ou excesso de buffer, são impossíveis de serem exploradas em Java.
18 Capítulo 3. Visão geral sobre a linguagem Java
Java é distribuído
Usando a linguagem de programação java, podemos criar aplicativos distribuídos. RMI (Remove
Method Invocation) e EJB (Enterprise Java Beans) são usados para criar aplicativos distribuídos em
java. De outro modo: Os programas java podem ser distribuídos em mais de um sistema conectado
entre si usando a conexão à Internet. Objetos em uma JVM (Java Virtual Machine) podem executar
procedimentos em uma JVM remota.
Multithreading
Java suporta multithreading. Multithreading é um recurso Java que permite a execução simultâ-
nea de duas ou mais partes de um programa para máxima utilização da CPU.
Portátil
Como discutido acima, o código java que está escrito em uma máquina pode ser executado em
outra máquina. O código de bytes independente da plataforma pode ser transportado para qualquer
plataforma de execução que torne o código java portátil.
III
Configuração
Um objeto é uma entidade autocontida que contém atributos e comportamento, e nada mais.
Em vez de ter uma estrutura de dados com campos (atributos) e transmite essa estrutura em toda a
lógica do programa que atua nela (comportamento), em uma linguagem orientada a objetos, dados
e lógica de programa são combinados. Essa combinação pode ocorrer em níveis completamente
diferentes, de objetos com baixa granularidade, como Number, a objetos com alta granularidade,
como um serviço FundsTransfer em um aplicativo financeiro amplo.
6.1.6 Atributos
Quais atributos uma pessoa pode ter? Alguns atributos comuns incluem:
• Name
• Age
• Height
• Weight
• Eye color
• Gender
Você provavelmente pensará em outros (e pode sempre incluir mais atributos posteriormente),
mas esta lista é um bom começo.
6.1.7 Comportamento
Uma pessoa real pode fazer todo o tipo de ação, mas comportamentos de objetos geralmente estão
relacionados a algum tipo de contexto de aplicativo. Em um contexto de aplicativo de negócios,
6.2 Princípios de OOP 29
por exemplo, você pode querer perguntar ao seu objeto Person: “Qual é sua idade?” Em resposta,
Person informaria o valor de seu atributo Age.
Lógica mais complexa pode estar oculta dentro do objeto Person —, por exemplo calcular um
Índice de Massa Corpórea (IMC) de uma pessoa para um aplicativo de saúde, — mas, por enquanto,
suponha que Person tenha o comportamento de responder a estas questões:
• Qual é seu nome?
• Qual é sua idade?
• Qual é sua altura?
• Qual é seu peso?
• Qual é a cor de seus olhos?
• Qual é seu sexo?
6.2.1 Encapsulamento
Lembre-se de que um objeto é, acima de tudo, discreto ou autocontido. Essa característica é o
princípio do encapsulamento em funcionamento. Ocultação é outro termo que às vezes é usado
para expressar a natureza autocontida e protegida de objetos.
Independentemente da terminologia, o que é importante é que o objeto mantém um limite entre
seu estado e o comportamento e o mundo externo. Como objetos no mundo real, objetos usados na
programação de computador possuem vários tipos de relacionamentos com diferentes categorias de
objetos nos aplicativos que os usam.
Na plataforma Java, é possível usar modificadores de acesso (que eu apresento posteriormente
no tutorial) para variar a natureza dos relacionamentos de objetos de público para privado. O acesso
público é muito aberto, considerando que acesso privado significa que os atributos de objetos estão
acessíveis apenas dentro do próprio objeto.
O limite público/privado impinge o princípio de encapsulamento orientado a objetos. Na
plataforma Java, é possível variar a intensidade desse limite em uma base de objeto por objeto,
dependendo de um sistema de confiança. O encapsulamento é um recurso poderoso da linguagem
Java.
6.2.2 Herança
Na programação estruturada, é comum copiar uma estrutura, nomeá-la e incluir ou modificar os
atributos que torna a nova entidade (como um registro Account) diferente de sua fonte original.
30 Capítulo 6. Começando a programar em Java
Com o tempo, essa abordagem gera uma grande questão de código duplicado, o que pode criar
problemas de manutenção.
O OOP apresenta o conceito de herança, pelo qual classes especializadas — sem código
adicional — podem “copiar” os atributos e o comportamento de classes de origem na qual elas se
especializam. Se alguns desses atributos ou comportamentos precisarem mudar, você os substitui.
O único código-fonte a ser mudado é o código necessário para criar classes especializadas. Como
vimos na seção “Conceitos de programação orientada a objeto”, o objeto de origem é chamado de
pai e a nova especialização é chamada de filho.
Herança em funcionamento
Suponha que você esteja programando um aplicativo de recursos humanos e queira usar a classe
Person como base (chamada de superclasse) para uma nova classe chamada Employee. Sendo filha
de Person, Employee teria todos os atributos de uma classe Person, junto com aqueles adicionais,
como:
• Número de identificação de contribuinte
• Número de matrícula
• Salário
A herança facilita a criação da nova classe Employee sem a necessidade de copiar todo o código
Person manualmente.
Você verá muitos exemplos de herança na programação Java posteriormente.
6.2.3 Polimorfismo
O polimorfismo é um conceito mais difícil de compreender do que o encapsulamento e a herança.
Em essência, isso significa que objetos que pertencem à mesma ramificação de uma herança,
quando enviam a mesma mensagem (ou seja, quando efetuam a mesma ação), podem manifestar
esse comportamento de forma diferente.
Para entender como o polimorfismo se aplica a um contexto de aplicativo de negócios, retorne
ao exemplo de Person. Lembre-se de dizer a Person para formatar seus atributos em uma String?
O polimorfismo torna possível que Person represente seus atributos em uma variedade de formas,
dependendo do tipo que Person é.
O polimorfismo é um dos conceitos mais complexos que você encontrará no OOP na plataforma
Java e está além do escopo de um tutorial introdutório.
• throws
• transient
• true
• try
• void
• volatile
• while
Observe que true, false e null são tecnicamente palavras não reservadas. Embora sejam
literais, eu as inclui nesta lista porque você não pode usá-las para nomear construções Java.
Uma vantagem da programação com um IDE é que ela pode usar a coloração de sintaxe para
palavras reservadas, como eu mostro posteriormente neste tutorial.
Definição de classe contém vários tipos de construções, que eu diferenciei com a formatação de
fonte. As construções mostradas em negrito (que você localizará na lista de Palavras reservadas)
são literais; em qualquer definição de objeto, elas devem ser exatamente o que estão na listagem.
Os nomes fornecidos para outras construções descrevem os conceitos que eles representam. Eu
expliquei todas as construções detalhadamente no restante desta seção.
Observação: Na Definição de classe e em alguns outros exemplos de códigos nesta seção,
colchetes indicam que as construções dentro deles não são requeridas. Os colchetes (diferente de {
e }) não fazem parte da sintaxe Java.
Comentários no código
Observe que Definição de classe também inclui algumas linhas de comentário:
1 // This is a comment
2 /* This is a comment too */
3 /* This is a
4 multiline
5 comment */
única linha e multilinhas. Um comentário de única linha deve estar contido em uma linha, embora
seja possível usar comentários de única linha adjacentes para formar um bloco. Um comentário de
multilinhas começa com /*, deve terminar com */ e pode abranger qualquer número de linhas.
Você obtém mais informações sobre comentários quando chega à seção “Escrevendo um bom
código Java” deste tutorial.
Definição de pacote
Para definir um pacote, você usa a palavra-chave package seguida de um nome de pacote legal,
terminando com um ponto e vírgula. Geralmente os nomes de pacotes são separados por pontos e
seguem este esquema padrão de fato:
1 package orgType . orgName . appName . compName ;
Você especifica a palavra-chave import, seguida pela classe que deseja importar, seguida por
um ponto e vírgula. O nome da classe deve ser completo, o que significa que ele deve incluir seu
pacote.
Para importar todas as classes dentro de um pacote, é possível inserir .* após o nome do pacote.
Por exemplo, essa instrução importa cada classe no pacote [Link]:
1 import com . makotojava .*;
A importação de um pacote integral pode tornar seu código menos legível, portanto, eu
recomendo importar apenas as classes necessárias, usando seus nomes completos.
34 Capítulo 6. Começando a programar em Java
Um accessSpecifier da classe pode ter diversos valores, mas ele geralmente é public. Você
logo consulta outros valores de accessSpecifier.
6.3.6 Variáveis
Os valores de variáveis de uma classe específica distinguem cada instância daquela classe e definem
seu estado. Esses valores geralmente são referidos como variáveis de instância. Uma variável
possui:
• Um accessSpecifier
• Um dataType
• Um variableName
• Opcionalmente, um initialValue
Variáveis públicas
Nunca é uma boa ideia usar variáveis públicas, mas em casos extremamente raros, elas podem ser
necessárias, portanto, existe a opção. A plataforma Java não limita seus casos de uso, portanto cabe a você
ser disciplinado sobre o uso de boas convenções de codificação, mesmo quando instigado a fazer de outra
forma.
Os valores possíveis de accessSpecifier são:
• public: qualquer objeto em qualquer pacote pode ver a variável. (Não use de forma alguma
este valor; consulte a barra lateral Variáveis públicas.)
• protected: qualquer objeto definido no mesmo pacote ou uma subclasse (definida em
qualquer pacote) pode ver a variável.
• Nenhum especificador (também chamado de acesso amigável ou pacote privado): apenas
objetos cujas classes são definidas no mesmo pacote podem ver a variável.
• private: apenas a classe contendo a variável pode vê-la.
Um dataType de variável depende do que a variável é, — ela pode ser um tipo primitivo ou
outro tipo de classe (novamente, mais sobre isso posteriormente).
O variableName está ativo para você, mas, por convenção, nomes de variáveis usam a conven-
ção de camel case que eu descrevi em Convenções de nomenclatura de classe (página 34), exceto
pelo fato de começarem com uma letra minúscula. (Este estilo é às vezes chamado de Camel Case
iniciado por letra minúscula.)
6.3 Introdução à linguagem Java 35
Não se preocupe com o initialValue por enquanto; apenas saiba que é possível inicializar
uma variável de instância ao declará-la. (Caso contrário, o compilador gerará um padrão para você
que será configurado quando a classe for instanciada.)
A definição básica de classe para Person não é útil neste ponto, pois define apenas seus atributos
(e os atributos privados que estão nela).
Para que seja mais interessante, a classe Person precisa de comportamento – e isso significa
métodos.
6.3.8 Métodos
Os métodos de uma classe definem seu comportamento.
Métodos se enquadram em duas categorias principais: construtores ou todos os outros métodos,
dos quais existem muitos tipos. Um método construtor é usado apenas para criar uma instância de
uma classe. Outros tipos de métodos podem ser usados virtualmente para qualquer comportamento
do aplicativo.
A definição de classe na Definição de classe mostra a forma de definir a estrutura de um método,
que inclui elementos como:
• accessSpecifier
• returnType
• methodName
• argumentList
A combinação desses elementos estruturais em uma definição de método é chamada de assina-
tura de método.
Depois, você consulta mais detalhadamente os dois tipos de métodos, começando com constru-
tores.
Métodos construtores
Você usa construtores para especificar como instanciar uma classe. Definição de classe mostra a
sintaxe de declaração do construtor de forma abstrata; novamente:
1 accessSpecifier ClassName ([ argumentList ]) {
2 constructorStatement ( s )
3 }
Argumentos em um argumentList são separados por vírgulas e nenhum dos dois argumentos
pode ter o mesmo nome. argumentType é um tipo primitivo ou outro tipo de classe (igual com
tipos de variáveis).
Definição de classe com um construtor
Agora, você vê o que acontece quando inclui a capacidade para criar um objeto Person de duas
formas: usando um construtor no-arg e inicializando uma lista parcial de atributos.
A Listagem 6.2 mostra como criar construtores e também como usar argumentList:
Listagem 6.2: Person: definição de classe com um construtor
1 package com . makotojava . intro ;
2 public class Person {
3 private String name ;
4 private int age ;
5 private int height ;
6 private int weight ;
7 private String eyeColor ;
8
9 private String gender ;
10 public Person () {
11 // Nothing to do ...
12 }
13
14 public Person ( String name , int age , int height , int weight String eyeColor , String
gender ) {
15 this . name = name ;
16 this . age = age ;
17 this . height = height ;
18 this . weight = weight ;
19 this . eyeColor = eyeColor ;
20 this . gender = gender ;
21 }
22 }
Outros métodos assemelham-se muito aos construtores, com algumas exceções. Primeiro, é
possível nomear outros métodos como deseja (embora, claro, determinadas regras se apliquem). Eu
recomendo as seguintes convenções:
6.3 Introdução à linguagem Java 37
Observe o comentário na Person com alguns novos métodos sobre “combinações de getter/-
setter.” Você trabalhará mais com getters e setters posteriormente no tutorial. Por enquanto,
tudo o que você precisa saber é que um getter é um método para recuperar o valor de um atributo e
um setter é um método para modificar esse valor. A Listagem 6.3 mostra apenas uma combinação
de getter/setter (para o atributo Name), mas é possível definir mais de uma forma semelhante.
Observe na Person com alguns novos métodos que se um método não retornar um valor, você
deverá informar ao compilador especificando o tipo de retorno void em sua assinatura.
Inicie o NetBeans IDE. No IDE, escolha Arquivo Novo Projeto... , como mostrado na figura
abaixo.
Figura 7.1: Netbeans IDE com o item de menu Arquivo Novo Projeto... selecionado.
42 Capítulo 7. Hello World! E por que não?
Na janela do assistente (Figura 7.2) New Project na página Choose Project, em Categories,
expanda a categoria Java with Ant e em Projects selecione Java Application, como mostrado
na figura abaixo. Em seguida, clique no botão Next .
7.1 Configurando o Projeto 43
Em Steps, na página Name and Location do assistente, adote o procedimento a seguir (como
mostrado na Figura 7.3):
• No campo Project Name (Nome do projeto), digite HelloWorldApp.
• Deixe desmarcada a caixa de seleção Use Dedicated Folder for Storing Libraries (Utilizar
Pasta Dedicada para Armazenar Bibliotecas).
• No campo Create Main Class (Criar Classe Principal), digite [Link].
Clique no botão Finish .
O projeto é criado e aberto no IDE. Agora você deve ver os seguintes componentes:
A janela Projetos, que contém uma view em árvore dos componentes do projeto, incluindo
arquivos de código-fonte, bibliotecas de que seu código depende, e assim por diante.
A janela Editor de Código-fonte com um arquivo chamado HelloWorldApp é aberta.
A janela Navegador, que você pode utilizar para navegar rapidamente entre elementos dentro
da classe selecionada.
Você pode adicionar a mensagem “Hello World!” ao código de esqueleto substituindo a linha:
7.3 Compilando e Executando o Programa 45
pela linha:
1 System . out . println ( " Hello World ! " ) ;
Figura 7.5: Netbeans IDE com o item de menu Executar Executar Projeto selecionado.
46 Capítulo 7. Hello World! E por que não?
O programa imprime Hello World! para a Janela de Saída (juntamente com outra saída do
script de construção).
Parabéns! Seu programa funciona!
Se houver erros de compilação, eles são marcados com glifos vermelhos nas margens esquerda
e direita do Editor de Código-fonte. Os glifos da margem esquerda indicam os erros das linhas
correspondentes. Os glifos da margem direita mostram todas as áreas do arquivo que apresentam
erros, incluindo os erros das linhas que não estão visíveis. É possível passar o mouse sobre a marca
do erro para ver a descrição deste erro. É possível clicar em um glifo da margem direita para ir para
a linha que apresenta o erro.
Figura 7.7: Netbeans IDE com o item de menu Executar Limpar e Construir Projeto selecionado.
Agora você sabe como executar algumas das tarefas de programação mais comuns no IDE.
7.5 Conclusão
Nesta seção você aprendeu como criar um projeto Java simples, alterar o código da aplicação, salvar
um projeto e compilá-lo.
8. Cálculos simples envolvendo dois números
Figura 8.1: Netbeans IDE com o item de menu Arquivo Novo Projeto... selecionado.
No assistente Novo Projeto, expanda a categoria Java with Ant e selecione Java Application,
como mostrado na figura abaixo. Em seguida, clique em Next .
50 Capítulo 8. Cálculos simples envolvendo dois números
O projeto é criado e aberto no IDE. Agora você deve ver os seguintes componentes:
A janela Projetos, que contém uma view em árvore dos componentes do projeto, incluindo
arquivos de código-fonte, bibliotecas de que seu código depende, e assim por diante.
A janela Editor de Código-fonte com um arquivo chamado SomaDoisNumeros é aberta.
A janela Navegador, que você pode utilizar para navegar rapidamente entre elementos dentro
da classe selecionada.
Altere o código para ficar igual à Listagem 8.2. Salve a alteração escolhendo Arquivo Salvar .
O arquivo deve ter uma aparência semelhante à seguinte amostra de código.
Listagem 8.2: Classe SomaDoisNumeros completa
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package somadoisnumeros ;
7
8 import javax . swing . JOptionPane ;
9
10 /* *
11 *
12 * @author dcc
13 */
14 public class SomaDoisNumeros {
15
16 /* *
17 * @param args the command line arguments
18 */
19 public static void main ( String [] args ) {
20 double soma ;
21 double num1 = 0.0;
22 double num2 = 0.0;
23
24 String st1 = JOptionPane . showInputDialog ( null , " Digite um numero : " ) ;
25
26 String st2 = JOptionPane . showInputDialog ( null , " Digite outro numero : " ) ;
27
28 num1 = Double . parseDouble ( st1 ) ;
29 num2 = Double . parseDouble ( st2 ) ;
30 soma = num1 + num2 ;
31
32 JOptionPane . showMessageDialog ( null , " A soma dos numeros e : " + soma ) ;
33 }
34
35 }
8.3 Compilando e Executando o Programa 53
Esta janela exibe o resultado da soma dos valores fornecidos anteriormente (Figura 8.5 e 8.6),
exibindo a soma 3.5 + 4.6 = 8.1, neste exemplo.
Novo clique em OK e o programa encerra.
Parabéns! Seu programa funciona!
Você poderia simplificar o programa trocando as linhas 24 a 29 da Listagem 8.2 por:
1 num1 = Double . parseDouble ( JOptionPane . showInputDialog ( null , " Digite um numero : " ) ) ;
2 num2 = Double . parseDouble ( JOptionPane . showInputDialog ( null , " Digite outro numero : " ) ) ;
Se houver erros de compilação, eles são marcados com glifos vermelhos nas margens esquerda
e direita do Editor de Código-fonte. Os glifos da margem esquerda indicam os erros das linhas
correspondentes. Os glifos da margem direita mostram todas as áreas do arquivo que apresentam
erros, incluindo os erros das linhas que não estão visíveis. É possível passar o mouse sobre a marca
do erro para ver a descrição deste erro. É possível clicar em um glifo da margem direita para ir para
a linha que apresenta o erro.
8.5 Conclusão
Nesta seção você usou o que viu na seção anterior, aprendeu a importar bibliotecas Java ja-
[Link], como ler números usando uma janela showInputDialog de entrada,
como converter números no formato texto para formato double usando parseDouble como calcular
uma soma simples e finalmente, como exibir o resultado da soma usando uma janela showMessa-
geDialog.
9. Trabalhando com Collections no Java
Em harvey2005java, uma coleção é uma estrutura de dados, na realidade um objeto, que pode
armazenar ou agrupar referências a outros objetos (um contêiner). As classes e interfaces da
estrutura de coleções são membros do pacote [Link] e a Figura 9.1 apresenta a hierarquia de
algumas destas interfaces oferecidas pelo Java.
3. Fila (Queue):
4. Uma coleção utilizada para manter uma “fila” de elementos. Existe uma ordem linear para as
filas que é a “ordem de chegada”. As filas devem ser utilizadas quando os itens deverão ser
processados de acordo com a ordem “PRIMEIRO-QUE-CHEGA, PRIMEIRO-ATENDIDO”.
Por esta razão as filas são chamadas de Listas FIFO, termo formado a partir de “First-In,
First-Out”.
5. Mapa (Map e SortedMap):
Uma mapa armazena pares, chave e valor, chamados de itens. As chaves não podem ser
duplicadas e são utilizadas para localizar um dado elementos associado. As chaves podem
ser mantidas ordenadas (SortedMap) ou não.
Para atender o propósito deste artigo será utilizada a classe ArrayList na implementação de
vetores dinâmicos (ou redimensionáveis). Veja a seguir a relação dos principais métodos da classe.
• boolean add(Object element): Adiciona o elemento especificado no final da lista.
• void add(int index, Object element): Insere o elemento especificado na posição
indicada da lista.
• void clear(): Remove todos os elementos da lista.
• boolean contains(Object element): Retorna verdadeiro se a lista contém o elemento
especificado e falso caso contrário.
• Object get(int index): Retorna o i-ésimo elemento da lista.
• int indexOf(Object element): Retorna a posição da primeira ocorrência do elemento
especificado na lista.
• boolean isEmpty(): Retorna verdadeiro se a lista estiver vazia e falso caso contrário.
• int lastIndexOf(Object element): Retorna a posição da última ocorrência do elemento
especificado na lista.
• Object remove(int index): Remove o i-ésimo elemento da lista.
• Object set(int index, Object element): Substitui o i-ésimo elemento da lista pelo
elemento especificado.
• int size(): Retorna o número de elementos da lista.
9.1 ArrayList
Na Listagem 9.1, foram implementados trechos de códigos que demonstram a utilização da classe
ArrayList para criar, manter e percorrer uma lista de contatos. As seguintes funcionalidades
foram implementadas: a) declarando e instanciando um objeto agenda; b) usando o método add()
para gravar 4 contatos na agenda; c) mostrando os “n” contatos da agenda (usando o índice);
d) removendo o i-ésimo elemento da agenda; e) mostrando os “n” contatos da agenda (usando
for-each); e, f) mostrando os “n” contatos da agenda (com iterator).
Listagem 9.1: Aplicação Java explorando os métodos da classe ArrayList
1 import java . util . ArrayList ;
2 import java . util . Iterator ;
3 import java . util . Scanner ;
4
5 public class Agenda1 {
6
7 public static void main ( String [] args ) {
8 Scanner ler = new Scanner ( System . in ) ;
9
10 // [ A ] declarando e instanciando uma agenda de contatos
11 ArrayList < String > agenda = new ArrayList () ;
12
13 // [ B ] usando o m é todo add () para gravar 4 contatos na agenda
14 agenda . add ( " Juca Bala ;11 1111 -1111 " ) ;
15 agenda . add ( " Marcos Paqueta ;22 2222 -2222 " ) ;
16 agenda . add ( " Maria Antonieta ;33 3333 -3333 " ) ;
9.1 ArrayList 57
17 agenda . add ( " Ant ô nio Conselheiro ;44 4444 -4444 " ) ;
18
19 int i ;
20
21 // [ C ] mostrando os " n " contatos da agenda ( usando o í ndice )
22 // n ú mero de elementos da agenda : m é todo size ()
23 System . out . printf ( " Percorrendo o ArrayList ( usando o í ndice ) \ n " ) ;
24 int n = agenda . size () ;
25 for ( i =0; i < n ; i ++) {
26 System . out . printf ( " Posi ç ã o %d - % s \ n " , i , agenda . get ( i ) ) ;
27 }
28
29 System . out . printf ( " \ nInforme a posi ç ã o a ser exclu í da :\ n " ) ;
30 i = ler . nextInt () ;
31
32 try {
33 // [ D ] remove o i - é simo contato da agenda
34 agenda . remove ( i ) ;
35 } catch ( IndexOutOfBoundsException e ) {
36 // exce ç ã o lan ç ada para indicar que um í ndice ( i )
37 // est á fora do intervalo v á lido ( de 0 at é agenda . size () -1)
38 System . out . printf ( " \ nErro : posi ç ã o inv á lida (% s ) . " ,
39 e . getMessage () ) ;
40 }
41
42 // [ E ] mostrando os " n " contatos da agenda ( usando for - each )
43 System . out . printf ( " \ nPercorrendo o ArrayList ( usando for - each ) \ n " ) ;
44 i = 0;
45 for ( String contato : agenda ) {
46 System . out . printf ( " Posi ç ã o %d - % s \ n " , i , contato ) ;
47 i ++;
48 }
49
50 // [ F ] mostrando os " n " contatos da agenda ( com iterator )
51 System . out . printf ( " \ nPercorrendo o ArrayList ( usando iterator ) \ n " ) ;
52 i = 0;
53 Iterator < String > iterator = agenda . iterator () ;
54 while ( iterator . hasNext () ) {
55 System . out . printf ( " Posi ç ã o %d - % s \ n " , i , iterator . next () ) ;
56 i ++;
57 }
58 }
59
60 }
Então você pode questionar: Porque não fazer um ArrayList carros = new ArrayList();
sem usar as interfaces? Por uma questão muito simples: você precisa garantir a flexibilidade da
sua aplicação, garantir que o mesmo objeto possa ser instanciado de maneiras distintas em pontos
distintos da aplicação. Como você tem uma interface List, você tem certeza dos métodos que
seu objeto tem, mesmo que ele seja instanciado por uma classe como ArrayList ou LinkedList.
Vamos melhorar um pouco mais nossa Listagem 1, adicionando o uso de Generics (Listagem 9.3).
Listagem 9.3: Usando Generics com ArrayList e List
1 import java . util . ArrayList ;
2 import java . util . List ;
3
4 public class MyList {
5
6 /* *
7 * @param args
8 */
9 public static void main ( String [] args ) {
10
11 /*
12 * Agora adicionamos um Generic " < Carro >" , assim s ó podemos
13 * adicionar objetos do tipo ’ Carro ’ nossa lista .
14 *
15 * */
16 List < Carro > carros ;
17
18 /*
19 * Criamos uma ArrayList apenas com carros
20 * */
21 carros = new ArrayList < Carro >() ;
22
23
24 /*
25 * Voc ê conseguir á criar sem problemas um ArrayList
26 * sem passar o tipo Generic , mas a IDE ir á dar um
27 * Warning dizendo que voc ê deveria passar um
28 * tipo Generic , para evitar erros em runtime .
29 * */
30 carros = new ArrayList () ;
31
32 /*
33 * O c ó digo abaixo n ã o ser á compilado , erro em tempo de
34 * design . Pois nosso objeto ’ carros ’ agora é muito
35 * exigente : S ó aceita implementa ç õ es de List que tenham
36 * objetos do tipo ’ Carro ’. Estamos tentando fazer
37 * um ’ cast ’ de Animal para Carro e
38 * isso n ã o poss í vel .
39 * */
40 carros = new ArrayList < Animal >() ;
41
42 }
43
44 }
Para finalizar o uso do List, vamos mostrar alguns métodos muito utilizados no dia a dia.
Observe a Listagem 9.4.
Listagem 9.4: Uso de métodos frequentes com List
1 import java . util . ArrayList ;
2 import java . util . List ;
3
4 public class MyList {
5
6 /* *
7 * @param args
8 */
9 public static void main ( String [] args ) {
10
11 List < Carro > carros = new ArrayList < Carro >() ;
60 Capítulo 9. Trabalhando com Collections no Java
12 List < Carro > carrosNovos = new ArrayList < Carro >() ;
13
14 Carro carro = new Carro () ;
15
16 // adiciona um carro a nossa lista
17 carros . add ( carro ) ;
18
19 // adiciona um carro a uma posi ç ã o exata da lista
20 carros . add (10 , carro ) ;
21
22 /*
23 * Imagine que desejamos adicionar uma lista de
24 * carros novos a nossa lista de carros ,
25 * podemos adicionar todos de uma s ó vez , usando o ’ addAll ’
26 * */
27 carros . addAll ( carrosNovos ) ;
28
29 /* Caso prefira , pode usar um for para adicionar
30 * os carrosNovos . Nosso la ç o FOR abaixo , tem a mesma
31 * fun ç ã o do addAll .
32 */
33 for ( int i = 0 ; i < carrosNovos . size () ; i ++) {
34 carros . add ( carrosNovos . get ( i ) ) ;
35 }
36
37 /*
38 * Verifica se o carro est á na lista de carros .
39 * Mas como essa verifica ç ã o é feita ?
40 * Atrav é s do m é todo ’ equals ’ do seu objeto carro .
41 * Sendo assim , na implementa ç ã o do
42 * seu bean ’ Carro ’, é muito importante que voc ê
43 * sobreescreva o m é todo ’ equals ’ dizendo
44 * como as compara ç õ es devem ser realizadas .
45 * */
46 carros . contains ( carro ) ;
47
48 // Remove todos os elementos da lista
49 carros . clear () ;
50
51 }
52
53 }
Esses métodos mencionados acima são os usados com muita frequência, mas nada impede que
você faça um estudo em cada método.
16
17
18 // Pode tamb é m optar pelo LinkedHashSet
19 carros = new LinkedHashSet < Carro >() ;
20
21 // e assim por diante
22
23
24 }
25
26 }
Você já deve ter percebido que podemos implementar diferentes instâncias para uma mesma
interface Set, obviamente que cada uma tem sua peculiaridade e não é foco deste artigo mostrar as
peculiaridades de cada implementação.
Uma diferença muito comum entre o Set e o List é o retorno de determinados elementos em
uma posição exata da lista, pois com o List podemos simplesmente fazer um ’get(index)’ e você
terá o elemento X na posição INDEX. Na Listagem 9.6 iremos demonstrar como percorrer todos só
elementos usando o iterator.
Listagem 9.6: Usando iterator para capturar elementos no Set
1 import java . util . HashSet ;
2 import java . util . Iterator ;
3 import java . util . Set ;
4
5 public class MySet {
6
7 /* *
8 * @param args
9 */
10 public static void main ( String [] args ) {
11
12 Set < Carro > carros ;
13
14 // Voc ê pode implementar com HashSet
15 carros = new HashSet < Carro >() ;
16
17 /*
18 * Percorrer todo SET com iterator
19 * */
20 Iterator < Carro > carrosAsIterator = carros . iterator () ;
21 while ( carrosAsIterator . hasNext () ) {
22 Carro it = carrosAsIterator . next () ;
23 }
24 }
25 }
No exemplo acima, abstraíamos a maioria dos comentários que já fizemos nas listagens anterio-
res, assim tornamos o mesmo sucinto e prático. Veja na Listagem 9.7 um exemplo mais completo
de como trabalhar com Iterator.
Listagem 9.7: Trabalhando com Iterator
1 import java . util . ArrayList ;
2 import java . util . Iterator ;
3 import java . util . ListIterator ;
4
5 public class MySet2 {
6
7 public static void main ( String args []) {
8
9 ArrayList al = new ArrayList () ;
10
11 al . add ( " C " ) ;
12 al . add ( " A " ) ;
13 al . add ( " E " ) ;
14 al . add ( " B " ) ;
15 al . add ( " D " ) ;
62 Capítulo 9. Trabalhando com Collections no Java
Os exemplos mostrados acima são práticos o suficiente para que você leitor possa questionar
o uso de tais recursos em seu dia a dia. Algumas vezes utilizados de forma errada. É comum,
por exemplo, em projetos iniciantes notarmos a falta de interfaces e implementações corretas
de polimorfismo, por exemplo. Este artigo tem como principal objeto não só mostrar o uso dos
recursos, já conhecidos por muitos, mas também mostrar a forma correta e ideal de utilizá-los.
Então, caso você esteja utilizando outra forma que seja distinta da mostrada nas seções anteriores,
aconselhamos que a mesma seja analisada.
Dizemos ’analisada’, pois toda nova solução ou alteração deve ser analisada antes de alterada, e
não simplesmente trocada sem uma análise crítica.
Para finalizar veja na Listagem 9.8 uma forma alternativa de utilizar o iterator com um
’foreach’.
Listagem 9.8: Usando iterator com foreach
1 import java . util . HashSet ;
2 import java . util . Iterator ;
3 import java . util . Set ;
4
5 public class MySet {
6
7 /* *
8 * @param args
9 */
10 public static void main ( String [] args ) {
11
12 Set < Carro > carros ;
13
14 // Voc ê pode implementar com HashSet
15 carros = new HashSet < Carro >() ;
16
17 /*
18 * Percorrer todo SET com iterator usnado foreach
19 * */
9.3 Set e HashSet 63
Usaremos o banco de dados MySQL no projeto de nossa livraria, já que é um dos bancos de dados
relacionais mais utilizados no mercado, é gratuito e bastante simples de instalar.
Se você ainda não tem o MySQL instalado, pode fazer download pelo link:
[Link]
Figura 10.1
Ao final da página, você encontrará um campo para escolher seu sistema operacional. Selecione
e depois clique em download, na opção que preferir:
66 Capítulo 10. Trabalhando com JFrame e MySQL
Figura 10.2
No mesmo site, você encontra um tutorial de instalação de acordo com o seu sistema operacional.
Ou você pode acessar o tutorial diretamente em:
[Link]
Após baixar e instalar o MySQL, vamos nos logar no MySQL e criar a base de dados (database)
de nosso projeto.
Figura 10.4: Janela Preferências do sistema no Mac OS, mostrando o item MySQL na parte inferior esquerda.
Nesta janela clique em Novo (menu lateral esquerdo) e crie um banco de dados com o nome
de BD. Em seguida clique no botão Criar .
Como o nosso banco de dados é novo, não há nenhuma tabela nele, assim o phpMyAdmin
mostra a janela seguinte (Figura 10.8).
Deixe a janela como está na Figura 10.8 e clique no botão Executar . O phpMyAdmin mostra
a Figura 10.9.
10.1 Iniciando com MySQL 69
O phpMyAdmin mostra que a tabela foi criada dentro do banco de dados BD (menu lateral
esquerdo) e exibe a estrutura da tabela à direita (Figura 10.10).
Agora vamos inserir um usuário na tabela usuarios. No lado direito da janela do phpMyAd-
min, clique na aba Inserir (na parte de cima da janela). Entre com os valores na coluna Valor
como na Figura 10.11 e clique no botão Executar .
Execute o NetBeans e crie um novo projeto clicando no menu File New Project... . A janela
New Project aparece. Deixe-a como na Figura 10.12 e clique no botão Next .
70 Capítulo 10. Trabalhando com JFrame e MySQL
Figura 10.12
A janela New Java Application é mostrada. Deixe-a como na Figura 10.13 e clique no botão
Finish .
Figura 10.13
Pronto! Você acaba de criar o projeto ProjetoBD e a janela de códigos deve se parecer como a
Listagem 10.1.
Listagem 10.1: Classe ProjetoBD
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package projetobd ;
7
8 /* *
9 *
10 * @author dcc
10.2 Banco de Dados e JDBC 71
11 */
12 public class ProjetoBD {
13
14 /* *
15 * @param args the command line arguments
16 */
17 public static void main ( String [] args ) {
18 // TODO code application logic here
19 }
20
21 }
Para acessarmos um banco de dados MySQL usando Java, precisamos usar um driver jdbc.
Pacote [Link]
No momento de fazer os imports das classes, tome o cuidado de sempre escolher o pacote
[Link]. Nunca escolha opções de classes equivalentes do pacote [Link], ou qualquer outro
banco de dados que você estiver utilizando. Dessa forma, você não se acopla com a API do banco
de dados que está utilizando.
Se você ainda não está familiarizado com o termo JAR, não se preocupe.
A árvore do projeto mostra que a biblioteca JAR foi inserida com sucesso.
10.2 Banco de Dados e JDBC 73
Figura 10.16: Árvore do projeto mostrando que a biblioteca JAR foi inserida corretamente.
Agora que temos o driver, vamos criar uma nova classe, que chamaremos de ConexaoMySQL
para colocar isso tudo em prática. Use a Figura 10.17 como guia. Clique com o botão direito do
mouse sobre ProjetoBD Source Packages projetobd e escolha New Java Class... no menu
que aparece.
Na janela que aparece, deixe-a como na Figura 10.18, abaixo. Clique no botão Finish .
74 Capítulo 10. Trabalhando com JFrame e MySQL
24 String driver ;
25
26 public ConexaoSQL () {
27 this . driver = " com . mysql . jdbc . Driver " ;
28 this . password = " password " ; // altere para a senha do seu phpMyAdmin
29 this . user = " root " ; // altere para o usu á rio do seu phpMyAdmin
30
31 // Use a linha abaixo se n ã o houver Warning de SSL
32 // this . url = " jdbc : mysql :// localhost :3306/ BD ";
33
34 // Ou use a linha abaixo se houver algum Warning de SSL
35 this . url = " jdbc : mysql :// localhost :3306/ BD ? autoReconnect = true & useSSL = false " ;
36 }
37
38 public boolean openConnectionMySql () {
39 try {
40 Class . forName ( driver ) ;
41 con = DriverManager . getConnection ( url , user , password ) ;
42 stmt = con . createStatement () ;
43 } catch ( ClassNotFoundException classException ) {
44 // Could not find the driver class . Likely an issue
45 // with finding the . jar file .
46 System . out . println ( " Could not find the JDBC driver class . " ) ;
47 System . out . print ( classException . getMessage () ) ;
48 System . out . println ( " Try again later ! " ) ;
49 // Exit . Cannot do anything further .
50 return false ;
51 } catch ( SQLTransientConnectionException connException ) {
52 // There was a potentially temporary network error
53 // Could automatically retry a number of times here , but
54 // instead just report error and exit .
55 System . out . print ( " Network connection issue : " ) ;
56 System . out . print ( connException . getMessage () ) ;
57 System . out . println ( " Try again later ! " ) ;
58 return false ;
59 } catch ( SQLInvalidAuthorizationSpecException authException ) {
60 // Either the username or password was wrong
61 System . out . print ( " Could not log into database : " ) ;
62 System . out . print ( authException . getMessage () ) ;
63 System . out . println ( " Check the login credentials and try again . " ) ;
64 return false ;
65 } catch ( SQLException exFonte ) {
66 JOptionPane . showMessageDialog ( null , " Deu erro na conex ã o com a fonte de dados : " +
exFonte ) ;
67 return false ;
68 }
69 return true ;
70 }
71 }
Agora vamos criar uma nova classe JFrame, que chamaremos de frmLogin para fazer login no
nosso banco de dados BD. Lembre que criamos um usuário chamado root com senha root.
Use a Figura 10.19 como guia. Clique com o botão direito do mouse sobre ProjetoBD Source
Packages projetobd e escolha New JFrame Form... no menu que aparece.
76 Capítulo 10. Trabalhando com JFrame e MySQL
Deixe a janela que aparece como na Figura 10.20 e clique no botão Finish .
Figura 10.21: Componentes arrastados da Palette e dispostos no formulário de Login da janela Design do NetBeans.
10.3 Criando uma Janela de Login em ProjetoBD 77
Clique no componente jLabel1 na tela do formulário e altere a propriedade text para Usuário:
e pressione . Toda vez que você escolhe um componente na tela do formulário as suas
propriedades aparecem no menu lateral direito, veja Figura 10.22.
Figura 10.22: Propriedade text do componente jLabel1 sendo alterada para Usuário:.
Altere:
• a propriedade text de jLabel2 para Senha:;
• a propriedade text de jTextField1 para vazio;
• a propriedade text de jPasswordField1 para vazio;
• a propriedade text de jButton1 para OK;
• a propriedade text de jButton2 para Cancelar.
Na parte de cima da janela de design (Figura 10.21), clique no botão Source para exibir o
código do formulário. Altere o código que aparece e deixe-o igual à Listagem 10.4, acrescentando
as linhas 3, 11 e 12.
Listagem 10.4: Classe frmLogin
1 public class frmLogin extends javax . swing . JFrame {
2
3 ConexaoSQL objCon = new ConexaoSQL () ;
4
5 /* *
6 * Creates new form frmLogin
7 */
8 public frmLogin () {
9 initComponents () ;
10
11 setResizable ( false ) ;
12 setLocationRelativeTo ( null ) ;
13 }
14 .
15 .
16 .
Na parte de cima da janela de design (Figura 10.21), clique no botão Design para exibir o
formulário novamente. Dê dois cliques no botão OK e a janela de código se abrirá. Altere o código
como Listagem abaixo.
Listagem 10.5: Código do botão OK
1 private void jButton1ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 try {
3 if (! objCon . openConnectionMySql () ) {
4 System . out . println ( " N ã o foi poss í vel conectar ao banco de dados ! " ) ;
5 System . exit (1) ;
6 }
7 objCon . stmt = objCon . con . createStatement () ;
78 Capítulo 10. Trabalhando com JFrame e MySQL
Na parte de cima da janela de design (Figura 10.21), clique no botão Design para exibir o
formulário novamente. Dê dois cliques no botão Cancelar e a janela de código se abrirá. Altere o
código como Listagem abaixo.
Listagem 10.6: Código do botão OK
1 private void jButton2ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 System . out . println ( " Usu á rio saiu do sistema ! " ) ;
3 System . exit (0) ;
4 }
No menu lateral esquerdo que exibe a estrutura do projeto, dê dois cliques em ProjetoBD
Source Packages projetobd [Link] e na janela de código que aparece, altere o
código como na listagem seguinte.
Listagem 10.7: Classe ProjetoBD
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package projetobd ;
7
8 /* *
9 *
10 * @author dcc
11 */
12 public class ProjetoBD {
13
14 /* *
15 * @param args the command line arguments
16 */
17 public static void main ( String [] args ) {
18 frmLogin formLogin = new frmLogin () ;
19 formLogin . setVisible ( true ) ; // mostrar á tela de login no in í cio
20 }
21
22 }
Agora é só executar nosso projeto. Escolha o menu Run Run Project . Se não houver erros, a
tela de login deverá aparecer.
Teste alguns usuários e senhas e veja as mensagens do nosso projeto. Depois teste o usuário
root e senha root, como está no nosso banco de dados BD.
Tudo está funcionando, porém há um problema com nosso login. Se você der uma olhada na
Figura 10.9, verá que nossa tabela usuarios tem dois problemas. Primeiro o campo usuario não
é do tipo chave primária e, portanto, poderia ser repetido na tabela, o que não seria interessante.
Segundo, o campo senha não está criptografado, o que deixaria nosso banco de dados BD totalmente
exposto a hackers. Vamos corrigir isto.
Acesse o phpMyAdmin, e selecione a tabela usuarios do banco de dados BD. Nas abas da
parte superior da janela, clique na aba Estrutura. Na janela que aparece (Figura 10.24), no campo
usuario clique em ▼ Mais Primária .
Figura 10.24
Na janela de confirmação clique em OK . Note que o símbolo de uma chave amarela aparece
ao lado do campo usuario. Agora o campo usuario é do tipo chave primária e não poderá ser
repetido. Nosso primeiro problema está corrigido.
Aproveite e no campo senha clique em Alterar e na janela que aparece altere o tamanho de 30
para 60, depois clique no botão Salvar . A aba SQL é exibida automaticamente e mostra o comando
executado:
1 ALTER TABLE ‘ usuarios ‘ CHANGE ‘ senha ‘ ‘ senha ‘ VARCHAR (60) CHARACTER SET utf8mb4 COLLATE
utf8mb4_0900_ai_ci NOT NULL ;
Agora clique na aba Visualizar e veremos nosso usuário cadastrado, isto é, usuário root e
senha root, Figura 10.25.
Logo abaixo deste usuário, clique no link Editar. A aba Inserir é selecionada automaticamente,
mostrando os valores na tabela usuarios.
80 Capítulo 10. Trabalhando com JFrame e MySQL
Figura 10.26: Senha root convertida em hash MD5 usando o site [Link]
Copie este valor e substitua a senha root do usuário root na tabela usuarios do banco de
dados BD com a nova senha criptografada com hash MD5 obtida com o procedimento da Figura
10.26, deixando como na Figura 10.27 e clique no botão Executar .
Figura 10.27
Se você executar o programa como está e na janela de login (Figura 10.23) entrar com usuário
root e senha root, verá que o usuário é inválido. Isto está correto. Precisamos alterar nossa janela
de login para usar o hash MD5 para criptografar a senha root para seu correspondente em MD5 e
aí sim, consultar o banco de dados usando SQL.
No menu lateral esquerdo do projeto, dê dois cliques em ProjetoBD Source Packages
projetobd frmLogin e altere o código para ficar como na Listagem 10.9, inserindo a linha 18 e
alterando a linha 119.
Listagem 10.9: Classe frmLogin com MD5
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package projetobd ;
7
8 import java . sql .*;
9 import javax . swing . JOptionPane ;
10
11 /* *
12 *
13 * @author dcc
14 */
15 public class frmLogin extends javax . swing . JFrame {
16
17 ConexaoSQL objCon = new ConexaoSQL () ;
18 md5 objMD5 = new md5 () ;
19
20 /* *
21 * Creates new form frmLogin
22 */
23 public frmLogin () {
24 initComponents () ;
25
26 setResizable ( false ) ;
27 setLocationRelativeTo ( null ) ;
28 }
29
30 /* *
31 * This method is called from within the constructor to initialize the form .
32 * WARNING : Do NOT modify this code . The content of this method is always
33 * regenerated by the Form Editor .
34 */
35 @SuppressWarnings ( " unchecked " )
36 // < editor - fold defaultstate =" collapsed " desc =" Generated Code " >
37 private void initComponents () {
38
39 jLabel1 = new javax . swing . JLabel () ;
40 jLabel2 = new javax . swing . JLabel () ;
41 jTextField1 = new javax . swing . JTextField () ;
42 jPasswordField1 = new javax . swing . JPasswordField () ;
43 jButton1 = new javax . swing . JButton () ;
44 jButton2 = new javax . swing . JButton () ;
45
46 setDefaultCloseOperation ( javax . swing . WindowConstants . EXIT_ON_CLOSE ) ;
47
48 jLabel1 . setText ( " Usu á rio : " ) ;
49
82 Capítulo 10. Trabalhando com JFrame e MySQL
Se você executar o programa novamente agora e na janela de login (Figura 10.23) entrar com
usuário root e senha root, verá que o usuário é válido desta vez. Isto está correto, pois agora
nossa janela de login criptografa a propriedade text informada em jPasswordField1 usando
StringToMD5() da nossa classe md5 num hash MD5 antes de comparar com a senha salva na
tabela usuarios (lembre que havíamos alterado anteriormente a senha de root para o hash MD5
63a9f0ea7bb98050796b649e85481845).
Acesse o phpMyAdmin e selecione o banco de dados BD. Clique na aba SQL e substitua o
código SQL (caso apareça) pelo código SQL abaixo:
1 CREATE TABLE ‘ alunos ‘ (
2 ‘ matricula ‘ int (11) NOT NULL ,
3 ‘ data_matricula ‘ timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,
4 ‘ nome ‘ varchar (60) NOT NULL ,
5 ‘ data_de_nascimento ‘ date NOT NULL ,
6 ‘ telefone ‘ varchar (20) NOT NULL ,
7 ‘ celular ‘ varchar (20) NOT NULL ,
8 ‘ email ‘ varchar (60) NOT NULL
9 ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ;
Clique no botão Salvar e a nova tabela será inserida no nosso banco de dados BD.
Basedo na seção Criando uma Janela de Login em ProjetoBD na página 75, crie um novo formulário
JFrame e chame-o de [Link]. Coloque um componente Menu Bar no formulário
e deixe-o com o seguinte aspecto:
Dê dois cliques em Arquivo Alunos (Figura 10.29) do formulário da tela principal e coloque
o seguinte código:
Listagem 10.10: Lista de imports
1 private void jMenuItem1ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 frmAlunos formAlunos = new frmAlunos () ;
3 formAlunos . setVisible ( true ) ;
4 }
Dê dois cliques em Arquivo Sair (Figura 10.29) do formulário da tela principal e coloque o
seguinte código:
Listagem 10.11: Lista de imports
1 private void jMenuItem2ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 System . exit (0) ;
3 }
Dê dois cliques em Ajuda Sobre (Figura 10.30) do formulário da tela principal e coloque o
seguinte código:
Listagem 10.12: Lista de imports
1 private void jMenuItem5ActionPerformed ( java . awt . event . ActionEvent evt ) {
86 Capítulo 10. Trabalhando com JFrame e MySQL
Limpar campos
Crie a função clearFields() como abaixo:
Listagem 10.16: Código da função clearFields()
1 private void clearFields () {
2 jTextField1 . setText ( " " ) ;
3 jTextField2 . setText ( " " ) ;
4 jTextField3 . setText ( " " ) ;
5 jTextField4 . setText ( " " ) ;
6 jTextField5 . setText ( " " ) ;
7 jTextField6 . setText ( " " ) ;
8 }
Cadastrar (Create)
Dê dois cliques no botão Salvar e coloque o seguinte código:
Listagem 10.18: Código do botão Salvar
1 private void jButton1ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 Connection conn = null ;
3 PreparedStatement pstm = null ;
4
5 // Classe que vai recuperar os dados do banco de dados
6 ResultSet rset = null ;
7
8 String query = " INSERT INTO alunos ( matricula , data_matricula , nome ,
data_de_nascimento , telefone , celular , email ) VALUES (? , ? , ? , ? , ? , ? , ?) " ;
9
10 try {
11 // Cria uma conex ã o com o banco
12 conn = ConexaoSQL . createConnectionToMySQL () ;
13
14 // Cria um PreparedStatment , classe usada para executar a query
15 pstm = conn . prepareStatement ( query ) ;
16
17 pstm . setLong (1 , Long . parseLong ( jTextField1 . getText () ) ) ; // matricula
18 pstm . setDate (2 , java . sql . Date . valueOf ( jTextField3 . getText () ) ) ; // data_matricula
19 pstm . setString (3 , jTextField2 . getText () ) ; // nome
20 pstm . setDate (4 , java . sql . Date . valueOf ( jTextField3 . getText () ) ) ; // data_de_nascimento
21 pstm . setString (5 , jTextField4 . getText () ) ; // telefone
22 pstm . setString (6 , jTextField5 . getText () ) ; // celular
23 pstm . setString (7 , jTextField6 . getText () ) ; // email
24
25 // Executa a sql para inser ç ã o dos dados
26 pstm . executeUpdate () ;
27
28 pstm . close () ;
29
30 conn . close () ;
31
32 } catch ( SQLException se ) {
33 System . out . println ( se . getMessage () ) ;
34 } catch ( Exception ex ) {
35 System . out . println ( ex . getMessage () ) ;
36 } finally {
37 // Fecha as conex õ es
38 try {
39 if ( pstm != null ) {
40 pstm . close () ;
41 }
42 if ( conn != null ) {
43 conn . close () ;
10.6 Editando os Dados na Tabela Alunos - CRUD 89
44 }
45 } catch ( SQLException e ) {
46 System . out . println ( e . getMessage () ) ;
47 }
48 }
49 }
Excluir (Remove)
Dê dois cliques no botão Excluir e coloque o seguinte código:
Listagem 10.19: Código do botão Excluir
1 private void jButton3ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 if ( jTextField1 . getText () . length () == 0) {
3 System . out . println ( " Erro : Matr í cula n ã o informada ! " ) ;
4 } else {
5 int dialogButton = JOptionPane . YES_NO_OPTION ;
6 JOptionPane . showConfirmDialog ( null , " Remover aluno com matr í cula " + jTextField1 .
getText () . toString () + " ? " , " Warning " , dialogButton ) ;
7
8 if ( dialogButton == JOptionPane . YES_OPTION ) {
9 // System . out . println (" Remover aluno com matr í cula " + jTextField1 . getText () .
toString () + "?") ;
10 Connection conn = null ;
11 PreparedStatement pstm = null ;
12
13 // Classe que vai recuperar os dados do banco de dados
14 ResultSet rset ;
15
16 // Executa a query de sele ç ã o
17 String query = " DELETE FROM alunos WHERE matricula =?; " ;
18
19 try {
20 // Cria uma conex ã o com o banco
21 conn = ConexaoSQL . createConnectionToMySQL () ;
22
23 pstm = conn . prepareStatement ( query ) ;
24
25 System . out . println ( jTextField1 . getText () ) ;
26
27 pstm . setLong (1 , Long . parseLong ( jTextField1 . getText () ) ) ; // matricula
28
29 System . out . println ( pstm . toString () ) ;
30
31 pstm . execute () ;
32
33 pstm . close () ;
34
35 conn . close () ;
36
37 } catch ( SQLException se ) {
38 System . out . println ( se . getMessage () ) ;
39 } catch ( Exception ex ) {
40 System . out . println ( ex . getMessage () ) ;
41 } finally {
42 // Fecha as conex õ es
43 try {
44 if ( pstm != null ) {
45 pstm . close () ;
46 }
47 if ( conn != null ) {
48 conn . close () ;
49 }
50 } catch ( SQLException e ) {
51 System . out . println ( e . getMessage () ) ;
52 }
53 }
54 }
55 }
56 }
90 Capítulo 10. Trabalhando com JFrame e MySQL
Esta função usa o código da Listagem 10.20 para trazer os dados de um aluno matriculado,
basta digitar a matrícula do aluno e pressionar a tecla F2 . Com um aluno sendo exibido, para
excluí-lo basta clicar no botão Excluir e ele será removido do banco de dados.
Atualizar (Update)
Para atualizar dados, dê um clique no campo de matrícula para selecioná-lo. Na janela de proprie-
dades (à direita no NetBeans), clique no botão Events , role as opções para baixo até encontrar a
opção keyPressed, Figura 10.33.
Note que na frente de keyPressed está escrito <none>, que significa que não há nenhum evento
keyPressed sendo monitorado. Vamos criar um evento de pressionar de teclas clicando duas vezes
sobre <none>. Na janela de código, digite o seguinte código:
Listagem 10.20: Código do evento keyPressed do campo de matrícula
1 private void jTextField1KeyPressed ( java . awt . event . KeyEvent evt ) {
2 if ( evt . getKeyCode () == 113) { // C ó digo da tecla F2
3 Connection conn = null ;
4 PreparedStatement pstm = null ;
5
6 // Classe que vai recuperar os dados do banco de dados
7 ResultSet rset ;
8
9 // Executa a query de sele ç ã o
10 String query = " SELECT * FROM alunos WHERE matricula =?; " ;
11
12 try {
13 // Cria uma conex ã o com o banco
14 conn = ConexaoSQL . createConnectionToMySQL () ;
15
16 pstm = conn . prepareStatement ( query ) ;
17
18 System . out . println ( jTextField1 . getText () ) ;
19
20 pstm . setLong (1 , Long . parseLong ( jTextField1 . getText () ) ) ; // matricula
21
22 System . out . println ( pstm . toString () ) ;
23
24 pstm . executeQuery () ;
25
26 rset = pstm . getResultSet () ;
27
28 // Mostra o aluno na tela
29 if ( rset . next () ) {
30 jTextField2 . setText ( rset . getString ( " nome " ) ) ;
31 jTextField3 . setText ( rset . getString ( " data_de_nascimento " ) ) ;
32 jTextField4 . setText ( rset . getString ( " telefone " ) ) ;
33 jTextField5 . setText ( rset . getString ( " celular " ) ) ;
10.6 Editando os Dados na Tabela Alunos - CRUD 91
Assim que os dados forem mostrados é só alterá-los e clicar no botão Salvar para gravar as
alterações.
Listar (Display)
Listagem 10.21: Código do botão Listar
1 private void jButton4ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 Connection conn = null ;
3 PreparedStatement pstm = null ;
4
5 // Classe que vai recuperar os dados do banco de dados
6 ResultSet rset = null ;
7
8 // Executa a query de sele ç ã o
9 String query = " SELECT * FROM alunos " ;
10
11 try {
12 // Cria uma conex ã o com o banco
13 conn = ConexaoSQL . createConnectionToMySQL () ;
14
15 pstm = conn . prepareStatement ( query ) ;
16 pstm . executeQuery ( query ) ;
17 rset = pstm . getResultSet () ;
18
19 // Lista os alunos no console
20 while ( rset . next () ) {
21 System . out . print ( rset . getString ( " matricula " ) + " , " ) ;
22 System . out . print ( rset . getString ( " nome " ) + " , " ) ;
23 System . out . println ( rset . getString ( " email " ) ) ;
24 }
25
26 } catch ( SQLException se ) {
27 System . out . println ( se . getMessage () ) ;
28 } catch ( Exception ex ) {
29 System . out . println ( ex . getMessage () ) ;
30 } finally {
31 // Fecha as conex õ es
32 try {
33 if ( pstm != null ) {
92 Capítulo 10. Trabalhando com JFrame e MySQL
34 pstm . close () ;
35 }
36 if ( conn != null ) {
37 conn . close () ;
38 }
39 } catch ( SQLException e ) {
40 System . out . println ( e . getMessage () ) ;
41 }
42 }
43 }
Por simplicidade, optou-se por uma listagem simples no console do NetBeans (Figura 10.34).
28
29 /* *
30 * Creates new form frmAlunos
31 */
32 public frmAlunos () {
33 initComponents () ;
34
35 setResizable ( false ) ;
36 setLocationRelativeTo ( null ) ;
37 }
38
39 /* *
40 * This method is called from within the constructor to initialize the form .
41 * WARNING : Do NOT modify this code . The content of this method is always
42 * regenerated by the Form Editor .
43 */
44 @SuppressWarnings ( " unchecked " )
45 // < editor - fold defaultstate =" collapsed " desc =" Generated Code " >
46 private void initComponents () {
47
48 jLabel1 = new javax . swing . JLabel () ;
49 jTextField1 = new javax . swing . JTextField () ;
50 jLabel2 = new javax . swing . JLabel () ;
51 jTextField2 = new javax . swing . JTextField () ;
52 jLabel3 = new javax . swing . JLabel () ;
53 jTextField3 = new javax . swing . JTextField () ;
54 jLabel4 = new javax . swing . JLabel () ;
55 jTextField4 = new javax . swing . JTextField () ;
56 jLabel5 = new javax . swing . JLabel () ;
57 jTextField5 = new javax . swing . JTextField () ;
58 jLabel6 = new javax . swing . JLabel () ;
59 jTextField6 = new javax . swing . JTextField () ;
60 jButton2 = new javax . swing . JButton () ;
61 jButton3 = new javax . swing . JButton () ;
62 jButton4 = new javax . swing . JButton () ;
63 jButton1 = new javax . swing . JButton () ;
64 jLabel7 = new javax . swing . JLabel () ;
65
66 setTitle ( " Aluno " ) ;
67
68 jLabel1 . setText ( " Matr í cula : " ) ;
69
70 jTextField1 . setToolTipText ( " Formato de matr í cula : aaaa99 ( Ex .: 202001) " ) ;
71 jTextField1 . addActionListener ( new java . awt . event . ActionListener () {
72 public void actionPerformed ( java . awt . event . ActionEvent evt ) {
73 jTextField1ActionPerformed ( evt ) ;
74 }
75 }) ;
76 jTextField1 . addKeyListener ( new java . awt . event . KeyAdapter () {
77 public void keyPressed ( java . awt . event . KeyEvent evt ) {
78 jTextField1KeyPressed ( evt ) ;
79 }
80 }) ;
81
82 jLabel2 . setText ( " Nome : " ) ;
83
84 jLabel3 . setText ( " Data de nascimento : " ) ;
85
86 jTextField3 . setToolTipText ( " yyyy - mm - dd " ) ;
87
88 jLabel4 . setText ( " Telefone : " ) ;
89
90 jLabel5 . setText ( " Celular : " ) ;
91
92 jLabel6 . setText ( "E - mail : " ) ;
93
94 jButton2 . setText ( " Salvar " ) ;
95 jButton2 . addActionListener ( new java . awt . event . ActionListener () {
96 public void actionPerformed ( java . awt . event . ActionEvent evt ) {
97 jButton2ActionPerformed ( evt ) ;
94 Capítulo 10. Trabalhando com JFrame e MySQL
98 }
99 }) ;
100
101 jButton3 . setText ( " Excluir " ) ;
102 jButton3 . addActionListener ( new java . awt . event . ActionListener () {
103 public void actionPerformed ( java . awt . event . ActionEvent evt ) {
104 jButton3ActionPerformed ( evt ) ;
105 }
106 }) ;
107
108 jButton4 . setText ( " Listar " ) ;
109 jButton4 . addActionListener ( new java . awt . event . ActionListener () {
110 public void actionPerformed ( java . awt . event . ActionEvent evt ) {
111 jButton4ActionPerformed ( evt ) ;
112 }
113 }) ;
114
115 jButton1 . setText ( " Limpar campos " ) ;
116 jButton1 . addActionListener ( new java . awt . event . ActionListener () {
117 public void actionPerformed ( java . awt . event . ActionEvent evt ) {
118 jButton1ActionPerformed ( evt ) ;
119 }
120 }) ;
121
122 jLabel7 . setFont ( new java . awt . Font ( " Lucida Grande " , 2 , 8) ) ; // NOI18N
123 jLabel7 . setForeground ( new java . awt . Color (255 , 0 , 0) ) ;
124 jLabel7 . setText ( " Pressione F2 neste campo para buscar uma matr í cula informada . " ) ;
125
126 javax . swing . GroupLayout layout = new javax . swing . GroupLayout ( getContentPane () ) ;
127 getContentPane () . setLayout ( layout ) ;
128 layout . setHorizontalGroup (
129 layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . LEADING )
130 . addGroup ( layout . createSequentialGroup ()
131 . addGap (14 , 14 , 14)
132 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . TRAILING )
133 . addGroup ( layout . createSequentialGroup ()
134 . addComponent ( jButton1 )
135 . addGap (18 , 18 , 18)
136 . addComponent ( jButton2 )
137 . addGap (18 , 18 , 18)
138 . addComponent ( jButton3 )
139 . addGap (18 , 18 , 18)
140 . addComponent ( jButton4 ) )
141 . addGroup ( layout . createSequentialGroup ()
142 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . LEADING )
143 . addComponent ( jLabel6 , javax . swing . GroupLayout . Alignment . TRAILING )
144 . addComponent ( jLabel1 , javax . swing . GroupLayout . Alignment . TRAILING )
145 . addComponent ( jLabel2 , javax . swing . GroupLayout . Alignment . TRAILING )
146 . addComponent ( jLabel3 , javax . swing . GroupLayout . Alignment . TRAILING )
147 . addComponent ( jLabel4 , javax . swing . GroupLayout . Alignment . TRAILING ) )
148 . addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement . RELATED )
149 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . LEADING ,
false )
150 . addComponent ( jTextField6 )
151 . addGroup ( layout . createSequentialGroup ()
152 . addComponent ( jTextField1 , javax . swing . GroupLayout . PREFERRED_SIZE , 103 , javax . swing .
GroupLayout . PREFERRED_SIZE )
153 . addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement . RELATED )
154 . addComponent ( jLabel7 ) )
155 . addComponent ( jTextField2 )
156 . addComponent ( jTextField3 , javax . swing . GroupLayout . PREFERRED_SIZE , 98 , javax . swing .
GroupLayout . PREFERRED_SIZE )
157 . addGroup ( layout . createSequentialGroup ()
158 . addComponent ( jTextField4 , javax . swing . GroupLayout . PREFERRED_SIZE , 184 , javax . swing .
GroupLayout . PREFERRED_SIZE )
159 . addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement . RELATED , javax . swing .
GroupLayout . DEFAULT_SIZE , Short . MAX_VALUE )
160 . addComponent ( jLabel5 )
161 . addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement . RELATED )
162 . addComponent ( jTextField5 , javax . swing . GroupLayout . PREFERRED_SIZE , 184 , javax . swing .
10.7 Listagem completa da classe frmAlunos 95
GroupLayout . PREFERRED_SIZE ) ) ) ) )
163 . addContainerGap ( javax . swing . GroupLayout . DEFAULT_SIZE , Short . MAX_VALUE ) )
164 );
165 layout . setVerticalGroup (
166 layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . LEADING )
167 . addGroup ( layout . createSequentialGroup ()
168 . addGap (11 , 11 , 11)
169 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
170 . addComponent ( jLabel1 )
171 . addComponent ( jTextField1 , javax . swing . GroupLayout . PREFERRED_SIZE , javax . swing .
GroupLayout . DEFAULT_SIZE , javax . swing . GroupLayout . PREFERRED_SIZE )
172 . addComponent ( jLabel7 ) )
173 . addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement . UNRELATED )
174 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
175 . addComponent ( jLabel2 )
176 . addComponent ( jTextField2 , javax . swing . GroupLayout . PREFERRED_SIZE , javax . swing .
GroupLayout . DEFAULT_SIZE , javax . swing . GroupLayout . PREFERRED_SIZE ) )
177 . addGap (18 , 18 , 18)
178 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
179 . addComponent ( jLabel3 )
180 . addComponent ( jTextField3 , javax . swing . GroupLayout . PREFERRED_SIZE , javax . swing .
GroupLayout . DEFAULT_SIZE , javax . swing . GroupLayout . PREFERRED_SIZE ) )
181 . addGap (18 , 18 , 18)
182 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
183 . addComponent ( jLabel4 )
184 . addComponent ( jTextField4 , javax . swing . GroupLayout . PREFERRED_SIZE , javax . swing .
GroupLayout . DEFAULT_SIZE , javax . swing . GroupLayout . PREFERRED_SIZE )
185 . addComponent ( jLabel5 )
186 . addComponent ( jTextField5 , javax . swing . GroupLayout . PREFERRED_SIZE , javax . swing .
GroupLayout . DEFAULT_SIZE , javax . swing . GroupLayout . PREFERRED_SIZE ) )
187 . addGap (18 , 18 , 18)
188 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
189 . addComponent ( jLabel6 )
190 . addComponent ( jTextField6 , javax . swing . GroupLayout . PREFERRED_SIZE , javax . swing .
GroupLayout . DEFAULT_SIZE , javax . swing . GroupLayout . PREFERRED_SIZE ) )
191 . addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement . RELATED , 36 , Short .
MAX_VALUE )
192 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
193 . addComponent ( jButton2 )
194 . addComponent ( jButton3 )
195 . addComponent ( jButton4 )
196 . addComponent ( jButton1 ) )
197 . addContainerGap () )
198 );
199
200 pack () ;
201 } // </ editor - fold >
202
203 private void clearFields () {
204 jTextField1 . setText ( " " ) ;
205 jTextField2 . setText ( " " ) ;
206 jTextField3 . setText ( " " ) ;
207 jTextField4 . setText ( " " ) ;
208 jTextField5 . setText ( " " ) ;
209 jTextField6 . setText ( " " ) ;
210 }
211
212 private void jButton2ActionPerformed ( java . awt . event . ActionEvent evt ) {
213 Connection conn = null ;
214 PreparedStatement pstm = null ;
215
216 // Classe que vai recuperar os dados do banco de dados
217 ResultSet rset = null ;
218
219 String query = " INSERT INTO alunos ( matricula , data_matricula , nome ,
data_de_nascimento , telefone , celular , email ) VALUES (? , ? , ? , ? , ? , ? , ?) " ;
220
221 try {
222 // Cria uma conex ã o com o banco
223 conn = ConexaoSQL . createConnectionToMySQL () ;
96 Capítulo 10. Trabalhando com JFrame e MySQL
224
225 // Cria um PreparedStatment , classe usada para executar a query
226 pstm = conn . prepareStatement ( query ) ;
227
228 pstm . setLong (1 , Long . parseLong ( jTextField1 . getText () ) ) ; // matricula
229 pstm . setDate (2 , java . sql . Date . valueOf ( jTextField3 . getText () ) ) ; // data_matricula
230 pstm . setString (3 , jTextField2 . getText () ) ; // nome
231 pstm . setDate (4 , java . sql . Date . valueOf ( jTextField3 . getText () ) ) ; //
data_de_nascimento
232 pstm . setString (5 , jTextField4 . getText () ) ; // telefone
233 pstm . setString (6 , jTextField5 . getText () ) ; // celular
234 pstm . setString (7 , jTextField6 . getText () ) ; // email
235
236 // Executa a sql para inser ç ã o dos dados
237 pstm . executeUpdate () ;
238
239 pstm . close () ;
240
241 conn . close () ;
242
243 } catch ( SQLException se ) {
244 System . out . println ( se . getMessage () ) ;
245 } catch ( Exception ex ) {
246 System . out . println ( ex . getMessage () ) ;
247 } finally {
248 // Fecha as conex õ es
249 try {
250 if ( pstm != null ) {
251 pstm . close () ;
252 }
253 if ( conn != null ) {
254 conn . close () ;
255 }
256 } catch ( SQLException e ) {
257 System . out . println ( e . getMessage () ) ;
258 }
259 }
260 }
261
262 private void jTextField1ActionPerformed ( java . awt . event . ActionEvent evt ) {
263 // TODO add your handling code here :
264 }
265
266 private void jButton3ActionPerformed ( java . awt . event . ActionEvent evt ) {
267 if ( jTextField1 . getText () . length () == 0) {
268 System . out . println ( " Erro : Matr í cula n ã o informada ! " ) ;
269 } else {
270 int dialogButton = JOptionPane . YES_NO_OPTION ;
271 JOptionPane . showConfirmDialog ( null , " Remover aluno com matr í cula " + jTextField1 .
getText () . toString () + " ? " , " Warning " , dialogButton ) ;
272
273 if ( dialogButton == JOptionPane . YES_OPTION ) {
274 // System . out . println (" Remover aluno com matr í cula " + jTextField1 . getText () .
toString () + "?") ;
275 Connection conn = null ;
276 PreparedStatement pstm = null ;
277
278 // Classe que vai recuperar os dados do banco de dados
279 ResultSet rset ;
280
281 // Executa a query de sele ç ã o
282 String query = " DELETE FROM alunos WHERE matricula =?; " ;
283
284 try {
285 // Cria uma conex ã o com o banco
286 conn = ConexaoSQL . createConnectionToMySQL () ;
287
288 pstm = conn . prepareStatement ( query ) ;
289
290 System . out . println ( jTextField1 . getText () ) ;
10.7 Listagem completa da classe frmAlunos 97
291
292 pstm . setLong (1 , Long . parseLong ( jTextField1 . getText () ) ) ; // matricula
293
294 System . out . println ( pstm . toString () ) ;
295
296 pstm . execute () ;
297
298 pstm . close () ;
299
300 conn . close () ;
301
302 } catch ( SQLException se ) {
303 System . out . println ( se . getMessage () ) ;
304 } catch ( Exception ex ) {
305 System . out . println ( ex . getMessage () ) ;
306 } finally {
307 // Fecha as conex õ es
308 try {
309 if ( pstm != null ) {
310 pstm . close () ;
311 }
312 if ( conn != null ) {
313 conn . close () ;
314 }
315 } catch ( SQLException e ) {
316 System . out . println ( e . getMessage () ) ;
317 }
318 }
319 }
320 }
321 }
322
323 private void jButton4ActionPerformed ( java . awt . event . ActionEvent evt ) {
324 Connection conn = null ;
325 PreparedStatement pstm = null ;
326
327 // Classe que vai recuperar os dados do banco de dados
328 ResultSet rset = null ;
329
330 // Executa a query de sele ç ã o
331 String query = " SELECT * FROM alunos " ;
332
333 try {
334 // Cria uma conex ã o com o banco
335 conn = ConexaoSQL . createConnectionToMySQL () ;
336
337 pstm = conn . prepareStatement ( query ) ;
338 pstm . executeQuery ( query ) ;
339 rset = pstm . getResultSet () ;
340
341 // Lista os alunos no console
342 while ( rset . next () ) {
343 System . out . print ( rset . getString ( " matricula " ) + " , " ) ;
344 System . out . print ( rset . getString ( " nome " ) + " , " ) ;
345 System . out . println ( rset . getString ( " email " ) ) ;
346 }
347
348 } catch ( SQLException se ) {
349 System . out . println ( se . getMessage () ) ;
350 } catch ( Exception ex ) {
351 System . out . println ( ex . getMessage () ) ;
352 } finally {
353 // Fecha as conex õ es
354 try {
355 if ( pstm != null ) {
356 pstm . close () ;
357 }
358 if ( conn != null ) {
359 conn . close () ;
360 }
98 Capítulo 10. Trabalhando com JFrame e MySQL
431 }
432 }
433
434 /* *
435 * @param args the command line arguments
436 */
437 public static void main ( String args []) {
438 /* Set the Nimbus look and feel */
439 // < editor - fold defaultstate =" collapsed " desc =" Look and feel setting code ( optional )
">
440 /* If Nimbus ( introduced in Java SE 6) is not available , stay with the default look
and feel .
441 * For details see http :// download . oracle . com / javase / tutorial / uiswing / lookandfeel /
plaf . html
442 */
443 try {
444 for ( javax . swing . UIManager . LookAndFeelInfo info : javax . swing . UIManager .
getInstalledLookAndFeels () ) {
445 if ( " Nimbus " . equals ( info . getName () ) ) {
446 javax . swing . UIManager . setLookAndFeel ( info . getClassName () ) ;
447 break ;
448 }
449 }
450 } catch ( ClassNotFoundException ex ) {
451 java . util . logging . Logger . getLogger ( frmAlunos . class . getName () ) . log ( java . util .
logging . Level . SEVERE , null , ex ) ;
452 } catch ( InstantiationException ex ) {
453 java . util . logging . Logger . getLogger ( frmAlunos . class . getName () ) . log ( java . util .
logging . Level . SEVERE , null , ex ) ;
454 } catch ( IllegalAccessException ex ) {
455 java . util . logging . Logger . getLogger ( frmAlunos . class . getName () ) . log ( java . util .
logging . Level . SEVERE , null , ex ) ;
456 } catch ( javax . swing . UnsupportedLookAndFeelException ex ) {
457 java . util . logging . Logger . getLogger ( frmAlunos . class . getName () ) . log ( java . util .
logging . Level . SEVERE , null , ex ) ;
458 }
459 // </ editor - fold >
460
461 /* Create and display the form */
462 java . awt . EventQueue . invokeLater ( new Runnable () {
463 public void run () {
464 new frmAlunos () . setVisible ( true ) ;
465 }
466 }) ;
467 }
468
469 // Variables declaration - do not modify
470 private javax . swing . JButton jButton1 ;
471 private javax . swing . JButton jButton2 ;
472 private javax . swing . JButton jButton3 ;
473 private javax . swing . JButton jButton4 ;
474 private javax . swing . JLabel jLabel1 ;
475 private javax . swing . JLabel jLabel2 ;
476 private javax . swing . JLabel jLabel3 ;
477 private javax . swing . JLabel jLabel4 ;
478 private javax . swing . JLabel jLabel5 ;
479 private javax . swing . JLabel jLabel6 ;
480 private javax . swing . JLabel jLabel7 ;
481 private javax . swing . JTextField jTextField1 ;
482 private javax . swing . JTextField jTextField2 ;
483 private javax . swing . JTextField jTextField3 ;
484 private javax . swing . JTextField jTextField4 ;
485 private javax . swing . JTextField jTextField5 ;
486 private javax . swing . JTextField jTextField6 ;
487 // End of variables declaration
488 }
VI
Conclusão
11 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . 103
11.1 O que você aprendeu
11.2 Melhorias
Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . 105
Livros
Artigos
11. Conclusão
11.2 Melhorias
Este não é um programa muito bom, mas arranhou a superfície do que é programar em Java,
porém há muito a melhorar. Algumas coisas que você pode tentar fazer por conta própria são:
1. Na seção Listar (Display) (página 91), a lista poderia ser exibida em outro formulário e não
no console do NetBeans. A alteração ocorreria na Listagem 10.21 substituindo as linhas de
20 até 24 por uma chamada ao formulário que mostraria a listagem dos alunos.
2. A data de matrícula do aluno tem de ser fornecida no formato aaaa-mm-dd, formato norte-
americano. Uma sugestão seria fazer a localização para o Brasil, para que as datas fossem
fornecidas no formato dd-mm-aaaa.
Bibliografia
Livros
Artigos