Quem sou eu?

DAniel Oliveira Araújo

  • Graduado em  Tecnologia em Telemática no IFCE
  • Instrutor Java na UTD desde 2016
  • Instrutor E-Jovem entre 2015 - 2017

Daniel Oliveira Araújo

  • Sou ciclista urbano
  • Troquei o conforto do ônibus pela prazer da bicicleta

Agora

Quem São Vocês?

O que vamos ver no nosso Curso

  • Revisão de algoritmo
  • Origem da linguagem Java
  • Conceitos básicos de java
  • Variáveis primitivas
  • Estrutura de fluxo
  • Orientação a Objetos
    • Arrays
    • Modificadores de Acesso
    • Herança
    • Polimorfismo
    • Classes abstratas
    • Interface
  • Controle de Erros

O que vamos ver no nosso Curso

  • Collection Framework
  • Interface Gráfica
  • Serialização de arquivos
  • Eventos
  • GIT
  • UML
  • Banco de Dados MySQL
  • JDBC
  • Hibernate
  • Projeto Final

Contato

Contato

  • danieloliveira14@gmail.com
  • https://github.com/Pakato14

Material de Apoio

  • http://blog.triadworks.com.br/
  • https://www.caelum.com.br/apostilas
  • Traga o pen drive
  • http://www.cursoemvideo.com/
  • https://loiane.training/

Aula 01

O que é uma linguagem java?

Você sabe como funciona um computador?

Disco rígido

  • Possui a principal função de armazenar dados. Também chamados de HDs ou Winchester, o seu conteúdo é persistente, ou seja, não é descartado quando desligado.

memória RAM

  • Possui a principal função de armazenar dados, porém o acesso e o armazenamento é bem mais rápidos do que nos HDs.

Unidade central de processamento - cpu

  • Responsável em executar as operações lógicas e aritméticas. Ela é composta pela Unidade de Controle (UC), Unidade Lógica (ULA) e por Registradores.
  • A UC copia uma operação de um programa armazenado na memória RAM e guarda os dados nos Registradores.
  • A ULA executa a operação acessando os dados armazenados no Registradores onde também guarda os guardas.

Linguagem dos computaores

  • Qual o idioma que o computador compreende?

Caracteres

  • Os caracteres também são definidos em formato binário.
  • Cada caractere é associado a um valor numérico inteiro.
  • Eles são mapeados através de padrões como ASCII.

Programa

  • São instruções para o computador executar uma determinada tarefa.
  • Essas tarefas são executadas através de sequência de comandos.
  • As instruções dependem da arquitetura do processador.

O que é java?

  • Java é uma linguagem de programação desenvolvida pela SUN (Hoje pertencente a Oracle) com o objetivo de manter o poder
    computacional de C++, agregando características de segurança, robusteza e portabilidade.
  • A linguagem é orientada a objetos, fortemente tipada, independente de arquitetura, robusta, segura, portável, bem estruturada, suporta programação distribuída, multithreaded e conta com garbage collection.

Um pouco de história

  • O Java foi desenvolvido por James Gosling lider do projeto Green Team da Sun Microsystems , projeto este responsável pelas inovações tecnológicas da empresa.
  • O time teve a ideia de criar um interpretador para pequenos dispositivos, facilitando a reescrita de softŸware para aparelhos eletrônicos, como vídeo cassete, televisão e aparelhos de TV a cabo.

Linguagem OAK

  • Antes de ser chamada de Java, a linguagem possuia outro nome, se chamava Oak (Carvalho) referente há um jarro da planta que James Gosling posuia em sua janela no escritório.
  • Mas já existia uma linguagem com esse nome e depois mudaram o nome para Java em referência a ilha de Java na Polinésia Francesa.

Desenvolvimento da linguagem

  • Desenvolver software para aparelhos eletrônicos não deu muito certo. 
  • Tentaram fechar diversos contratos com grandes fabricantes de eletrônicos, como Panasonic, mas não houve êxito devido ao conflito de interesses e custos.
  • Com o advento da web, a Sun percebeu que poderia utilizar a ideia para rodar pequenas aplicações dentro do browser. A semelhança era que na internet havia uma grande quantidade de sistemas operacionais e browsers, e com isso seria grande vantagem poder programar numa única linguagem, independente da plataforma.

Applet Java

  • Applet: é um pequeno software que executa uma atividade específica, dentro de outro programa, geralmente como um Plugin. Geralmente têm algum tipo de interface de usuário ou fazem parte de uma destas dentro de uma página web.
  • Os Applets Java podem rodar em um web browser usando uma JVM (Java Virtual Machine).
  • Applets em Java podem adicionar recursos que não são possíveis em HTML.
  • Comparando com o Javascript, as appçets Java possuem a vantagem de serem independentes do Sistema Operacional, Por outro lado são processados mais lentamente.

Novos Rumos

  • Em 2009 a Oracle comprou a Sun Microsystems fortalecando a marca. O desenvolvimento de appplets foi deixado de lado e o foco maior ficou no desenvovimento de aplicações no lado do servidor.
  • Veja a seguinte observação:

Código binário para windows

Código binário para linux

Sistema Operacional Windows

Sistema Operacional Linux

Temos um código executável para cada sistema operacional. É necessário compilar uma vez para Windows, outra para o Linux, e assim por diante, caso a gente queira que esse nosso softŸware possa ser utilizado em várias plataformas. 

Máquina Virtual

Máquina Virtual

  • As aplicações se utilizam das bibliotecas do sistema operacional, como, por exemplo, a de interface gráfica para desenhar as “telas”. A biblioteca de interface gráfica do Windows é bem diferente das do Linux: como criar então uma aplicação que rode de forma parecida nos dois sistemas operacionais? 
  • O Java utiliza do conceito de máquina virtual, onde existe, entre o sistema operacional e a aplicação, uma camada extra responsável por “traduzir” o que sua aplicação deseja fazer para as respectivas chamadas do sistema operacional onde ela está rodando no momento

Máquina Virtual

Código binário para Windows

Código binário para linux

Máquina Virtual Java

Sistema Operacional Windows

Sistema Operacional Linux

Máquina Virtual

  • Dessa forma, a maneira com a qual você abre uma janela no Linux ou no Windows é a mesma: você ganha independência de sistema operacional. Ou, melhor ainda, independência de plataforma em geral: não é preciso se preocupar em qual sistema operacional sua aplicação está rodando, nem em que tipo de máquina, configurações, etc.
  • Sua aplicação roda sem nenhum envolvimento como sistema operacional! Sempre conversando apenas com a Java Virtual Machine (JVM).
  • A JVM, ela pode decidir onde é melhor alocar a memória, entre outros. Uma JVM isola totalmente a aplicação do sistema operacional. Se uma JVM termina abruptamente, só as aplicações que estavam rodando nela irão terminar: isso não afetará outras JVMs que estejam rodando no mesmo computador, nem afetará o sistema operacional.

Write once, run anywhere 

Escreva uma vez, execute em qualquer lugar

Ambientes e ferramentas de Desenvolvimento Java

  • A tecnologia java fornece como ambiente de desenvolvimento um grande conjunto de ferramentas que engloba: um compilador, um interpretador, um gerador de documentação, ferramenta de empacotamento de classes de arquivos e outros

Java Runtime Evironment (JRE)

  • Ambiente de execução Java, formado pela JVM e bibliotecas, tudo que você precisa para executar uma aplicação Java

Java Virtual Machine (Jvm)

  • É a máquina virtual Java, ela é instalada junto com a JRE

Java Development Kit (JDK)

  • É um pacote para desenvolvedores programarem suas aplicações em Java, possuindo vários utilitários, inclusive compilador e bibliotecas.

Meu Primeiro Programa Java

  • Para compilar e executar um programa Java, devemos construir um arquivo com o código fonte que deve ter uma extensão .java. Em seguida um arquivo .class é gerado. Este arquivo é um bytecode  no qual será lido e executado pela máquina virtual (JVM).

Verificar se o Java está instalado

javac -version
  • Abra o Teminal de seu computador e digite o comando abaixo:
java -version
  • Para verificar a versão da máquina virtual, digite o comando abaixo:

Meu Primeiro Programa Java

public class Hello World {
    public static void main(String[] args) {
        System.out.println("Hello World!");
        }
    }
  1. Salve o arquivo como HelloWorld.java
  2. Abra o terminal e execute o seguinte comando javac HelloWorld.java
  3. Se não aconteceu nada é porque funcionou não se preocupe
  4. Em seguida execute o seguinte comando no terminal java HelloWorld
  5. Observe o Resultado

Integrated Development Environment (IDE)

  • É um programa de computador que reune características e ferramentas de apoio ao desenvolvimento de software com objetivo de agilizar este processo.

NetBeans

  • É um ambiente de desenvolvimento integrado e está disponível para Windows, Mac e Linux. O projeto NetBeans consiste em um IDE de códigofonte aberto e uma plataforma de aplicações que
    permitem que os desenvolvedores criem rapidamente aplicativos web, corporativos, desktop e aplicações móveis 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 documentação e
    treinamento de recursos, bem como uma diversificada seleção de terceiros plugins .

Eclipse

  • É uma IDE para o desenvolvimento aplicações Java, ele também pode ser usado para o desenvolvimento de aplicações utilizando outras linguagens como PHP, C++, etc. O Ambiente de desenvolvimento multilinguagens de programação cujo projeto é patrocinado pela IBM.

Bluej

  • BlueJ é um ambiente de desenvolvimento java projetado especificamente para o ensino em um nível introdutório. BlueJ foi projetado e implementado pelas equipes das universidades Monash.
  • O BlueJ é um excelente ambiente para o fim a que se destina: a aprendizagem da programação orientada pelos objetos utilizando a linguagem Java. 

Aula 02

Variáveis primitivas e controle de fluxo

Operadores

Produzem novos valores a partir de um ou mais valores. O resultado da
maioria das operações é um valor boleano ou numérico.

Operadores de comparação

  • São utilizados dois operadores de comparação(chamados também 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.
int x = 21;
int y = 21;

if(x == y){
    System.out.println("O Valor de x é igual ao valor de Y");
}

Incremento e decremento

  • São os operadores que nos permitem incrementar as variáveis em uma unidade. Podem ser usados diante ou atrás da variável dependendo das necessidades, ou seja, se precisarmos que se incremente ou vice-versa antes de utilizar ou o contrário.
int x = 5;
int y = 7

++x;
System.out.println("Pré incremento");

x++;
System.out.println("Pós incremento");

--y;
System.out.println("Pré decremento");

y--;
System.out.println("Pós decremento");

Atividade de Fixação

  • Digite o código abaixo e executem e observem o resultado:
public class Incremento {
    public static void main(String[] args) {
        int x = 5;
        int y = 7;

        ++x;
        System.out.println("O Valor de X no pré incremento é: "+x);

        x++;
        System.out.println("O Valor de X no pós incremento é: "+x);
        
        --y;
        System.out.println("O Valor de Y no pré deremento é: "+y);
        
        y--;
        System.out.println("O Valor de Y no pós decremento é: "+y);
        }
    }

Declarando e usando variáveis

  • Podemos declarar variáveis e usá-las. Em Java, toda variável tem um tipo que não pode ser mudado, uma vez que declarado:
tipoDaVariavel nomeDaVariavel;

int idade;

idade = 15;

System.out.println(idade);

Tipos Primitivos

  • A linguagem Java utiliza oito tipos primitivos de dados e um tipo especial. Esses tipos primitivos podem ser utilizados para declarar constantes ou variáveis utilizadas em programas Java. Os tipos primitivos estão divididos em quatro categorias:
    • Lógicos
    • Textuais
    • Numéricos inteiros
    • Numéricos de ponto flutuante.

Tipos Primitivos

Valores Literais

  • Os valores inseridos diretamente no código fonte são chamados de valores literais.

Números inteiros

  • Números inteiros podem ser escritos nos formatos binário, octal, decimal e hexadecimal. A representação de um número em cada um desses formatos é uma sequência composta por um ou mais dígitos.
  • Para utilizar o formato binário, devemos acrescentar o prefixo 0b ou o prefixo 0B.
  • Para usar o formato octal, devemos acrescentar o prefixo 0.
  • Para utilizar o formato hexadecimal, devemos acrescentar o prefixo 0x ou o prefixo 0X.
  • Qualquer outra sequência formada por dígitos de 0 a 9 estará no formato decimal.

Números inteiros

int dia, mes, ano;

//dia 14
dia = 0b1110;

//mês 06 (junho)
mes = 0x6;

//ano de 1982
ano = 1982;

Números inteiros

  • Por padrão, os valores literais inteiros são considerados valores do tipo int . Para definir um valor literal inteiro do tipo long , devemos utilizar o sufixo L (éle maiúsculo) ou l (éle minúsculo).
// valor literal inteiro do tipo long
long a = 2147483648 L ;

Números reais

  • Por padrão, os valores literais reais são considerados valores do tipo double . Para definir um valor literal real do tipo float , devemos utilizar o sufixo F (éle maiúsculo) ou f (éle minúsculo).
// valor literal real do tipo float
float a = 19.09F;
float b = 19.09f;

caracteres

  • Caracteres literais são definidos dentro de aspas simples.
// valor literal do tipo caractere
char a = 'K';
//O código do caractere K
char b = 75;

Atividade de Revisão

  • Desenvolva um programa que calcula a média de uma escola, neste programa recebe quatro notas e retorna uma média das notas.

Atividade de Revisão

  • Insira uma variável do tipo String que armazena o nome do aluno e imprima na tela junto com a média.

Casting e promoção

  • Alguns valores são incompatíveis se você tentar fazer uma atribuição direta. Enquanto um número real costuma ser representado emuma variável do tipo double, tentar atribuir ele auma variável int não funciona.

Vamos fazer um teste

double d = 3.1415;
int i = d;

//Será que compila??

double d = 5; 
int i = d;

// E agora?

int i = 5;
double d2 = i;

Title Text

double d3 = 3.14;
int i = (int) d3;

long x = 10000;
int i = (int) x;
  • Às vezes, precisamos que um número quebrado seja arredondado e armazenado num número inteiro. Para fazer isso sem que haja o erro de compilação, é preciso ordenar que o número quebrado seja moldado (casted) como um número inteiro. Esse processo recebe o nome de casting.

Casting Possíveis

Controle de fluxo

  • As estruturas de controle definem a sequência de execução das instruções. Podem ser divididas em seleção, repetição e sequência. 

Comando if

Comando if

if (condicaoBooleana) {
codigo;
}

Exemplo

int idade = 15;
if (idade < 18) {
System.out.println("Não pode entrar");
}

Comando If-Else

Exemplo

int idade = 15;
if (idade < 18) {
System.out.println("Não pode entrar");
} else {
System.out.println("Pode entrar");
}

operadores Lógicos

  • Expressões lógicas são aquelas que realizam uma operação lógica (ou, e, não, etc...) e retorna verdadeiro ou falso.

Exemplo

int idade = 15;
      boolean amigoDoDono = true;
      if (idade >= 18 | amigoDoDono == true) {
        System.out.println("Pode entrar");
      }
      else {
        System.out.println("Não pode entrar");
      }

While

  • É um comando usado para fazer um laço (loop), isto é, repetir um trecho de código algumas vezes. A ideia é que esse trecho de código seja repetido enquanto uma determinada condição permanecer verdadeira.
int idade = 15;
while (idade < 18) {
    System.out.println(idade);
    idade = idade + 1;
}

dO wHILE

  • A declaração dowhile é similar ao while. As instruções dentro do laço dowhile serão executadas pelo menos uma vez. Inicialmente, as instruções dentro do laço dowhile
    são executadas. Então, a condição na expressão lógica é avaliada. Se for verdadeira, as instruções dentro do laço dowhile serão executadas novamente.
int x = 0;
do {
    System.out.println("Loop do While");
    x++;
} while (x < 5);

Controle de fluxo

  • A ideia é a mesma do while: fazer um trecho de código ser repetido enquanto uma condição continuar verdadeira. Mas além disso, o for isola também um espaço para inicialização de variáveis e o modificador dessas variáveis. Isso faz com que quem mais legíveis, as variáveis que são relacionadas ao loop:
for (int i = 0; i < 10; i = i + 1) {
    System.out.println("olá!");
}
for (int i = x; i < y; i++) {
    if (i % 19 == 0) {
        System.out.println("Achei um número divisível por 19 entre x e y");
    break;
    }
}

Exercícios de Revisão

  1. Imprima todos os números de 150 a 300.
  2. Imprima a soma de 1 até 1000.
  3. Imprima todos os múltiplos de 3, entre 1 e 100.
  4. Imprima os primeiros números da série de Fibonacci até passar de 100. A série de Fibonacci é a seguinte: 0, 1, 1, 2, 3, 5, 8, 13, 21, etc... Para calculá-la, o primeiro elemento vale 0, o segundo vale 1, daí por diante, o n-ésimo elemento vale o (n-1)-ésimo elemento somado ao (n-2)-ésimo elemento (ex: 8 = 5 + 3).

Inserindo dados

  • Para facilitar a entrada de dados em um programa java. É utilizado a classe Scanner.
Scanner input = new Scanner(System.in);

String nome;
int idade;
				
System.out.println("Digite o seu nome: ");
nome = input.nextLine(); // armazena o primeiro número digitado pelo usuário
		
System.out.println("Digite a sua idade: ");
idade = input.nextInt(); // armazena o primeiro número digitado pelo usuário
		

Import

  • A classe Scanner apareceu a partir do java 5. Antes disso era complicado inserir informações.
  • Para usar a Classe Scanner, deve-se importar-la, pois ela faz parte da biblioteca java
import java.util.Scanner;

inserindo dados

  • O objeto System.in faz a leitura do que se escreve no teclado.
  • Para tipo de variável existe um método diferente.
Tipos de variáveis Métodos
float numF input.nextFloat();
int num1 input.nextInt();
byte byte1 input.nextByte();
long lg1 input.nextLong();
boolean b1 input.nextBoolean();
double num2 input.nextDouble();
String nome input.nextLine();

Exemplo

import java.util.Scanner;

public class Cadastro {

	public static void main(String[] args) {
		//cria un Scanner para obter entrada a partir da janela de comando
		Scanner input = new Scanner(System.in);
		
		String nome;
		int idade;
				
		System.out.println("Digite o seu nome: ");
		nome = input.nextLine(); // armazena o primeiro número digitado pelo usuário
		
		System.out.println("Digite a sua idade: ");
		idade = input.nextInt(); // armazena o primeiro número digitado pelo usuário
		
		System.out.println("A idade de "+nome+" é "+idade+" anos.");

	}

}

Switch e case

Exemplo

int menu = 0;
switch(menu){
    case 1 : System.out.println("Últimas ligações"); break;
    case 2 : System.out.println("Ligações perdidas"); break;
    case 3 : System.out.println("Configurações"); break;
    case 4 : System.out.println("Vídeos / Imagens"); break;
    default : System.out.println("Mensagens"); break;

Aula 03

Programação Orientada à Objetos

Programação Orientada à objetos

  • Orientação a objetos é uma maneira de programar que ajuda na organização na escrita do código.

Criando um objeto

  • Para facilitar o nosso entendimento vamos criar um sistema simples de um banco.
  • Vamos analisar e verificar o que temos em um banco.
  • O mais importante do banco é que todos eles tem conta.
  • Analisando a conta de um banco
    • Número da conta
    • Nome do dono da Conta
    • Saldo
    • Limite
  • O que a conta faz?
    • saca uma quantidade x
    • deposita uma quantidade x
    • imprime o nome do dono da conta
    • devolve o saldo atual
    • transfere uma quantidade x para uma outra conta y
    • devolve o tipo de conta

Criando um objeto

Criando uma classe

public class Conta {
    int numero;
    String dono;
    double saldo;
    double limite;

}

Criando a classe principal

public class Programa {
    public static void main(String[] args) {
    Conta minhaConta;
    minhaConta = new Conta();
    minhaConta.dono = "Duke";
    minhaConta.saldo = 1000.0;
    System.out.println("Saldo atual: " + minhaConta.saldo);
    }
}

métodos

  • Declararemos o que cada conta faz e como isto é feito - os comportamentos que cada classe tem, isto é, o que ela faz. Por exemplo, de que maneira que uma Conta saca dinheiro? Especificaremos isso dentro da própria classe Conta, e não em um local desatrelado das informações da própria Conta.

Métodos

public class Conta {
    int numero;
    String dono;
    double saldo;
    double limite;


    void saca(double valor) {
        double novoSaldo = this.saldo - valor;
        this.saldo = novoSaldo;
 }

}

Métodos

public class Conta {
    int numero;
    String dono;
    double saldo;
    double limite;


    void saca(double valor) {
        double novoSaldo = this.saldo - valor;
        this.saldo = novoSaldo;
 }
    void deposita(double quantidade) {
        this.saldo += quantidade;
 }

}

Testando a Classe principal

public class Programa {
    public static void main(String[] args) {
        // criando a conta
        Conta minhaConta;
        minhaConta = new Conta();

        // alterando os valores de minhaConta
        minhaConta.dono = "Duke";
        minhaConta.saldo = 1000;

        // saca 200 reais
        minhaConta.saca(200);

        // deposita 500 reais
        minhaConta.deposita(500);
        System.out.println(minhaConta.saldo);
    }
}

métodos com retorno

  • Um método sempre tem que definir o que retorna, nem que defina que não há retorno, como nos exemplos anteriores onde estávamos usando o void.

método com retorno

public class Conta {
    int numero;
    String dono;
    double saldo;
    double limite;


    boolean saca(double valor) {
        if (this.saldo < valor) {
            return false;
    } else {
        this.saldo = this.saldo - valor;
        return true;
    }
˜ }
    void deposita(double quantidade) {
        this.saldo += quantidade;
 }

}

Objetos são acessados por referência

  • Quando declaramos uma variável para associar a um objeto, na verdade, essa variável não guarda o objeto, e sim uma maneira de acessá-lo, chamada de referência.
public static void main(String args[]) {
    Conta c1;
    c1 = new Conta();

    Conta c2;
    c2 = new Conta();
}

Objetos são acessados por referência

Qual seria o resultado?

class TestaReferencias {
    public static void main(String args[]) {
    Conta c1 = new Conta();
    c1.deposita(100);

    Conta c2 = c1; // linha importante!
    c2.deposita(200);
˜
    System.out.println(c1.saldo);
    System.out.println(c2.saldo);
    }
}

Conclusão

e agora?

public static void main(String args[]) {
    Conta c1 = new Conta();
    c1.dono = "Duke";
    c1.saldo = 227;

    Conta c2 = new Conta();
    c2.dono = "Duke";
    c2.saldo = 227;

    if (c1 == c2) {
    System.out.println("Contas iguais");
    }
}

Atividade

  1. Desenvolva um métoda transfere no seu sistema do banco.
  2. Crie um novo projeto Java chamado "Atividade prática"
    1. Crie uma classe chamado Carro
      • Nesta classe coloque os seguintes atributos
      • String Cor
      • String modelo
      • double velocidadeAtual
      • double velocidadeMaxima
    2. Crie um método que indica que o carro está ligado
    3. Crie um método acelera
    4. Crie um método pegaMArcha indicando a marcha do carro de acordo com a velocidade

Atividade

  • Crie um método pegaMArcha indicando a marcha do carro de acordo com a velocidade.
    • Se a velocidade for menor que 0 retorne -1
    • Se a velocidade for maior igual 0 e menor que 20 retorne 1
    • Se a velocidade for maior igual 20 e menor que 40 retorne 2 
    • Se a velocidade for maior igual 40 e menor que 60 retorne 3
    • Se a velocidade for maior igual 60 e menor que 80 retorne 4
    •  Se a velocidade for maior igual 80 e menor que 100 retorne 5 

Atividade

public class TestaCarro {
	public static void main(String[] args){
		Carro meuCarro = new Carro();
		meuCarro.cor = "Verde";
		meuCarro.modelo = "Fusca";
		meuCarro.velocidadeAtual = 25;
		meuCarro.velocidadeMaxima = 120;
		
		//liga o carro
		meuCarro.liga();
		
		//acelera o carro
		meuCarro.acelera(35);
		System.out.println("O carro está com: " +meuCarro.velocidadeAtual+" km/h");
		
		//Marcha do Carro
		meuCarro.pegaMarcha();
	}

}
  1. Crie a classe testaCarro e faça de acordo com o código abaixo:

Aula 04

Arrays

Imaginemos um seguinte problema

  • Faremos a seguinte declaração de variáveis de idade
int idade1;
int idade2;
int idade3;
int idade4;
  • Isso pode se tornar um problema quando precisamos mudar a quantidade de variáveis a serem declaradas de acordo com um parâmetro.

Vetor array

  • Uma array é sempre um objeto, portanto, a variável idades é uma referência.
int[] idades;
  • Criando um objeto-array
idades = new int[10];

//acessando a posição do array

idades[5] = 10;

Para entender melhor

Erro de exception

  • No Java, os índices do array vão de 0 a n-1, onde n é o tamanho
    dado no momento em que você criou o array. Se você tentar acessar uma posição fora desse alcance, um erro ocorrerá durante a execução.

Arrays de referência

  • Ao criamos um objeto com array as referências do objeto criado fica no array.
Conta[] minhasContas;
minhasContas = new Conta[10];

// também pode ser desse jeito

Conta[] minhasContas = new Conta[10];
  • Aqui não foi criado nenhuma conta, apenas foram criados 10 espaços para guardar referências de uma conta.

Para entender melhor

Percorrer uma array

public static void main(String args[]) {
    int[] idades = new int[10];
    for (int i = 0; i < 10; i++) {
        idades[i] = i * 10;
    }
    for (int i = 0; i < 10; i++) {
        System.out.println(idades[i]);
}
}

enhanced-for

public static void main(String args[]) {
    int[] idades = new int[10];
    for (int i = 0; i < 10; i++) {
        idades[i] = i * 10;
    }
    // imprimindo toda a array
    for (int x : idades) {
        System.out.println(x);
    }
}

Atividade

  1. Desenvolva uma classe chamada Funcionário, nesta classe deve ter os seguintes atributos:
    • String nome

    • String departamento

    • double salario

    • String dataAdmissao

    • String RG;

  2. Desenvolva dois métodos para esta classe

    • método recebeAumento que aumenta o salario do funcionário de acordo com o parâmetro passado como argumento.

    • calculaGanhoAnual, que não recebe parâmetro algum, devolvendo o valor do salário multiplicado por 12.

Atividade

  1. Desenvolva uma classe chamada TestaFuncionario, crie um objeto do tipo Funcionário e atribua os seguintes valores:
    • O nome deve ser o seu nome

    • Insira o salário com o valor de R$ 954,00

    • Este funcionário recebeu um aumento de R$ 150,00

    • Insira System.out.println informando o nome do funcionário, o salário e o ganho anual que ele terá

  2. Na classe Funcionário desenvolva um método chamado mostra, no qual imprime todos os atributos do nosso funcionário.

  3. Crie um outro objeto do tipo Funcionário, e atribua os valores a sua escolha.

Atividade

  1. Desenvolva uma classe chamada Empresa, A Empresa tem um nome, cnpj e uma referência a uma array de Funcionario.
  2. A Empresa deve ter um método adiciona , que recebe uma referência a Funcionario como argumento e guarda esse funcionário.

  3. Crie uma classe TestaEmpresa que possuirá um método main . Dentro dele crie algumas instâncias de Funcionario e passe para a empresa pelo método adiciona .

Aula 05

Modificadores de acesso e atributos de classe

Controle de acesso

  • Os modificadores de acesso em Java, também conhecidos como modificadores de visibilidade, permitem controlar o acesso a classes, atributos, métodos e construtores.

Controle de acesso

  • Uma classe é um projeto de um objeto
  • Objeto moto pode acessar o método acelera do objeto carro?
  • Um atributo sendo acessado ou modificado por qualquer classe, torna-se o seu controle descentralizado. Com isso a manutenção torna-se menos eficiente.
  • Usando o controle de acesso, o atributo irá possuir um controle centralizado, tornando-se mais eficiente a sua manutenção.

Modificador de acesso public

  • Quando o modificador de acesso public é usado em uma classe, ela fica visível (acessível) para todas as outras classes.
public class Produto {
}

Atributo privado

class Funcionario {
    private double salario ;
        void aumentaSalario ( double aumento ) {
        
        // lógica para aumentar o salário
        }
    }

atributo privado

  • Um atributo privado só pode ser acessado ou alterado por código escrito dentro da classe na qual ele foi definido. Se algum código fora da classe Funcionário tentar acessar ou alterar o valor do atributo privado salario, um erro de compilação será gerado.

Encapsulamento

  • Esconder todos os membros de uma classe, além de esconder como funcionam as rotinas do nosso sistema.
  • Encapsular é fundamental para que seu sistema seja suscetível a mudanças: não precisaremos mudar uma regra de negócio em vários lugares, mas sim em apenas um único lugar, já que essa regra está encapsulada.

Getters e Setters

  • O modificador private faz com que ninguém consiga modificar, nem mesmo ler, o atributo em questão. Com isso, temos um problema: como fazer para mostrar o saldo de uma Conta, já que nem mesmo podemos acessá-lo para leitura?

Getters e setters

class Conta {
    private double saldo;
    private double limite;
    private Cliente titular;
    public double getSaldo() {
        return this.saldo;
    }
    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }
    public double getLimite() {
        return this.limite;
    }
    public void setLimite(double limite) {
        this.limite = limite;
    }
    public Cliente getTitular() {
        return this.titular;
    }
    public void setTitular(Cliente titular) {
        this.titular = titular;
    }
}

Construtor

  • O construtor da classe é um bloco declarado com o mesmo nome que a classe.
  • Quando usamos a palavra chave new, estamos construindo um objeto. Sempre quando o new é chamado, ele executa o construtor da classe.
class Conta {
    int numero;
    Cliente titular;
    double saldo;
    double limite;

    // construtor
    Conta() {
        System.out.println("Construindo uma conta.");
    }
}

Construtor

  • Um construtor pode receber um argumento, podendo assim inicializar algum tipo de informação.
class Conta {
    int numero;
    Cliente titular;
    double saldo;
    double limite;
    
    // construtor
    Conta(Cliente titular) {
        this.titular = titular;
    }
}

Construtor

Cliente carlos = new Cliente();
carlos.nome = "Carlos";
Conta c = new Conta(carlos);
System.out.println(c.titular.nome);

Aula 06

Herança e polimorfismo

Herança

  • Adiciona a capacidade de uma classe filha estender/herdar atributos e métodos de uma classe mãe.

Classe mãe

Classe filha

classe mãe

class Funcionario {
    String nome;
    String cpf;
    double salario;
}

Classe filha

class Gerente extends Funcionario {
    int senha;
    int numeroDeFuncionariosGerenciados;
    public boolean autentica(int senha) {
        if (this.senha == senha) {
            System.out.println("Acesso Permitido!");
        return true;
            } else {
                System.out.println("Acesso Negado!");
        return false;
            }
        }
}

Herança

  • Dizemos que a classe Gerente herda todos os atributos e métodos da classe mãe, no nosso caso, a Funcionario. Para ser mais preciso, ela também herda os atributos e métodos privados, porém não consegue acessá-los diretamente.
  • Para acessar um membro privado na filha indiretamente, seria necessário que a mãe expusesse um outro método visível que invocasse esse atributo ou método privado.

Atributo protect

  • O atributo protect só pode ser acessado (visível) pela própria classe e por suas subclasses.
class Funcionario {
    protected String nome;
    protected String cpf;
    protected double salario;
}

Uma classe pode ter várias filhas, mas pode ter apenas uma mãe, é a chamada herança simples do java.
 

Reescrevendo o código

  • No Java, quando herdamos um método, podemos alterar seu comportamento. Podemos reescrever (reescrever,
    sobrescrever, override) este método.
class Gerente extends Funcionario {
    int senha;
    int numeroDeFuncionariosGerenciados;
    public double getBonificacao() {
        return this.salario * 0.15;
    }

}

Atividade

  1. Verifique se no seu projeto possui a classe Funcionario.
  2. Crie três classes chamadas, Telefonista, Gerente e Secretaria. Essas classe devem herdar de Funcionario.
  3. Na classe TestaFuncionario, crie os objetos Telefonista, Gerente e Secretaria atribuindo os seguintes valores.
    • Nome;
    • Departamento;
    • Salario;
    • Data de admissão.
  4. Não esquecer de construir um construtor para cada classe.
  5. Adicione na classe funcionário um método Bonificação e, em seguida, imprima o seu valor nos funcionários criados. A bonificação será 10% salário.

Atividade

  1. Reescreva o método de acordo com a classe:
    • Telefonista - 11% do salário;
    • Gerente - 15% do salário;
    • Secretária - 18% do salário.

Atividade 2

  1. Crie duas classe chamadas de Conta Corrente e Conta Poupança, ambas serão classes filhas da classe Conta.
  2. Na classe Conta crie um método chamado manutenção, neste método retorno o valor que será pago pela manutenção da conta de acordo com a quantidade que possui em saldo.
public void manutencao() {
       this.saldo = this.saldo - (this.saldo * 0.1);
	  }

Atividade 2

  1. Reescreva o método manutecao para as classes filhas de acordo com o que se pede abaixo:
    • Conta Corrente - 0.3
    • Conta Poupança - 0.2
  2. Na classe ContaCorrente, reescreva o método deposita para descontar a taxa bancária de dez centavos.
  3. Crie uma classe com método main e instancie essas classes, atualize-as e veja o resultado.

Atividade 2

public class TestaContas {
    public static void main(String[] args) {
        Conta c = new Conta();
        ContaCorrente cc = new ContaCorrente();
        ContaPoupanca cp = new ContaPoupanca();
        c.deposita(1000);
        cc.deposita(1000);
        cp.deposita(1000);
        c.manutecao();
        cc.manutecao();
        cp.manutecao();
        System.out.println(c.getSaldo());
        System.out.println(cc.getSaldo());
        System.out.println(cp.getSaldo());
}
}

Polimorfismo

  • É a capacidade de um objeto poder ser referenciado de várias formas.
  • Na herança, vimos que todo Gerente é um Funcionário, pois é uma extensão deste. Podemos nos referir a um Gerente como sendo um Funcionário. Se alguém precisa falar com um Funcionário do banco, pode falar com um Gerente! Porque? Pois Gerente é um Funcionário. Essa é a semântica da herança.

Interface

Interface

  • Podemos definir interface como uma face, um plano, uma divisa que faz a comunicação entre dois meios diferentes.
  • É um recurso muito utilizado em Java, bem como na maioria das linguagens orientadas a objeto, para “obrigar” a um determinado grupo de classes a ter métodos ou propriedades em comum para existir em um determinado contexto, contudo os métodos podem ser implementados em cada classe de uma maneira diferente.

O que tem na interface

  • Nas interfaces existem somente assinaturas de métodos e propriedades, cabendo à classe que a utilizará realizar a implementação das assinaturas, dando comportamentos práticos aos métodos.

Criando Interface

public interface FiguraGeometrica
{
 public String getNomeFigura(); 
 public int getArea();
 public int getPerimetro();
}

Classe Abstrata

Classe Abstrata

  • Ela é uma classe que apenas idealiza um tipo, define apenas um rascunho.
  • Uma classe concreta pode ser diretamente utilizada para instanciar objetos. Por outro lado, uma classe abstrata não pode.
public abstract class Funcionario{
	private String nome;
	private String departamento;
	protected double salario;
	private Data dataAdmissao;
	private String rg;
    
    //métodos e construtores...
}

Métodos Abstratos

  • É um método que será sempre escrito pelas classes filhas.
  • Ele indica que todas as classes filhas (concretas, isto é, que não forem abstratas) devem reescrever esse método ou não compilarão. É como se você herdasse a responsabilidade de ter aquele método.
public abstract class Funcionario{
	private String nome;
	private String departamento;
	protected double salario;
	private Data dataAdmissao;
	private String rg;    
    //métodos e construtores...

        abstract double bonifica();
}

Atividade

  1. No projeto Banco, atribua a classe Conta e Funcionario como classes Abstratas.
  2. Transforme o método Bonifica em método abstrato.
  3. Desenvolva uma interface chama Tributável.
  4. Corrija os possíveis erros do seu projeto.
interface Tributavel {
double calculaTributos();
}
  1. Faça que a classe ContaCorrente implemete tributável, retornado um valor de 1% do Saldo.
  2. Crie uma classe chamada SeguroDeVida e implemente a classe Tributável, retornando 5% do Saldo

Pacotes

Organizando suas classes e bibliotecas

Pacotes

  • O código fonte de uma aplicação é definido em diversos arquivos. Conforme a quantidade de arquivos cresce surge a necessidade de algum tipo de organização para poder encontrar os arquivos rapidamente quando for necessário modificá-los.

Package

  • Na terminologia do Java, as pastas nas quais são organizadas as classes e interfaces de uma aplicação
    são chamadas de pacotes.

Unqualified Name vs Fully Qualified Name

  • O nome simples é o identificador declarado a direita do comando class ou interface.
  • O nome completo é formado pela concatenação dos nomes dos pacotes com o nome simples através do caractere
    “.”.

Unqualified Name vs Fully Qualified Name

  • O nome simples da classe acima é: Conta e o nome completo é: sistema.contas.Conta.
package sistema.contas;

public class Conta {
// corpo da classe
}

Classes e Interfaces

  • Duas classes de um mesmo pacote podem “conversar” entre si através do nome simples de cada uma delas. O mesmo vale para interfaces.

Classes e Interfaces

package sistema.contas;

public class Conta {
// corpo da classe
}

Classes e Interfaces

package sistema.contas;

class ContaPoupanca extends Conta {
// corpo da classe
}

Classes e Interfaces

package sistema.contas;

public class Conta {
// corpo da classe
}

Classes e Interfaces

package sistema.clientes ;

public class Cliente {
    private sistema.contas.Conta conta;
}

import

  • Para facilitar a escrita do código fonte, podemos utilizar o comando import para não ter que repetir o nome completo de uma classe ou interface várias vezes dentro do mesmo arquivo.
package sistema.clientes;

import sistema.contas.Conta;

public class Cliente {
    private Conta conta;
}

Exceptions

Controle de erros

Tratamento de Exceções

  • Java   fornece   aos   desenvolvedores   um   mecanismo
    sofisticado para manipulação de erros que produz códigos de manipulação eficientes e organizados: a manipulação de exceções.

     

Classe Throwable

  •  É   pré­-definida   na   linguagem   Java, acompanhado de várias outras classes definindo um grande número de categorias de erro.
    Os   programadores   Java,   por  convenção,   caso   queiram  criar   exceções  devem   estender   a classe  Exception  que é uma subclasse de Throwable.

     

     

Classe Throwable

Throwable

Exception

Error

RuntimeException

IOException

NullPointerException

ClassCastException

FileNotFoundException

ArrayIndexOutOfBoundsException

Exceção

  • Uma exceção representa uma situação que normalmente não ocorre e representa algo de estranho
    ou inesperado no sistema.
  • Usar tratamento de exceções permite detectar erros e manipular esses erros.

checked exceptions

  • O compilador checará se o erro está sendo devidamente tratada.
  • O Desenvolvedor é obrigado a tratá-la.
  • Checked exceptions são utilizadas para erros recuperáveis

CHECKED EXCEPTIONS

class Teste {
    public static void main ( String [] args ) {
        Conta c = new Conta();
        try {
            c.deposita (100);
            } catch ( IllegalArgumentException e) {
        System . out. println (" Houve um erro ao depositar ");
            }
        }
    }

Unchecked exceptions

  • Não é obrigatório tratar nem relançar, apesar de ser possível. Caso não haja try-catch adequado à exceção gerada, ela é automaticamente relançada.

http://www.devmedia.com.br/trabalhando-com-excecoes-em-java/27601

Pacote Java.lang

Subtitle

Pacote java.lang

  • Vimos o sistema de pacotes do Java e nunca precisamos dar um import nessas classes. Isso ocorre porque elas estão dentro do pacote java.lang, que é automaticamente importado para você. É o único pacote com esta característica.

Classe System

  • A classe System possui uma série de atributos e métodos estáticos.
  • O mais famoso dele que usamos é o System.out

java.lang.Object

  • Sempre quando declaramos uma classe, essa classe é obrigada a herdar de outra. Isto é, para toda classe que declararmos, existe uma superclasse. Porém, criamos diversas classes sem herdar de ninguém:
class MinhaClasse {

    }

java.lang.Object

  • Quando o Java não encontra a palavra chave extends, ele considera que você está herdando da classe Object, que também se encontra dentro do pacote java.lang. Você até mesmo pode escrever essa herança, que é o mesmo:
public class MinhaClasse extends Object {

    }

Collections framework

simplificando arrays

Como sabemos

  • Não podemos redimensionar arrays em java
  • É impossível buscar diretamente por um determinado elemento cujo índice não se sabe;

API collections

  • É robusta e possui diversas classes que representam estruturas de dados avançadas.

Listas

  • É uma coleção que permite elementos duplicados e mantém uma ordenação específica entre os elementos.
  • Os elementos serão encontrados em uma ordem pré-determinada, definida na hora da inserção dos mesmos.
  • A API de Collections traz a interface java.util.List, que específica o que uma classe deve ser capaz de fazer para ser uma lista.

ArrayList

  • trabalha com um array interno para gerar uma lista. Ela é mais rápida na pesquisa do que sua concorrente, a LinkedList, que é mais rápida na inserção e remoção de itens nas pontas.
List lista = new ArrayList();
lista.add("Manoel");
lista.add("Joaquim");
lista.add("Maria");

Criando uma lista de objetos

ContaCorrente c1 = new ContaCorrente();
    c1.deposita(100);
ContaCorrente c2 = new ContaCorrente();
    c2.deposita(200);
ContaCorrente c3 = new ContaCorrente();
    c3.deposita(300);
List contas = new ArrayList();
    contas.add(c1);
    contas.add(c3);
    contas.add(c2);
System.out.println(contas.size());
for (int i = 0; i < contas.size(); i++) {
ContaCorrente cc = (ContaCorrente) contas.get(i);
System.out.println(cc.getSaldo());
}

Outros métodos

  • remove() -  que recebe um objeto que se deseja remover da lista
  • contains() - que recebe um objeto como argumento e devolve true ou false, indicando se o elemento está ou não na lista

gENERICS

  • Em qualquer lista, é possível colocar qualquer Object. Com isso, é possível misturar objetos:
ContaCorrente cc = new ContaCorrente();
List lista = new ArrayList();
lista.add("Uma string");
lista.add(cc);

gENERICS

  • Uma lista com vários objetos de tipos diferentes, pode não ser tão simples recuperar os objetos
  • Podemos usar o recurso de Generics para restringir as listas a um determinado tipo de objetos
List<ContaCorrente> contas = new ArrayList<ContaCorrente>();
contas.add(c1);
contas.add(c3);
contas.add(c2);

Ordenação - Collections.sort

  • As listas são percorridas de maneira pré-determinada de acordo com a inclusão dos itens.
  • Como fazer uma lista de ordem ordenada?
List<String> lista = new ArrayList<>();
lista.add("Sérgio");
lista.add("Paulo");
lista.add("Guilherme");

System.out.println(lista);
Collections.sort(lista);
System.out.println(lista);

Qual o problema da ordenação?

ContaCorrente c1 = new ContaCorrente();
c1.deposita(500);
ContaCorrente c2 = new ContaCorrente();
c2.deposita(200);
ContaCorrente c3 = new ContaCorrente();
c3.deposita(150);
List<ContaCorrente> contas = new ArrayList<>();
contas.add(c1);
contas.add(c3);
contas.add(c2);
Collections.sort(contas);

Interface Comparable

public class ContaCorrente extends Conta implements Comparable<ContaCorrente> {
    ContaCorrente c1 = new ContaCorrente();
    c1.deposita(500);
    ContaCorrente c2 = new ContaCorrente();
    c2.deposita(200);
    ContaCorrente c3 = new ContaCorrente();
    c3.deposita(150);
    List<ContaCorrente> contas = new ArrayList<>();
    contas.add(c1);
    contas.add(c3);
    contas.add(c2);
    Collections.sort(contas);
    public int compareTo(ContaCorrente outra) {
        if (this.saldo < outra.saldo) {
            return -1;
            }
        if (this.saldo > outra.saldo) {
            return 1;
            }
        return 0;
        }
     }

Conjunto Java.util.set

  • Funciona de forma análoga aos conjuntos da matemática, ele é uma coleção que não permite elementos duplicados.
  • Outra característica fundamental dele é o fato de que a ordem em que os elementos são armazenados pode não ser a ordem na qual eles foram inseridos no conjunto. A interface não dene como deve ser este comportamento.
    Tal ordem varia de implementação para implementação.

Hashset

import java.util.HashSet;
import java.util.Set;

public class Cargos {

	public static void main(String[] args) {
		Set<String> cargos = new HashSet<>();
		cargos.add("Gerente");
		cargos.add("Diretor");
		cargos.add("Presidente");
		cargos.add("Secretária");
		cargos.add("Funcionário");
		cargos.add("Diretor"); // repetido!
		// imprime na tela todos os elementos
		System.out.println(cargos);
	}

}

Percorrer uma coleção

  • Se for uma lista pode-se usar um laço for invocando um método get para cada elemento.
import java.util.ArrayList;
import java.util.List;

public class Lista {

	public static void main(String[] args) {
		
		List lista = new ArrayList();
		
		lista.add("Manoel");
		lista.add("Joaquim");
		lista.add("Maria");
		lista.add("João");
		lista.add("Raimundo");
		lista.add("José");
		lista.add("Francisco");
		
		for (int i = 0; i < lista.size(); i++) {
			System.out.println(lista.get(i));
			}
	}

}

Percorrer uma coleção

  • Set não possui um método para pegar o primeiro, o segundo ou o quinto elemento do conjunto, já que um conjunto não possui o conceito de “ordem”.
import java.util.HashSet;
import java.util.Set;

public class Linguagem {

	public static void main(String[] args) {
		Set<String> conjunto = new HashSet<>();
		conjunto.add("Java");
		conjunto.add("PHP");
		conjunto.add("Vraptor");
		conjunto.add("Scala");
		conjunto.add("Ruby");
		conjunto.add("Angular");
		
		for(String palavra : conjunto){
			System.out.println(palavra);
		}
	}
}

Iterator

  • Toda coleção fornece acesso a um iterator, um objeto que implementa a interface Iterator, que conhece internamente
    a coleção e dá acesso a todos os seus elementos.
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Lista2 {

	public static void main(String[] args) {
		
		Set<String> lista = new HashSet<>();
		
		lista.add("Manoel");
		lista.add("Joaquim");
		lista.add("Maria");
		lista.add("João");
		lista.add("Raimundo");
		lista.add("José");
		lista.add("Francisco");
		
		Iterator<String> i = lista.iterator();
		while (i.hasNext()) {
			// recebe a palavra
			String palavra = i.next();
			System.out.println(palavra);
			}
		}
	}

Mapas

  • Um mapa é composto por um conjunto de associações entre um objeto chave a um objeto valor.

MApa

ContaCorrente c1 = new ContaCorrente();
    c1.deposita(10000);
ContaCorrente c2 = new ContaCorrente();
    c2.deposita(3000);
// cria o mapa
Map<String, ContaCorrente> mapaDeContas = new HashMap<>();
// adiciona duas chaves e seus respectivos valores
    mapaDeContas.put("diretor", c1);
    mapaDeContas.put("gerente", c2);

ContaCorrente contaDoDiretor = mapaDeContas.get("diretor");
    System.out.println(contaDoDiretor.getSaldo());

Properties

  • Um mapa importante é a tradicional classe Properties, que mapeia strings e é muito utilizada para a configuração de aplicações.
Properties config = new Properties();
config.setProperty("database.login", "scott");
config.setProperty("database.password", "tiger");
config.setProperty("database.url","jdbc:mysql:/localhost/teste");

String login = config.getProperty("database.login");
String password = config.getProperty("database.password");
String url = config.getProperty("database.url");
DriverManager.getConnection(url, login, password);

Threads

Programação Concorrente

Threads em Java

  • Em Java, usamos a classe Thread do pacote java.lang para criarmos linhas de execução paralelas. A classe Thread recebe como argumento um objeto com o código que desejamos rodar.

Atividade

  • Para entendermos melhor crie um novo projeto e crie uma classe chamada ExibeMensagem
public class ExibeMensagens implements Runnable {
    private String msg;
    public ExibeMensagens (String msg) {
        this.msg = msg;
    }
    public void run (){
        for ( int i = 0; i < 1000; i ++){
            System . out . println ( i + " : " +this.msg);
        }
    }
}

Atividade

  • Agora crie uma classe com método principal e execute o código.
public class Teste {
    public static void main (String[] args){
        ExibeMensagens tarefa1 = new ExibeMensagens ("UTD");
        ExibeMensagens tarefa2 = new ExibeMensagens ("Java");
        ExibeMensagens tarefa3 = new ExibeMensagens ("MySQL");
    
        Thread thread1 = new Thread (tarefa1);
        Thread thread2 = new Thread (tarefa3);
        Thread thread3 = new Thread (tarefa3);

        thread1.start();
        thread2.start();
        thread3.start();
        }
}

Controlando a Execução das Tarefas

  • Controlar a execução das tarefas de uma aplicação pode ser bem complicado. Esse controle envolve, por exemplo, decidir quando uma tarefa pode executar, quando não pode, a ordem na qual duas ou mais tarefas devem ser executadas, etc.

Controlando a Execução das Tarefas

  • Sleep():
    • Durante a execução de uma thread, se o método sleep() for chamado a thread ficará sem executar pelo menos durante a quantidade de tempo passada como parâmetro para este método.
    • Thread . sleep (3000) ;
  • InterruptedException:
    • Uma thread que está “dormindo” pode ser interrompida por outra thread. Quando isso ocorrer, a thread que está “dormindo” recebe uma InterruptedException .
try {    
    Thread.sleep (3000) ;
}catch (InterruptedException e) {
}

Controlando a Execução das Tarefas

  • Join():
    • Uma thread pode “pedir” para esperar o término de outra thread para continuar a execução através do método join(). Esse método também pode lançar uma InterruptedException .
TarefaImprimeMensagens tarefa = new TarefaImprimeMensagens ("UTD");
Thread thread = new Thread (tarefa);
thread.start();
try {
    thread.join();
    } catch(InterruptedException e){
}

Atividade

  • Faça uma pequena alteração no código da atividade passada:
public class ExibeMensagens implements Runnable {
    private String msg;
    public ExibeMensagens (String msg) {
        this.msg = msg;
    }
    public void run (){
        for ( int i = 0; i < 1000; i ++){
            System . out . println ( i + " : " +this.msg);
            
            if (i % 100 == 0){
                try{
                    Thread.sleep(100);
                   }catch(InterruptedExceptione) {
                    }
            }
        }
    }
}

Garbage Collector

Garbage Collector

  • Funciona como uma Thread responsável por jogar fora todos os objetos que não estão sendo referenciados por nenhum outro objeto - seja de maneira direta ou indireta.
  • Você não tem garantia de quando ele vai rodar. Você só sabe que, em algum momento no futuro, uma parte da memória vai ser liberada.

System.gc()

  • Você nunca consegue forçar o Garbage Collector, mas chamando o método estático gc da classe System , você está sugerindo que a Virtual Machine rode o Garbage Collector naquele momento.
  • Se sua sugestão vai ser aceita ou não, isto depende de JVM para JVM, e você não tem garantias.
  • Evite o uso deste método. Você não deve basear sua aplicação em quando o Garbage Collector vai rodar ou não.

Swing

interface gráfica do Java

AWT

  • A plataforma Java oferece recursos sofisticados para construção de interfaces gráficas de usuário.
  • Conjunto básico de classes e interfaces que definem os componentes de uma janela desktop. AWT é a base para Java Swing API.

Swing

  • Conjunto sofisticado de classes e interfaces que definem os componentes visuais e serviços necessários para construir uma interface gráfica de usuário.

Componentes

  • Alguns componentes podem ser colocados dentro de outros componentes, por exemplo, uma caixa de texto dentro de uma janela.

Jframe

  • A classe JFrame define janelas com título, borda e alguns itens definidos pelo sistema operacional como botão para minimizar ou maximizar.
JFrame frame = new JFrame ("UTD - Java com Banco de Dados");
frame.setSize (300 , 200);
frame.setVisible (true);

Jpanel

  • Define um componente que basicamente é utilizado para agrupar nas janelas outros componentes como caixas de texto, botões, listas, entre outros.
  • Normalmente, criamos um objeto da classe JPanel e associamos a um objeto da classe JFrame para agrupar todo o conteúdo da janela.
JFrame frame = new JFrame ("UTD - Java com Banco de Dados");
JPanel panel = new JPanel ();
frame.setContentPane (panel);

JTextField e JLabel

  • A classe JTextField define os campos de texto que podem ser preenchidos pelo usuário. A classe JLabel define rótulos que podem ser utilizados por exemplo em caixas de texto.
JFrame frame = new JFrame ("UTD - Java com Banco de Dados");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

JPanel panel = new JPanel ();

JLabel rotulo = new JLabel ();
rotulo.setText ("Nome: ");
panel.add (rotulo);

JTextField textField = new JTextField (40);
panel.add (textField);
frame.setContentPane (panel);
frame.pack ();
frame.setVisible (true);

JTextArea

  • Para textos maiores podemos aplicar o componente definido pela classe JTextArea.

JPasswordField

  • Em formulários que necessitam de caixa de texto para digitar senhas, podemos aplicar o componente definido pela classe JPasswordField.

Atividade

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class Teste {
    public static void main ( String [] args ) {
        JFrame frame = new JFrame ("UTD - Login");
        frame.setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE );

        JPanel panel = new JPanel ();

        JLabel label1 = new JLabel ("Usuário: ");

        JTextField textField = new JTextField (20) ;

        JLabel label2 = new JLabel ("Senha: ");

        JPasswordField passwordField = new JPasswordField (20) ;

        JButton button = new JButton ("Logar");

        panel.add (label1);
        panel.add (textField);
        panel.add (label2);
        panel.add (passwordField);
        panel.add (button);

        frame.setContentPane (panel);

        frame.pack ();
        frame.setVisible (true);
    }
}

JOptionPane

JOptionPane

  • É uma classe que possibilita a criação de uma caixa de dialogo que ou solicita um valor para o usuário ou retorma um informação.

JOptionPane

Atividade

import javax.swing.JOptionPane; 

public class Addition 
{
   public static void main(String[] args)
   {
      // usar as caixas de diálogos de JOptionPane
      String firstNumber = 
         JOptionPane.showInputDialog("Entre com o primeiro número");
      String secondNumber =
          JOptionPane.showInputDialog("Entre com o segundo número");

      // converte os valores inseridos que estão em string para inteiros
      int number1 = Integer.parseInt(firstNumber); 
      int number2 = Integer.parseInt(secondNumber);

      int sum = number1 + number2; // add numbers

      // mostra o resultado em uma janela de diálogo do JOptionPane
      JOptionPane.showMessageDialog(null, "The sum is " + sum, 
         "Sum of Two Integers", JOptionPane.PLAIN_MESSAGE);
   } 
} 

Layout

Gerenciadores de Layout

Gerenciadores de Layout

  • É o processo de determinar o tamanho e aposição dos componentes na interface gráfica do programa.
  • Por padrão o java trabalha com cinco gerenciadores:
    • BorderLayout
    • BoxLayout
    • FlowLayout
    • GridBagLayout
    • GridLayout
  • Eles determinam onde seu componentes ficarão no seu programa

BorderLayout

  • Divide o container em cinco regiões: Norte, Sul, Leste, Oeste e Centro. Ao adicionar um componente, indicamos a região onde queremos adicioná-lo.

Border Layout

import javax.swing.*;
import java.awt.*;

public class TestBorder{
    public static void main(String args[]){
        JFrame tela = new JFrame("Combo");
        tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        tela.setVisible(true);

        //criando botões
        JButton botao01 = new JButton("Botão 01");
        JButton botao02 = new JButton("Botão 02");
        JButton botao03 = new JButton("Botão 03");
        JButton botao04 = new JButton("Botão 04");
        JButton botao05 = new JButton("Botão 05");
        
        //adicionando os componentes na tela
        tela.getContentPane().add(botao01, BorderLayout.NORTH);
        tela.getContentPane().add(botao02, BorderLayout.CENTER);
        tela.getContentPane().add(botao03, BorderLayout.WEST);
        tela.getContentPane().add(botao04, BorderLayout.SOUTH);
        tela.getContentPane().add(botao05, BorderLayout.EAST);

        tela.pack();
    }
}

Border Layout

BoxLayout

  • Organiza os componentes sequencialmente pelo eixo X ou eixo Y (indicamos isso no construtor) usando os tamanhos preferenciais de cada componente.

BoxLayout

import javax.swing.*;
import java.awt.*;

public class TestLayout extends JFrame{
    public LayoutTest(){
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        //criando botões
        JButton botao01 = new JButton("Botão 01");
        JButton botao02 = new JButton("Botão 02");
        JButton botao03 = new JButton("Botão 03");
        JButton botao04 = new JButton("Botão 04");
        JButton botao05 = new JButton("Botão 05");

        getContentPane().add(panel);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setVisible(true);        
        pack();
    }
    public static void main(String args[]){
        new LayoutTest();
        
    }
}

FlowLayout

  • É o mais simples e o padrão de todos os JPanels.
  • Organiza os componentes um ao lado do outro em linha, da esquerda para a direita, usando o tamanho que você definiu ou, se não houver definição, seus tamanhos preferenciais. Quando a linha fica cheia, uma nova linha é criada.

FlowLayout

import javax.swing.*;
import java.awt.*;

public class TestLayout extends JFrame{
    public LayoutTest(){
        JPanel panel = new JPanel();
        //criando botões
        JButton botao01 = new JButton("Botão 01");
        JButton botao02 = new JButton("Botão 02");
        JButton botao03 = new JButton("Botão 03");
        JButton botao04 = new JButton("Botão 04");
        JButton botao05 = new JButton("Botão 05");
        
        panel.add(botao01);
        panel.add(botao02);
        panel.add(botao03);
        panel.add(botao04);
        panel.add(botao05);

        getContentPane().add(panel);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setVisible(true);        
        pack();
    }
    public static void main(String args[]){
        new LayoutTest();
        
    }
}

FlowLayout

Gridlayout

Organiza os componentes em um grid (tabela) com várias linhas e colunas (podemos definir no construtor).

GridLayout

import java.awt.*;

import javax.swing.*;

public class ExemploGridLayout {

    public static void main(String[] args){
        //Criaremos alguns botões

        JButton bt1 = new JButton("Botão 1");
        JButton bt2 = new JButton("Botão 2");
        JButton bt3 = new JButton("Botão 3");
        JButton bt4 = new JButton("Botão 4");

        JFrame minhaJanela = new JFrame("Exemplo de GridLayout");

        minhaJanela.setSize(400,400);
        minhaJanela.setLocation(100,100);
        minhaJanela.getContentPane().setLayout(new GridLayout(2,2));
        minhaJanela.getContentPane().add(bt1);
        minhaJanela.getContentPane().add(bt2);
        minhaJanela.getContentPane().add(bt3);
        minhaJanela.getContentPane().add(bt4);
        minhaJanela.setVisible(true);      
    }

}

GridLayout

GridBagLayout

  • É o mais complexo layout e é baseado no GridLayout. A idéia também é representar a tela como um grid com linhas e colunas.

GridBagLayout

Pacote Java i.o

Entrada e saída

IO - input / output

  • A parte de controle de entrada e saída de dados (conhecido como io) é orientada a objetos e usa os principais conceitos mostrados até agora: interfaces, classes abstratas e polimorfismo.

  • A ideia atrás do polimorfismo no pacote java.io é de utilizar fluxos de entrada (InputStream) e de saída (OutputStream) para toda e qualquer operação, seja ela relativa a um arquivo, a um campo de banco de dados, a uma conexão remota via sockets, ou até mesmo às entrada e saída padrão de um programa (normalmente o teclado e o console).

Entrada e Saída

  • Em determinadas situações, é necessário que uma aplicação faça entrada e saída byte a byte. As classes da plataforma Java responsáveis pela leitura e escrita byte a byte são InputStream e OutputStream respectivamente. Essas duas classes estão no pacote java.io.

Entrada e Saída

  • FileInputStream: para entrada baseada em bytes de um arquivo.
  • FileOutputStream: para saída baseada em bytes para um arquivo.
  • RandomAccessFile: para entrada e saída baseada em bytes de e para um arquivo.
  • FileReader: para entrada baseada em caracteres de um arquivo.
  • FileWriter: para saída baseada em caracteres para um arquivo.

InputStream

  • Responsável pela leitura de arquivos.
class TestaEntrada {
    public static void main(String[] args) throws IOException {
        InputStream is = new FileInputStream("arquivo.txt");
        int b = is.read();
    }
}
  • A classe InputStream é abstrata e FileInputStream uma de suas filhas concretas, assim como o ObjectInputStream, AudioInputStream, ByteArrayInputStream, entre outras.

InputStream

  • Classes que derivam da InputStream
    • AudioInputStream

    • FileInputStream

    • ObjectInputStream

       

OutputStream

  • Modela um fluxo de saída sem um destino específico definido.
  • Diversas classes herdam direta ou indiretamente da classe OutputStream para especificar um determinado tipo de destino de dados.

OutputStream

  • Classes que derivam de OutPutStream
    • ByteArrayOutputStream

    • FileOutputStream

    • ObjectOutputStream

       

Printscream

Scanner s = new Scanner(System.in);
PrintStream ps = new PrintStream("file.txt");
while (s.hasNextLine()) {
    ps.println(s.nextLine());
	        }
  • A partir do Java 5, temos a classe java.util.Scanner, que facilita bastante o trabalho de ler de um InputStream. Além disso, a classe PrintStream possui um construtor que já recebe o nome de um arquivo como argumento. Dessa forma, a leitura do teclado com saída para um arquivo ficou muito simples:

Atividade 01

  • Digite o código abaixo:
public class TestaEntrada {

	public static void main(String[] args) throws IOException {
		InputStream is = new FileInputStream("arquivo.txt");
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		
		String s = br.readLine();
		
		while(s != null){
			System.out.println(s);
			s = br.readLine();
		}
		br.close();
	}
}

Tratamento de eventos

Controle de fluxo

  • As aplicações em geral precisam de alguns eventos para o funcionamento completo do programa.
  • Eventos são tarefas realizadas quando um usuário faz a interação com algum componente GUI, convertendo as ações do usuário em eventos, exemplo:
    • Quando ocorre uma ação (ActionEvent);
    • Clique do mouse (MouseEvent);
    • Apertar em uma tecla (KeyEvent);
    • Fechar uma janela (WindowEvent);

Handler

  • São respostas realizadas em um evento.
  • Cada tipo de evento precisa ser implementada uma interface de escuta.

Tratamento

  • É o processo total de responder a eventos.

Funcionamento

  • Existem três elementos para o funcionamento do tratamento de evento.
    • Origem do Evento: é o componente GUI com qual o usuário interage.
    • Objeto do Evento: contém os dados do evento invocado, sendo como uma referência à origem do evento e quaisquer informações específicas do evento que podem ser exigidas pelo ouvinte para testar o evento.
    • Ouvinte do Evento: é um objeto que é notificado pela origem de evento quando um evento ocorre.

Handler

  • Quando um evento acontece, é realizado o despacho (dispatching) para os ouvintes apropriados. Esse despacho é o processo em que o componente GUI chama um método de tratamento de evento em cada um de seus ouvintes, sendo registrados para o tipo de evento ocorrido.

Atividade

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class CapturaEventoBotao implements ActionListener {
	
	private JButton botao;
	
	public void janela(){
		JFrame frame = new JFrame();
		botao = new JButton();
		
		//REGISTRA O EVENTO
		botao.addActionListener(this);

		frame.getContentPane().add(botao);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(300,100);
		frame.setVisible(true);
	}
	
	@Override
	public void actionPerformed(ActionEvent evento) {
		botao.setText("Botão foi clicado!");
		
		//ALTERA A FONTE 
		botao.setFont(new Font("SansSerif", Font.BOLD, 20));	
	}
	
	public static void main(String[] args) {
		CapturaEventoBotao captura = new CapturaEventoBotao();
		captura.janela();
	}
}

UML

Linguagem de Modelagem unificada

UML

  • A UML é uma linguagem gráfica e textual usada no desenvolvimento orientado a objetos (OO) para visualização, especificação, construção e documentação de informações referentes a um software.

UML

  • Surgiu da fusão de três grandes métodos, do BOOCH, OMT (Rumbaugh) e OOSE (Jacobson). Esta linguagem de modelagem não é proprietária, não é um método de desenvolvimento. Têm como papel auxiliar a visualizar o desenho e a comunicação entre objetos. Ela permite que desenvolvedores visualizem os produtos de seu trabalho em diagramas padronizados, e é muito usada para criar modelos de sistemas de software.

UML

  • A Linguagem Unificada de Modelagem possui diagramas (representações gráficas do modelo parcial de um sistema) que são usados em combinação, com a finalidade de obter todas as visões e aspectos do sistema.

Diagramas estruturais

  • De Classe: Este diagrama é fundamental e o mais utilizado na UML e serve de apoio aos outros diagramas. O Diagrama de Classe mostra o conjunto de classes com seus atributos e métodos e os relacionamentos entre classes.

Diagramas estruturais

  • De Objeto: O diagrama de objeto esta relacionado com o diagrama de classes e, é praticamente um complemento dele. Fornece uma visão dos valores armazenados pelos objetos de um Diagrama de Classe em um determinado momento da execução do processo do software.

Diagramas estruturais

  • De Componentes: Está associado à linguagem de programação e tem por finalidade indicar os componentes do software e seus relacionamentos.

Diagramas estruturais

  • De implantação: Determina as necessidades de hardware e características físicas do Sistema.
  • De Pacotes: Representa os subsistemas englobados de forma a determinar partes que o compõem.
  • De Estrutura: Descreve a estrutura interna de um classificador.

Diagrama estrutural de Classe

  • Graficamente, as classes são representadas por retângulos incluindo nome, atributos e métodos.

NomeDaClasse

+ Atributo1

- Atributo2

# Atributo3

+ Método1

- Método2

Visibilidade

  • + público: visível em qualquer classe de qualquer pacote
  • # protegido: visível para classes do mesmo pacote
  • - privado: visível somente para classe 

Relacionamentos

  • Nome: descrição dada ao relacionamento (faz, tem, possui,...)
  • Navegabilidade: indicada por uma seta no fim do relacionamento
  • Multiplicidade: 0..1, 0..*, 1, 1..*, 2, 3..7
  • Tipo: associação (agregação, composição), generalização e dependência
  • Papéis: desempenhados por classes em um relacionamento

Realcionamentos

Relacionamento de associação

  • Uma associação é um relacionamento estrutural que indica que os objetos de uma classe estão vinculados a objetos de outra classe.
  • Uma associação é representada por uma linha sólida conectando duas classes.

Indicadores de Multiplicidade

  • 1 Exatamente um
  • 1..* Um ou mais
  • 0..* Zero ou mais (muitos)
  • * Zero ou mais (muitos)
  • 0..1 Zero ou um
  • m..n Faixa de valores (por exemplo: 4..7)

Exemplo

  • Um Estudante pode ser
    • um aluno de uma Disciplina
    • e um jogador da Equipe de Futebol
  • Cada Disciplina deve ser cursada por no mínimo 1 aluno
  • Um aluno pode cursar de 0 até 8 disciplinas

RELACIONAMENTO DE Agregação

  • É um tipo especial de associação
  • Utilizada para indicar “todo-parte”
  • Um objeto “parte” pode fazer parte de vários objetos “todo”

Composição

  • É uma variante semanticamente mais “forte” da agregação
  • Os objetos “parte” só podem pertencer a um único objeto “todo” e têm o seu tempo de vida coincidente com o dele
  • Quando o “todo” morre todas as suas “partes” também morrem

Diagramas Comportamentais

  • De Caso de Uso (Use Case): Geral e informal para fases de levantamento e análise de Requisitos do Sistema.
  • Utilizam como primitivas Atores, Casos de Uso
    e Relacionamentos. Como ocorre tambü m com outros diagramas.

Diagramas Caso de Uso

  • Atores são representacões de entidades externas mas que interagem com o sistema durante sua execução. Basicamente, a interação de atores com o sistema se da através de comunicações (troca de mensagens). As entidades externas representadas pelos atores podem ser :
  • Pessoas: usuário, secretária, aluno, professor, administrador, etc.
  • Dispositivos: impressora, máquina ou outro equipamentos externo.
  • Hardwares: placa de modem, placa de controle, etc.
  • Software: sistema de banco de dados, aplicativos, etc.

Atores

Atores

Relação entre casos de usos e atores

Relação entre casos de usos e atores

Banco de Dados

Conceitos Fundamentais

Conceito

  • É uma coleção de dados inter-relacionados, representando informações sobre um domínio específico

SGBD

  • Sistemas de Gerenciamento de Bancos de Dados
  • São softwares que gerenciam o banco de dados em si.

Oracle

Oracle

  • O banco de dados da Oracle é caracterizado por ser um banco relacional robusto, seguro e com capacidade de gerenciar enormes quantidades de dados. Outra vantagem é sua versatilidade, uma vez que pode ser instalado em diversos sistemas operacionais, como Linux e Windows. A opção por essa solução deve considerar um hardware potente que possa permitir o desempenho adequado do software

PostgreSQL

PostGreSql

  • Tendo como característica principal sua condição open source, o PostgrSQL também é um banco de dados relacional, que se assemelha em estrutura e linguagem com a opção da Oracle, embora não seja tão sofisticado nem exija hardwares tão poderosos para seu funcionamento. Muito usado para sistemas web, atende sistemas corporativos com bom desempenho e também está disponível para diversas plataformas operacionais, sendo o Linux a mais apropriada pela característica gratuita da ferramenta. A principal crítica negativa é a falta de uma interface administrativa.

SQL SERVER

SQL Server

  • Bastante difundido no mercado e com bom desempenho, o SQL Server é o sistema de banco de dados da Microsoft. É também relacional, e entre seus principais atrativos está uma administração mais facilitada, quando comparado à mesma solução oferecida pela Oracle. A desvantagem era sua execução exclusiva em sistema operacional da Microsoft, o que limitava sua utilização. Recentemente a empresa lançou a versão  para o Linux.

MYSQL

MySQL

  • Adquirido pela Oracle, este é um SGDB que tem como características as licenças de software livre e comercial executado em diferentes plataformas, como Linux, Windows, Solaris, FreeBSD, MacOS, entre outros. O  MySQL é bastante usado no desenvolvimento de web sites em linguagem PHP e também servidores Apache.

Banco de Dados Relacional

Armazena, manipula e recupera dados unicamente estruturados na forma de tabelas.

BANCO DE DADOS não RELACIONAL

Também denominado NoSQL.

A grande vantagem/desvantagem consiste que não podem exigir esquemas de tabela fixa e, geralmente, não suportam instruções e operações de junção SQL.

Bancos de dados NoSQL armazenam os dados com técnicas que visam oferecer escalabilidade horizontal como a computação nas nuvens e a demanda das grandes empresas da internet dos dias atuais.

Banco de Dados não relacional

  • MongoDB
  • Apache Cassandra

MySql Sever

Iniciando os estudos

MySql

  • É um sistema de gerenciamento de banco de dados (SGBD), que utiliza a linguagem SQL (Structured Query Language ou Linguagem de Consulta Estruturada) como interface
  • Atualmente é um dos maiores SGBD’s do mundo, com mais de 10 milhões de instalações e vem sendo usado inclusive em projetos de grande porte em grandes empresas.

Empresas que usam MySql

  •  NASA
  • Friendster
  • Banco Bradesco
  • Dataprev
  • HP
  • Nokia
  • Sony
  • Lufthansa
  • U.S. Army
  • U.S. Federal Reserve Bank
  • Associated Press
  • Alcatel
  • Cisco Systems

Principais características

  • Portabilidade (suporta praticamente qualquer plataforma atual);
  • Compatibilidade (existem drivers ODBC, JDBC e .NET e módulos de interface para diversas linguagens de programação, como Delphi, Java, C/C++, C#, Visual Basic, Python, Perl, PHP,ASP e Ruby
  • Excelente desempenho e estabilidade;
  • Pouco exigente quanto a recursos de hardware;
  • Facilidade de uso;
  • É um Software Livre com base na GPL (entretanto, se o programa que acessar o Mysql não for GPL, uma licença comercial deverá ser adquirida);
  • Suporta Triggers;
  • Interfaces gráficas (MySQL Toolkit) de fácil utilização cedidos pela MySQL Inc.

Interface Gráfica

Interface Gráfica

Usando o Mysql no terminal Linux

  • Utilize o seguinte comando para acessar o mysql no terminal linux
    • mysql -h localhost -u root -p
  • mysql - evocamos o servidor
    -h - dizemos que o próximo dado é referente ao host
    localhost - informamos o o host
    -u - dizemos que o próximo dado é referente ao usuário
    root - informamos o usuário
    -p - dizemos que o próximo dado é referente a senha

Criar um banco de Dados

  • A sintaxe é bem intuitiva e com um leve conhecimento da língua inglesa fica mais fácil ainda de entender.
    • ​CREATE DATABASE cadastroutd;
  • ​Após criar o bando de dados, precisamos avisar ao mysql que vamos usá-lo, para isso basta escrevermos.
    • ​USE cadastroutd;

Criar Tabelas

  • CREATE TABLE cadastroAluno( codigo int(4) AUTO_INCREMENT, nome varchar(30) NOT NULL, cpf varchar(50), email varchar(50), PRIMARY KEY (codigo)
    );

Criar Tabelas

  • AUTO_INCREMENT pode ser utilizado para automatizar um código que sirva de chave primária de uma tabela.
  • PRIMARY KEY define a chave primária da tabela, isto é, o campo que serve como chave da tabela e que não pode ser repetido.
  • NOT NULL define que um determinado campo seja de preenchimento obrigatório.

Inserir Dados

  • INSERT INTO cadastroAluno(codigo, nome, email) VALUES (null, “Ricardo”, “ricoarrigoni@gmail.com”) ;
    INSERT INTO cadastroAluno(codigo, nome, email) VALUES (null, “João”, “joao@gmail.com”) ;
    INSERT INTO cadastroAluno(codigo, nome, email) VALUES (null, “Maria”, “maria@gmail.com”) ;

Select

  • SELECT * FROM cadastroAluno;

Select

  • Todos os registros da tabela foram retornados. Isso se deu porque o uso do SELECT * faz com que a consulta retorne todos os valores da tabela.
  • Mas o comando select permite diversas variações e combinações nele, podemos buscar exatamente o que queremos e do jeito que queremos.
    • SELECT email FROM cadastroAluno;

Ordenação

  • Se quisermos que os registros retornados venham ordenados, nós podemos usar o comando ORDER BY, basta dizer pelo que você quer ordenar que ele traz o registro ordenadoTodos os registros da tabela foram retornados.
    • SELECT * FROM cadastroAluno ORDER BY nome asc;

Alter Table

  • Para alterar a tabela inserindo mais uma nova coluna.
    • ALTER TABLE cadastroAluno ADD COLUMN nacionalidade VARCHAR(30);
  • Para deletar a coluna use o comando abaixo:
    • ALTER TABLE cadastroAluno DROP COLUMN nomedacoluna;

Alter Table

  • Para inserir uma nova coluna após uma determinada coluna:
    • ALTER TABLE cadastroAluno ADD COLUMN nascimento DATE AFTER nome;

Alter Table

  • Para alterar as configurações de uma coluna
    • ALTER TABLE cadastroAluno MODIFY COLUMN cpf VARCHAR(35) UNIQUE DEFAULT '';

Alter Table

  • Para alterar o nome de uma tabela
    • ALTER TABLE cadastroAluno RENAME TO cadastroDeAluno;

Update

  • Para alterar um registro, usamos o comando update, com ele é possível editar os campos de sua tabela e colocar outro valor neles.
    • UPDATE cadastroAluno SET nome=”Ricardo Arrigoni” WHERE codigo=1;

Delete

  • Responsável por remover todo e qualquer registro do bando de dados.
  • OBS.: Uma vez executado, esse comando não é reversível, portanto tome bastante cuidado ao deleter algum registro de seu banco de dados.
    • DELETE FROM cadastroAluno WHERE codigo=3;
  • Para excluir uma tabela utilize o seguinte comando
    • DROP TABLE cadastroAluno;
  • Para excluir todos os registros de uma tabela
    • TRUNCATE TABLE cadastroAluno;
  • Para excluir uma base de dados utilize o seguinte comando
  • DROP DATABASE cadastroutd;

 

JDBC

Java Database Connectivity

pOR QUE USAR BANCO?

  • Muitos sistemas precisam manter as informações com as quais eles trabalham.

    • permitir consultas futuras;

    • geração de relatórios;

    • possíveis alterações nas informações.

       

       

pERSISTÊNCIA

  • Processo de armazenamento de dados.

  • JDBC é a biblioteca de persistência em banco de dados relacionais do Java.

  • Existem diversas ferramentas do tipo ORM (Object Relational Mapping) que facilitam bastante o uso do JDBC.

Protocolo

  • Necessidade de dois computadores se comunicarem, existe diversos protocolos que permite a troca de informação: o protocolo mais famoso é TCP (Transmission Control Protocol).

  • Com TCP é possível criar um fluxo entre dois computadores.

Protocolo TCP

Protocolo TCP

  • A vantagem de se usar TCP, em vez de criar nosso próprio protocolo de bytes, é que o TCP vai garantir a entrega dos pacotes que transferirmos e criar um protocolo base para isto é algo bem complicado.

Porta

  • Como é possível se conectar a dois pontos? Como é possível ser conectado por diversos pontos?

  • O IP identifica uma máquina, a porta é a solução para identificar diversas aplicações em uma máquina. Se todas as portas de uma máquina estiverem ocupadas, não é possível se conectar a ela enquanto nenhuma for liberada.

Porta

socket

  • É um conector entre a aplicação e o SGBD.

  • Para conectar-se a um banco de dados poderíamos abrir sockets diretamente com o servidor que o hospeda, por exemplo um Oracle ou MySQL e nos comunicarmos com ele através de seu protocolo proprietário.

     

Conexão Java com Banco de Dados.

  • O Java possui um único conjunto de interfaces muito bem definidas que devem ser implementadas. Esse conjunto de interfaces fica dentro do pacote java.sql e nos referiremos

    a ela como JDBC.

Conexão Java com Banco de Dados.

  • Entre as diversas interfaces deste pacote, existe a interface Connection que define métodos para executar uma query (como um insert e select), comitar transação e fechar a conexão, entre outros. Caso queiramos trabalhar com o MySQL, precisamos de classes concretas que implementem essas interfaces do pacote java.sql.

  • Todos os principais bancos de dados do mercado possuem drivers JDBC para que você possa utilizá-los com Java.

Conexão Java com Banco de Dados.

Conexão Java com Banco de Dados.

download jdbc para sql server

  • https://sourceforge.net/projects/jtds/files/

download jdbc para Mysql server

  • https://dev.mysql.com/downloads/connector/

download jdbc para oracle

  • http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html

Vamos para prática

Atividade

  1. No Eclipse crie um novo projeto chamado Agenda​.
  2. Crie uma nova classe chamada ConnectionFactory.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {
    public Connection getConnection() {
        try {
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            return DriverManager.getConnection(
                "jdbc:mysql://localhost/agenda", "root", "utd123456");
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

Atividade

  1. Desenvolva uma classe chamada TextaConexao com método main.
  2. Execute a classe e veja o resultado
package br.com.utd.conexao;

import java.sql.Connection;
import java.sql.SQLException;

public class TestaConexao {

	public static void main(String[] args) throws SQLException {
		Connection connection = new ConnectionFactory().getConnection();
		System.out.println("Conexão aberta!");
		connection.close();

	}

}

Java persitence api

Hibernate

Mapeamento Objeto Relacional

  • Com a popularização do java, logo se percebeu que grande parte do tempo do desenvolvedor era gasto na codificação de queries SQL e no respectivo código JDBC responsável por trabalhar com elas.
  • Por causa das diferenças de padrão ANSI, não era simples a mudança de banco de dados.
  • Java é orientado a objeto e não relacional.

Framework ORM

  • Ferramentas para auxiliar nesta tarefa tornaram-se populares entre os desenvolvedores Java e são conhecidas como ferramentas de mapeamento objeto-relacional (ORM).

Hibernate

  • Hibernate é uma ferramenta ORM open source e é a líder de mercado, sendo a inspiração para a especificação Java Persistence API (JPA).
  • O Hibernate abstrai o seu código SQL, toda a camada JDBC e o SQL será gerado em tempo de execução. 

  • Para download acesse: http://hibernate.org/

Mapeamento

Mapeamento

  • O mapeamento objeto-realcional é o coração do Hibernate e das outras implementações de JPA.
  • Define quais transformações devem ser realizadas nos dados para que essas informações possam navegar da aplicação para o banco de dados e vice-versa.

Entidades

  • @Entity mapea uma classe java para uma tabela no banco de dados. Geralmente a tabela gerada terá o mesmo nome da classe, mas isso pode ser alterado através da anatação @Table.

Definindo restrições

  • Podemos definir algumas restrições para os atributos das nossas entidades através das propriedades da anatoação @Column.
Propriedades Restrição
length Limita a quantidade de caracteres de uma string
nullable Determina se o campo pode possuir valores null ou não
unique Determina se uma coluna pode ter valores repetidos ou não
precision Determina a quantidade de dígitos de um número decimal a serem armazenadas
scale Determina a quantidade de casas decimais de um número decimal

Relacionamentos

  • Relacionamentos entre as entidades de um domínio devem ser expressos na modelagem através de vínculos entre classes.
  • Podemos definir quatro tipos de relacionamentos, de acordo com a cardinalidade.

One to One

  • indica que as tabelas têm relação unívoca entre si. Você escolhe qual tabela vai receber a chave estrangeira.

Exemplo

@Entity
class Estado {
    @Id
    @GeneratedValue
    private Long id;

    @OneToOne
    private Governador governador;
}

One to Many

  • A chave primária da tabela que tem o lado 1 está para ir para a tabela do lado N. No lado N ela é chamada de chave estrangeira

Controle de fluxo

  • No banco de dados, além das duas tabelas correspondentes às classes, deve existir uma terceira tabela para relacionar as tabelas. Essa terceira tabela é chamada de tabela de relacionamento ou join table.

Curso Java Com Banco de Dados - Turma UTD 2017.2

By pakato

Curso Java Com Banco de Dados - Turma UTD 2017.2

Curso Java com Banco de Dados realizado na UTD.

  • 530