Escolar Documentos
Profissional Documentos
Cultura Documentos
Primeiros vamos ver alguns conceitos básicos de programação como por exemplo algoritmos
que são passos a serem seguidos para resolução de um problema e o programa
A programação começa no código fonte com o código fonte pronto o compilador analisa de
forma léxica e sintática transformando em código objeto logo depois e feito a bulid do código
para esse ser executado. Essa e forma que uma linguagem compilada funciona.
Agora e linguagem interpretada que faz a analise léxica e sintática, geração do código sobre
demanda
Temos também a abordagem hibrida que faz uma pre compilação fazendo um bytecode que e
interpretado sob demanda por uma maquina virtual
Cada uma tem suas vantagens na compilada temos mais auxilio da ide e a velocidade do
programa e mais rápido, já na com a interpretada vai ter flexibilidade na manutenção o e o
código fonte não precisa ser recompilado para rodar em outras maquinas
Na forma hibrida tem uma maquina virtual especifica para sistema que esta sendo usado
O que e java?
Uma linguagem de programação com regras sintáticas, mas também e uma plataforma de
desenvolvimento com bibliotecas(api) e ambientes de execução
Estrutura do java:
O java tem class todo o código nas class. Um package e um conjuntos de class e temos o
módulos que e um conjuntos de de package relacionados logo depois temos a aplicação que e
um conjuntos de módulos relacionados
como fazer a entrada de dados estar na Aula2 quando o next e usado toda a variável que for
uma string terá que ser especificada logo depois do next como nextInt, nextDouble...
Calculo aritméticos
Feitos com pow pra indicar potencia, sqr e a raiz e abs o absoluto:
Math.sqrt(x);
g = Math.pow(a,3.0);
h = Math.abs(c);
g = (Math.pow(a,3.0)) / 4;
Errado:
int 5minutes;
int salário;
int salario do funcionario;
Correto:
int _5minutes;
int salario;
int salarioDoFuncionario;
Convenções
• pacotes
• atributos
• métodos
• variáveis e parâmetros
• classes
Operadores bitwise:
Utilizados para programação de mais baixo nível fazendo a leitura de bit a
bit do dado
• str.Split(" ")
Comentarios no java são feitos com // para linha e para bloco se usa /* */
Funções:
Primeira regra de uma função ela teve estar fora do main, mas dentro do public Class
Documento
Segunda regra sempre que elas que a função não retorna nada e necessário usar void
• Construtores
• Sobrecarga
• Encapsulamento
• Herança
• Polimorfismo
• Exemplos:
A forma como a memória funciona quando e colocado Class em no jogo mudo porque
geralmente variáveis são armazenadas na memória stack, quando e possível colocar essas
variáveis em uma Class ela são armazenadas na heap fazendo o endereço de memoria ir para o
stack.
Obs: quando se estar manipulando POO e necessário istanciar esse objeto. E sim é bem
diferente do python:
Discussão
• Toda classe em Java é uma subclasse da classe Object
Membros estáticos
• Também chamados membros de classe
• Aplicações comuns:
• Classes utilitárias
• Declaração de constantes
• Uma classe que possui somente membros estáticos, pode ser uma classe
Métodos estáticos vão ter um valor(resultado) independe do objeto que for chamado. Outra
características e não e possível chamar um método não static o de uma mesma class que seja
static. Quando declara variáveis static o nome da mesma tem que ser todo em másculo e
métodos statics não precisam ser estanciados
Construtor
• É uma operação especial da classe, que executa no momento da
instanciação do objeto
• Usos comuns:
construtor padrão:
Ajuda a definir parâmetros obrigatórios para a class ,apenas tenha cuidado na hora de
instanciar a class já que e necessário ter os parâmetros antes de fazer a própria instancia
Sobrecarga
• É um recurso que uma classe possui de oferecer mais de uma operação com o mesmo
nome, porém com diferentes listas de parâmetros.
Assim o class pode receber nenhum parâmetro, os três ou apenas o name e price
Métodos de acesso
Gettter e setter:
Como já visto o getter serve para proteger o nome da variável e captura a variável o setter faz
mudança nessa variável pra gera tudo automaticamente e só ir no source com o botão direito
Obs: getter e setter são implementados depois dos construtores e claro que eu não preciso
fala que so possível fazer essas implementações em variáveis private, você não seria burro de
fazer isso em uma public ne?
Modificadores de acesso:
Encapsulamento
Usados para proteger as class Sendo o
public: tudo pode ter acesso a ele menos em um modulo em que o package dele não
foi exportado
private: não pode ser acesso por nada apenas pela própria class
nada: int b; pode ser usado em diferentes class no mesmo package
protected: pode ser usado em diferentes class no mesmo package em diferentes
package em um class que herda a que ele esta
“tentáculos” (ponteiros) para caixas. Logo dados de tipo referência iram apenas guarda uma
imagem no Stack para apontar na memória heap onde realmente esta o dado
Como e mostrado no exemplo quando p2 =p1 ele ira somente apontar não guardando o dado
Tipos valor:
Esse iram realmente guarda os dados em uma caixa(variável) para serem utilizados
sem precisa apontar para nada, lembrado que todos os dados primitivos são tipo
valor.
Valores padrão
• Quando alocamos (new) qualquer tipo estruturado (classe ou array),
são atribuídos valores padrão aos seus elementos
• números: 0
• boolean: false
• char: caractere código 0
• objeto: null
Garbage collector
• É um processo que automatiza o gerenciamento de memória de um
programa em execução
• O garbage collector monitora os objetos alocados dinamicamente
pelo programa (no heap), desalocando aqueles que não estão mais
sendo utilizados.
Desalocação por escopo
Esse assunto já foi visto em python quando variáveis são declarada no escopo de if por
exemplo elas iram ser utilizadas iram existir lá, mas quando esse bloco de código acaba
as variáveis são descartadas da memoria
Como nesse exemplo onde a variável foi criada e logo descartada
Vetores
• Em programação, "vetor" é o nome dado a arranjos unidimensionais
• Arranjo (array) é uma estrutura de dados:
• Homogênea (dados do mesmo tipo)
• Ordenada (elementos acessados por meio de posições)
• Alocada de uma vez só, em um bloco contíguo de memória
• Vantagens:
• Acesso imediato aos elementos pela sua posição
• Desvantagens:
• Tamanho fixo
• Dificuldade para se realizar inserções e deleções
Array também pode apontar para dados de referencia guardando um objeto em cada
índice
Expressão condicional ternária
Para fazer esse processo naturalmente sem o uso do chace temos a wrapper classes São
classes equivalentes aos tipos primitivos
• Pois tipos referência (classes) aceitam valor null e usufruem dos recursos OO
Por exemplo atributos usado a wrapper class podem ter valor null fazendo o usuário definir ou
não a variável
Obs: os comandos fazem a conversão dos tipos
Lista
• Lista é uma estrutura de dados:
• Vantagens:
• Tamanho variável
• Desvantagens:
Matrizes
• Em programação, "matriz" é o nome dado a arranjos bidimensionais
• Vantagens:
• Desvantagens:
• Tamanho fixo
Conceitos importantes
• Data-[hora] local:
[hora] opcional
• Data-hora global:
• Duração:
• Data-hora global:
Início e fim do evento? "21/08/2022 às 14h até 16h (horário de São Paulo)"
• Horário de Londres
• Manaus: GMT-4
• Portugal: GMT+1
• "US/Pacific"
• "America/Sao_Paulo"
• etc.
2022-07-21
2022-07-21T14:52
2022-07-22T14:52:09
2022-07-22T14:52:09.4073
Data-hora global:
2022-07-23T14:52:09Z
2022-07-23T14:52:09.254935Z
2022-07-23T14:52:09-03:00
• (agora) ➞ Data-hora
• Obter dados de uma data-hora local • Data-hora local ➞ dia, mês, ano, horário
LocalDateTime
• Data-hora global
Instant
• Duração
Duration
• Outros
ZoneId
ChronoUnit
Enumerações
É um tipo especial que serve para especificar de forma literal um
conjunto de constantes relacionadas, usada para definir valores que são constantes
o programa sempre vai imprimir o enum como string. Para converter uma string em enum
Composição
• Vantagens
• Coesão
• Flexibilidade
• Reuso
• Nota: embora o símbolo UML para composição (todo-parte) seja o diamante preto, neste
contexto estamos chamando de composição qualquer associação
Por exemplo nesse código onde temos duas associações, com uma sendo criado uma
lista na própria class sem sendo necessário ser colocada no construtor, pois já esta
instanciada.
StringBuilder
Usado para ajuda na formatação do toString adicionando e configurando como esse
atributos/texto iram ser mostrados um exemplo
Relações entre classes
Associação: e uma relação que um elemento com outro do tipo fraca que um não depende do
outro
Agregação: uma associação do tipo fraca um elemento conecta a outro, mas um elemento
existe sem outro um sendo necessário de outro para realiza certa tarefa.
Composição: e uma forma agregação de forma mais específica nesse termo tudo vai ser mais
ou menos iguala a agregação, só que aqui uma depende da outra pra existir
Herança
• É um tipo de associação que permite que uma classe herde todos dados e comportamentos
de outra
• Definições importantes
• Vantagens
• Reuso
• Polimorfismo
• Sintaxe
• class A extends B
Herança uma relação de um para um em que a classe que a super class vai doar todos seu
atributos e comportamento para a sub class
Também temos o conceito de generalização onde a class mais comum a superclass, e a
subclasse vai ser usada para trabalhos mais específicos.
Checklist
• Upcasting quando fazemos um objeto mais especifico se passa por um mais generico
• Downcasting
• Palavra instanceof
sobrescrito
código
Quando e código e rescrito para ser utilizado na subclasse, usado praticamente em dois
lugares em métodos e construtores
No numero um temos a marcação @Overriede, com ela marcamos o código para ser mais
legível e avisa ao compilador/ide que ali temos um sobreposição
Logo abaixo estar a assinatura do código que tem que ser igual para temos esse efeito
Palavra super
@Override
super.withdraw(amount);
balance -= 2.0;
Recordando: usando super em construtores
@Override
balance -= amount;
Pra quê?
garantir que uma classe não seja herdada, ou que um método não
seja sobreposto.
inconsistências
Polimorfismo
Em Programação Orientada a Objetos, polimorfismo é recurso que
x.withdraw(50.0);
y.withdraw(50.0);
Classes abstratas
• São classes que não podem ser instanciadas
Questionamento
e BusinessAccount?
• Resposta:
Reuso
Uma exceção é uma condição causada por um erro em tempo de execução que interrompe o
fluxo normal de execução. Esse tipo de erro pode ter muitas causas, como uma divisão por
zero.
Quando uma exceção ocorre em Java, é criado um objeto, chamado de exception object, que
contém informações sobre o erro, seu tipo e o estado do programa quando o erro ocorreu.
Após ser criado, esse objeto é entregue para o sistema de execução da Máquina Virtual Java
(MVJ), processo chamado de lançamento de exceção.
Quando a exceção é lançada por um método, o sistema de execução vai procurar na pilha de
chamadas (call stack) um método que contenha um código para tratar essa exceção. O bloco
de código que tem por finalidade tratar uma exceção é chamado de exception handler
(tratador de exceções).
A busca seguirá até que o sistema de execução da MVJ encontre um exception handler
adequado para tratar a exceção, passando-a para ele. Quando isso ocorre, é verificado se o
tipo do objeto de exceção lançado é o mesmo que o tratador pode solucionar. Se for, ele é
considerado apropriado para aquela exceção. Quando o tratador de exceção recebe uma
exceção para tratar, diz-se que ele captura (catch) a exceção.
Quando fornece um código capaz de lidar com a exceção ocorrida, o programador tem a
possibilidade de evitar que o programa seja interrompido. Contudo, se nenhum tratador de
exceção apropriado for localizado pelo sistema de execução da MVJ, o programa será
terminado.
Estrutura try-catch
• Bloco try
• Contém o código que representa a execução normal do trecho de código que
pode acarretar em uma exceção
• Bloco catch
• Contém o código a ser executado caso uma exceção ocorra
• Deve ser especificado o tipo da exceção a ser tratada (upcasting é permitido)
• Demo
Bom já que as exceções ficam em pilhas e importante saber o caminho dessas
exceções
Com o comando printStackTrace e possível saber isso
Aqui temos a exceção sendo tratada e comando sendo chamando pelo apelido da
exceção sendo “e” nesse caso
O rastro desse erros e bem fácil de identificar, mas vou deixa a aula do curso aqui só
pra relembra em caso de duvida 171
O erro aconteceu na linha 18 essa linha foi chamada pela linha 29 que foi chamada
pela 9, mas o erro estar na linha 18
Bloco finally
try {
}
catch (ExceptionType e) {
}
finally {
}
• É um bloco que contém código a ser executado independentemente de ter
ocorrido ou não uma exceção.
• Exemplo clássico: fechar um arquivo, conexão de banco de dados, ou outro
recurso específico ao final do processamento.
Resumo da aula
• Cláusula throws: propaga a exceção ao invés de trata-la
• Cláusula throw: lança a exceção / "corta" o método
• Exception: compilador obriga a tratar ou propagar
• RuntimeException: compilador não obriga
• O modelo de tratamento de exceções permite que erros sejam tratados de forma
consistente e flexível, usando boas práticas
• Vantagens:
• Lógica delegada
• Construtores podem ter tratamento de exceções
• Possibilidade de auxílio do compilador (Exception)
• Código mais simples. Não há aninhamento de condicionais: a qualquer momento que
uma exceção for disparada, a execução é interrompida e cai no bloco catch
correspondente.
• É possível capturar inclusive outras exceções de sistema
Classes
• File - Representação abstrata de um arquivo e seu caminho
• https://docs.oracle.com/javase/10/docs/api/java/io/File.html
• Scanner - Leitor de texto
• https://docs.oracle.com/javase/10/docs/api/java/util/Scanner.html
• IOException (Exception)
• https://docs.oracle.com/javase/10/docs/api/java/io/IOException.html
• FileReader (stream de leitura de caracteres a partir de arquivos)
[
• https://docs.oracle.com/javase/10/docs/api/java/io/FileReader.html
• BufferedReader (mais rápido)
• https://docs.oracle.com/javase/10/docs/api/java/io/BufferedReader.html
• https://stackoverflow.com/questions/9648811/specific-difference-
betweenbufferedreader-and-filereader
Bloco try-with-resources
• É um bloco try que declara um ou mais recursos, e garante que esses
recursos serão fechados ao final do bloco
• Disponível no Java 7 em diante
Classes
• FileWriter (stream de escrita de caracteres em de arquivos)
• https://docs.oracle.com/javase/10/docs/api/java/io/FileWriter.html
• Cria/recria o arquivo: new FileWriter(path)
• Acrescenta ao arquivo existente: new FileWriter(path, true)
• BufferedWriter (mais rápido)
• https://docs.oracle.com/javase/10/docs/api/java/io/BufferedWriter.html
Manipulando pastas com File
1 criando um array para comporta a path.listfiles(file::isDirectory)
Isso vai listar todas as a suas pastas
2 ira mostra todos so files do arquivo
3 uma função que para cria pastas retornado um boolean
Interfaces
Como um construtor define um os atributos que serão usados a interface obriga que a
classe que for implementa por ela tenho os métodos preá definidos
Usando a interface na forma mais genérica quando for preciso utiliza a classe
Que vai ser implementada por uma classe abstrata com os atributos pre definidos
como o atributo color
Fazendo a classe mais especificas herdarem a “AbstractsShape”
Problema do diamante
A herança múltipla pode gerar o problema do diamante: uma ambiguidade causada
pela existência do mesmo método em mais de uma superclasse.
Herança múltipla não é permitida na maioria das linguagens!
E possível ter implementação de varias interfaces de uma classe, mas isso e discutido
se seria ou não um herança múltipla
Interface Comparable
Forma pelo método int compareTo(T o) T qual tipo de classe “o” o próprio objeto
System.out.println("maria".compareTo("alex"));
System.out.println("alex".compareTo("maria"));
System.out.println("maria".compareTo("maria"));Output:
12
-12
0
Implementada no objeto que for necessário compara “Comparable<tipo do objeto>”
Assim sua lista sera ordenada, para fazer em ordem decrescente “return
-variavel.compareTo(Other.getVariavel)”
Esse negativo vai fazer toda a magica de inverte os returns dos números
Obs: logica parecido com equals, mas diferente se tiver duvida aula 234
Default methods
• A partir do Java 8, interfaces podem conter métodos concretos.
• A intenção básica é prover implementação padrão para métodos, de modo
a evitar:
• 1) repetição de implementação em toda classe que implemente a interface
• 2) a necessidade de se criar classes abstratas para prover reuso da implementação
• Outras vantagens:
• Manter a retro compatibilidade com sistemas existentes
• Permitir que "interfaces funcionais" (que devem conter apenas um método)
possam prover outras operações padrão reutilizáveis
Lembrando que esse get e colocado ai apenas para não dar erro no código. Ele tem
que ser rescrito no classe que a interface for implementada
Generics
• Generics permitem que classes, interfaces e métodos possam ser parametrizados por tipo.
Seus benefícios são:
• Reuso
• Type safety
• Performance
Nesse código não estamos parametrizando a class, por isso temos que falar que o método
recebe um objeto T de tipo T <T> T, como e usado o comparable aqui só será aceito tipos de
elementos T que extends o tipo comparable
E possível fazer isso, deixando que qualquer super do T também seja aceita nesse
código utilizado o curinga
Wildcard types
Generics são invariantes , por exemplo uma lista integer não pode ser convertida para uma
lista object por isso isso utilizamos o <?> o super tipo de qualquer objeto
bounded wildcards
quando e usado o <?> ele fala que o código aceita qualquer tipo de lista aqui, mas se
quisermos delimitar esse acesso e possível coloca que “? “ tem que ser uma sub class
ou super class de alguma class especifica <? Extends shape> podendo ser shape ou
qualquer class shape e possível também usar <? Super number> coloca isso so e
possível usar number e superclass de number
Com isso temos dois grandes problemas envolvendo get/put
Covariância
Onde e usado um classe e possível pega um class suas intensos, sendo possível converter,
acessa, mas não e possível adiciona pois o compilador não sabe o tipo da class que esse dado
vai podendo esse dado ser compatível ou não com sua futura class. Get ok
Contravariância
Quando e falando que o generic vai aceita uma class e suas superclass podendo fazer o put
hashCode e equals
é igual a outro
• Se o código de dois objetos for igual, muito provavelmente os objetos são iguais (pode haver
colisão)
Set <T>
• Principais implementações:
• clear()
• size()
• removeIf(predicate)
Map<K,V>
• https://docs.oracle.com/javase/10/docs/api/java/util/Map.html
• Principais implementações:
• clear()
• size()
Programação funcional
Primeiro vamos voltar um pouco na interface comparable usada para compara e ordena lista
etc. Como na programação a vários formas de fazer uma mesma coisa, aqui não e diferente
sendo possível utilizar a inteface funcional(que tem apenas um método abstrato/obrigatório)
comparator para o mesmo uso criando uma class que implementa essa
Diferente da comparable onde a interface era implementada onde ira ser usada, aqui e criada
outra class isso e usado pois a manutenção fica mais fácil de ser realizada
Só que novamente e possível fazer isso de varias formas com o comparator em implementado
em uma class separada como vimos antes ou como:
• Comparator objeto de classe anônima onde temos a instanciação do class com método na
class programan com
• Comparator objeto de expressão lambda sem chaves onde não e preciso instanciar o
comparator e coloca o tipo das variáveis que entram nesse código
• Comparator expressão lambda "direto no argumento" não e mais preciso de quase nada so a
expressão que pode ser jogada em uma variável ou direto no método sort (arrow function)
Paradigmas de programação
• Orientado a objetos (C++, Object Pascal, Java (< 8), C# (< 3))
• Lógico (Prolog)
Programação funcional
Sem mutações de dados: significa que um objeto de dados não deve ser
alterado após ser criado.
Nenhum estado implícito: O estado oculto / implícito deve ser evitado. Na
programação funcional, o estado não é eliminado, mas tornado visível e
explícito
Isso significa:
Sem efeitos colaterais: Uma função ou operação não deve alterar nenhum
estado fora do seu escopo funcional. Ou seja, uma função deve retornar apenas
um valor ao invocador e não deve afetar nenhum estado externo. Isso significa
que os programas são mais fáceis de entender.
Somente funções puras: o código funcional é idempotente. Uma função deve
retornar valores apenas com base nos argumentos passados e não deve afetar
(efeito colateral) ou depender do estado global. Tais funções sempre produzem
o mesmo resultado para os mesmos argumentos.
Transparência referencial
Uma função possui transparência referencial se seu resultado for sempre o mesmo
Por exemplo se e usado um api para realizar um calculo e essa api tem números que podem
varia esse faz com que mesmo colocando os mesmo elemento o calculo pode sair diferente
Funções lambdas
São funções de primeira classe não nomeadas
Recursão
Tenta fazer o que o loop faz só que de forma mais limpa, mas geralmente mais limpo não que
dizer mais legível e também um recursão pode estoura a pilha(stack overflow) e também e
mais lenta que a forma interativa(loop)
Interface funcional
Funções que só tem um método abstrato . Suas implementações pode ser passada com
lambdas como e visto no comparator e:
• Predicate
• https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html
• Function
• https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html
• Consumer
• https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html
Predicate
Interface funcional com o método test retorna um booleano, parecido com o comparator
pode ser usado criando Implementação da interface e passado a instância para o removeif()
por exemplo
método static trabalha com o objeto que vai ser passado como parâmetro e não static vai
trabalha com seu próprio objeto
E possivel tambem fazer um objeto com lambda ou apenas passa a lambda direto na função
Consumer
Com o método accept usado para modificar um elemento baseado na regra que for
implementada
Function
Recebe um dado e converter para outro. Não muda, mas sim converte
Stream
• É uma sequencia de elementos advinda de uma fonte de dados que oferece suporte a
"operações agregadas".
Características
• Pipeline: operações em streams retornam novas streams. Então é possível criar uma cadeia
de operações (fluxo de processamento).
Operações intermediárias e terminais
uma terminal.
• Operação intermediária:
• Operação terminal:
Operações intermediárias
• filter
• map
• flatmap
• peek
• distinct
• sorted
• skip
• limit (*)
* short-circuit
Operações terminais
• forEach
• forEachOrdered
• toArray
• reduce
• collect
• min
• max
• count
• anyMatch (*)
• allMatch (*)
• noneMatch (*)
• findFirst (*)
• findAny (*)
* short-circuit
Usado a aplicação feita em java passando pelo jdbc fazendo o acesso em diferentes bancos de
dados
Aquivo e onde de fato ira ser realizada a conexão, conectar com o banco de dados com o jdbc
e instanciar um objeto Connection que e intasiado com null na cabeça da class
Recuperar Dados
Statement serve para montar um comando sql
o absolute(int) [move para a posição dada, lembrando que dados reais começam em 1]
inserir dados
aqui e vamos usar o PreparedStatement(usado também para fazer atualizações)para recebe
um script sql fazendo a inserção na tabela
Deletando dados
Primeiro tem que ser criado um exception para a integridade referencial um exemplo desse
erro e quando e apagado um departamento por exemplo que e usado a como chave
estrangeira em outro lugar do banco
Como nesse banco não e possível deleta o depatmento 1, porque esta sendo usado em outro
local do banco
Transações
Quando e feito e uma mudança no banco de dados e importante ter um sistema contra falhas
em caso de interrupção na metade da mudança utilizando os comandos
setAutoCommit(false)
commit()
rollback()
O processo for interrompido faz o banco de dados volta ao que era antes
Classes DAO são responsáveis por trocar informações com o SGBD e fornecer operações CRUD
e de pesquisas, elas devem ser capazes de buscar dados no banco e transformar esses em
objetos ou lista de objetos, fazendo uso de listas genéricas (BOX 3), também deverão receber
os objetos, converter em instruções SQL e mandar para o banco de dados.
Toda interação com a base de dados se dará através destas classes, nunca das classes de
negócio, muito menos de formulários.
Se aplicarmos este padrão corretamente ele vai abstrair completamente o modo de busca e
gravação dos dados, tornando isso transparente para aplicação e facilitando muito na hora de
fazermos manutenção na aplicação ou migrarmos de banco de dados.
A partir de agora ou usar ferramentas com sprint tools(sts) uma ide que ajuda no
desenvolvimento com spring, mas tem um plugin para eclipse e postman uma ferramenta que
ajuda a fazer requisições e teste em apis
Não e mais preciso traduzir o banco de dados relacional para objetos agora
http://download.oracle.com/otn-pub/jcp/persistence-2_1-fr-eval-spec/JavaPersistence.pdf
Para trabalhar com JPA é preciso incluir no projeto uma implementação da API (ex: Hibernate).
Um objeto EntityManager encapsula uma conexão com a base de dados e serve para efetuar
operações de acesso a dados (inserção, remoção, deleção, atualização) em entidades (clientes,
produtos, pedidos, etc.) por ele monitoradas em um mesmo contexto de persistência. Escopo:
tipicamente mantem-se uma instância única de EntityManager para cada thread do sistema
(no caso de aplicações web, para cada requisição ao sistema). EntityManagerFactory
https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManagerFactory.html Um
objeto EntityManagerFactory é utilizado para instanciar objetos EntityManager. Escopo:
tipicamente mantem-se uma instância única de EntityManagerFactory para toda aplicação.
Trabalhando com maven
Quando for usar Project maven e necessário atualizar o arquivo xml que vai estar na raiz do
projeto
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
Usado esse código para mudar a versão do código. Logo depois e necessário baixar as
dependências maven (so pesquisa hibernate maven)
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.12.Final</version>
</dependency>
Então eu vou fazer um <dependency> e nele vai ter vários elementos dependency
@entity e o que vai indica que esse objeto vai ser Entity no seu banco de dados
Primeiro que toda fez que for feito algo diferente de consultar o banco de dados temos que
inicia o com em.getTransaction().begin()
Entidade monitorada
Um objeto monitorado é aquele que acabou de ser inserido ou que a foi feito um consulta.
Com o objeto monitorado e possível fazer a remoção dele por exemplo
Basic attributes
Constructors
Serializable
essa class criada em novo package no src/main depois vamos fazer um resource que vai ser o
controlador de sua respectiva Entity
A anotação @RestController no framework Spring é usada para marcar uma classe como um
controlador da web que lida com requisições HTTP e envia respostas HTTP como saída. O
@RestController é uma combinação de duas outras anotações do Spring: @Controller e
@ResponseBody.
1. @Controller: Esta anotação marca a classe como um controlador da web no Spring. Ela
indica que a classe contém métodos que tratam solicitações HTTP.
Utilizando o h2
O H2 é um sistema de gerenciamento de banco de dados relacional em memória que é escrito
em Java. Ele é conhecido por ser um banco de dados leve, rápido e de código aberto,
projetado principalmente para desenvolvimento, testes e prototipagem. O H2 oferece suporte
à maioria dos recursos SQL padrão e pode ser executado como um servidor de banco de dados
ou em modo incorporado dentro de sua aplicação Java.
Checklist:
2 application.properties
3 application-test.properties
spring.profiles.active=test
spring.jpa.open-in-view=true
3 @Autowired UserRepository
5 Persist objects
1 a classe JPARepository ja vai ter todas as funções para manipular o banco de dados
3 @Autowired faz a injeção de dependência de forma automática, o que você faria com uma
função factory por exemplo
4 so colocar os objetos
5 aqui e criando um packge diferente onde ira ficar certa configurações para um perfil
Repository
Seed
Service
Resource
Camada de serviço usada para aliviar a resourse já que a mesma so vai ser utilizada para tratar
requerimentos http a camada mais baixa usada para conversa com o data base a camada
service vai usar a repositor para trabalha entrega a resource
Lembrando que para usar o @autowrided a class tem que ser registrada component
registration podendo ser usada @component que seria uma forma mais genérica, mas e
possível fazer isso de forma mais semântica
Optional
Uma pequena pausa para entender o optional uma class que ajuda com os returns que seriam
null uma class dizendo que ele valor pode existir ou não
Acabamos de retorna esse optional e passa para a variável opt para pega esse elemento
temos:
Opt.get() que retorna o elemento se esse elemento não existir cai um erro
Opt.ifPresent(n-> n+2) recebe uma lambda(consumer) que so vai ser executada se esse valor
existir
OrThrow(()->{return newException)
Entity
Repository
Seed
Service
Resource
Acabou de ser feito uma associação o que causa um via de mão dupla, logo a biblioteca de
serialização que e Jackson fica chamando a duas entidade sem para. O Jsonignore que vai
fazer esse controle melhor das
OrderStatus enum
Quando um enum e colocado como atributo em entidade que vai ser usada em banco de
dados e importante enumera o mesmo, porque cada elemento do enum ira ser um número e
se futuramente for adicionado mais uma categoria essa sequencia será quebrada
Por isso o código o enum vai ficar com uma cara um pouco diferente
essa associação vai ter sua própria tabela e para fazer issso utilizamos jointable que vai cria e
@Embeddable:
A anotação @Embeddable é usada para marcar uma classe como uma classe
incorporável (embeddable class). Uma classe incorporável é uma classe que
não representa uma entidade por si só, mas é usada para representar parte de
uma entidade.
Por exemplo, se você tem uma entidade Endereço que é composta por
várias propriedades (como rua, cidade, estado, CEP), você pode criar uma
classe incorporável Endereço usando @Embeddable para representar
esses campos.
Classes incorporáveis podem ser incorporadas em entidades usando a
anotação @Embedded.
2. @EmbeddedId:
Usada para cria um class que não e uma entity, que vai fazer parte de um ou mais entity
@MapsId e usado para herdar o mesmo id da classe que vai ter a associação . Como nessa esta
sendo feito uma relação de onetoone
@OneToOne(mappedBy="order",cascade = CascadeType.ALL)
nessa aula que aprendi que o importante que o padrão do javaEE e colocar o get na função
para ela ser mostrada na reposta(arquivo json)
insert user
mas no controlador é uma boa pratica fazer o metodo post do http retorna o status 201 que
indica a criação de ago novo no seu sgbd
1. e colocado a annotaion PostMapping para indica o tipo de requisição que esse método
trata
2. @RequestBody desserializa o corpo da requisição http para ser usado como objeto
3. Uma URI (Uniform Resource Identifier) de localização no contexto do protocolo HTTP
(Hypertext Transfer Protocol) é um tipo de URI que é usada para indicar a localização
de um recurso na web. Ela é frequentemente usada em conjunto com respostas HTTP,
em particular nas respostas com códigos de status 201 (Created) e 202 (Accepted).
Quando um servidor HTTP responde a uma solicitação com um código de status 201 ou 202,
ele geralmente inclui uma URI de localização no cabeçalho da resposta, especificando onde o
recurso recém-criado ou o estado aceito pode ser encontrado. Isso fornece ao cliente
informações sobre onde encontrar ou acessar o novo recurso ou o recurso cujo estado foi
aceito.
E para contruir essa uri e usado a class URI utlizando a class ServletUriComponentsBuilder com
o metodo fromCurrentRequest que vai devolver a uri atual da requisição que esta sendo usada
logo depois path(“valor”) adciona algo a mais nessa uri como o numero do id, e
buildAndExpand pega o conteudo que vai ser colocado em path e toUri converte toda essa
merda novamente
delete User
o delete um codigo um pouco diferente, porque na teoria ele não retorna nada tanto que o
service.delete e do tipo void, mas no resourse
e bem simples apenas retorno um noContent que já ajuda com o retono do codigo http sendo
o 204 que informa que algo foi deletado
O erro 405 Método Não Permitido ocorre quando o servidor web está configurado de tal
forma que não permite que você realize uma ação específica em uma URL em particular
O erro 500 é um status de erro HTTP que indica uma dificuldade de processamento do
servidor, a partir de uma incompatibilidade ou configuração incorreta. Tambem ocorre quando
algo que vai ser deletado impacta em outra entidade do servidor
o erro 502
upadate User
User entity = repository.getReferenceById(id);
depois e feito outro package exception no resoucer nesse vamos ter duas class a primeira e o
StandardError onde vai ficar a estrututra que aparecera quando aparecer aquele json
Deploy
acid