# Trilha 1 - Java Springboot Mercado de Trabalho ## Aula 01 ![EBT-logo](https://i.imgur.com/TWwpCwo.png) :::info 👨‍💻 **Prof** Edson Belem de Souza Junior 📞 **Celular/Whatsapp:** (21) 98199-0108 ✉ **E-mail:** profedsonbelem@gmail.com ::: . :::info 👨‍💻 **Profª** Luciana de Vasconcelos Medeiros 📞 **Celular/Whatsapp:** (21) 98201-2525 ✉ **E-mail:** lu.vmedeiros@gmail.com ::: . :::info 📕 **Aula:** 23/06/2024 🌐 **Site:** https://www.edsonbelemtreinamento.com.br/ **Blog**: https://edsonbelemtreinamento.com.br/#/blog **Youtube:** https://www.youtube.com/@EdsonBelemTreinamento **Instagram:** https://www.instagram.com/edson_belem_treinamento/ **Linkedin:** https://www.linkedin.com/in/edsonbelemsjunior/ ::: ## Tema da aula: Java Springboot 21, Orientação a Objetos, Instalação Java, STS Tools, Conceitos de classe, Sobrecarga de construtores, Encapsulamento, Atalhos do STS, Importação do Projeto, Criação de Projeto, Mysql, criar banco, inserir dados no banco. ## Roteiro * instalação * spring sts, maven e [gradle], groovy, mongod * potgres, * trabalhar com git Git Hub, branch, main, relesase * Conta no hackmd * Java OO _ Spring Boot _ * Docker * Frio (pouco vaga) (eles fazem de você um ) * 4 níveis **Programas Obrigatórios para baixar:** * Java 17: https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html * Mongodb: https://www.mongodb.com/try/download/community * Sts tools: https://spring.io/tools * Maven: https://maven.apache.org/download.cgi * Mysql 8: https://dev.mysql.com/downloads/installer/ **Linguagens:** * Python Flask e Fast api, django (ficou parado no tempo ) * Linguagem de Programação Top * Python Top == esquece = mercadologica * python (disputando do java == não dá) * python seguraça, machine learning ... * Organização do Java (java 2004) * Eclipse Spring (crescer) * java _ kotlin _ Spring Boot * Quarkus _ (microservices) * Vert.x (nodeJs Script) reativo * jakarta (microprfile) * kotlin ...(Android) ... * Kotlin (mobile) swift ... **Configurações:** java 17 ```cmd= C:\program files\java jdk17 == JAVA_HOME (Significa ) == M2_HOME == MAVEN_HOME (versão toda hora) == GRADLE_HOME == ``` **Editar Variáveis de Ambiente** edit system environment variable VARIAVEL JAVA_HOME c:\program Files\java\jdk17 Path %JAVA_HOME%\bin ## Teoria ## Orientação a objetos A Orientação a Objetos é uma maneira alternativa de pensar os problemas de sistemas de informação utilizando modelos organizados a partir de conceitos do mundo real. O artefato base é o “objeto” capaz de combinar estrutura e comportamento em uma única “entidade”. Tudo o que podemos ver no mundo real é considerado um objeto com atributos e comportamentos definidos. Na qualidade de método de modelagem, é tida como a melhor estratégia para se eliminar a dificuldade recorrente no processo de modelar o mundo real do domínio do problema em um conjunto de componentes de software que seja o mais fiel na sua representação deste domínio. **Programação Orientada a Objetos** (também conhecida pela sua sigla POO) é um modelo de análise, projeto e programação de software baseado na composição e interação entre diversas unidades chamadas de 'objetos'. A POO é um dos 4 principais paradigmas de programação (as outras são programação imperativa, funcional e lógica). Os objetos são operados com o conceito de 'this' (isso) ou 'self' (si), de forma que seus métodos (muitas vezes) modifiquem os dados da própria instância. Os programas são arquitetados através de objetos que interagem entre si. Dentre as várias abordagens da POO, as baseadas em classes são as mais comuns: objetos são instâncias de classes, o que em geral também define o tipo do objeto. Cada classe determina o comportamento (definido nos métodos) e estados possíveis (atributos) de seus objetos, assim como o relacionamento com outros objetos. A alternativa mais usual ao uso de classes é o uso de protótipos. Neste caso, objetos são cópias de outros objetos, não instâncias de classes. Javascript e Lua são exemplos de linguagens cuja POO é realizada por protótipos. A diferença prática mais evidente é que na POO baseada em protótipos apenas a herança simples é implementada pela cópia do objeto. Assim, na POO, implementa-se um conjunto de classes passíveis de serem instanciadas como objetos, e.g. Python e C++ (ou objetos protótipos que são copiados e alterados, e.g. JavaScript e VimL). Em alguns contextos, o termo modelagem orientada ao objeto (MOO) é preferível ao termo POO. De fato, o paradigma "orientado ao objeto" tem origem nos estudos da cognição e influenciou a inteligência artificial e a linguística, dada a relevância para a abstração de conceitos do mundo real. A MOO é considerada a melhor estratégia para diminuir o "gap semântico" (o hiato entre o mundo real e a representação dele), e facilita a comunicação das partes interessadas no modelo ou software (e.g. o modelador e o usuário final) na medida em que conceitos, terminologia, símbolos, grafismo e estratégias, são, potencialmente, mais óbvios, intuitivos, naturais e exatos. Muitas das linguagens de programação mais utilizadas atualmente (talvez a maioria) são multi-paradigma com suporte à POO. C++, C#, VB.NET, Java, Object Pascal, Objective-C, Python, SuperCollider, Ruby e Smalltalk são exemplos de linguagens de programação orientadas a objetos. ActionScript, ColdFusion, Javascript, PHP (a partir da versão 4.0), Perl (a partir da versão 5), Visual Basic (a partir da versão 4), VimL (ou Vim script) são exemplos de linguagens de programação com suporte a orientação a objetos. Vivace é um exemplo de linguagem sem suporte à POO. Os **atributos e métodos** podem ser referentes a uma classe (e todas as suas instâncias) ou a uma única instância. O vínculo dos atributos aos métodos, de forma a manter uma interface bem definida para operação sobre os dados, e a evitar corrupção dos dados, é chamado de encapsulamento. O encapsulamento foi responsável pelo conceito de 'ocultamento de dados', central para a POO. O encapsulamento pode ser realizado através de convenções (em Python, underscores demarcam métodos e atributos protegidos e privados), ou via recursos da linguagem (em Java ou C++, um método privado só é acessado pela própria classe). Encapsulamento incentiva o desacoplamento. Quando um objeto contém outros objetos, diz-se que há composição de objetos. A composição de objetos é usada para representar uma relação 'tem um', usualmente uma meronímia. Já a herança (quase sempre suportada pelas linguagens que utilizam classes) apresenta relações 'é um' (i.e. 'é um tipo de'), ou seja, relações de hiperonímia cujo resultado final é a árvore taxonômica. Na herança, tipicamente todos os atributos e métodos da classe pai/mãe estão também disponíveis na classe filha, embora seja comum que algumas características sejam substituídas. Assim, a herança permite reúso facilitado de características e muitas vezes reflete relações do mundo real de forma intuitiva. Ambas a 'composição de objetos' e a 'herança' constituem hierarquias entre as classes e objetos na POO. ### Linguagem Java Java é a base de praticamente todos os tipos de aplicativos em rede, e é o padrão global para desenvolvimento e fornecimento de aplicativos para celular, jogos, conteúdo on-line e software corporativo. Com mais de 9 milhões de desenvolvedores em todo o mundo, o Java permite desenvolver e implantar aplicativos e serviços incríveis de maneira eficiente. Com ferramentas abrangentes, um ecossistema sólido e um desempenho eficiente, o Java oferece a portabilidade de aplicativos mesmo entre os ambientes computacionais mais diferentes. ### Modificadores de acesso do Java Em Java, podemos criar atributos ou métodos com os seguintes modificadores de acesso: - **public** - Acesso total, qualquer classe tem acesso ao método (não indicado para usar em atributos de entidade). - **protected** - Acesso permitido por herança e por classes do mesmo pacote. - **default / friendly** - Acesso permitido somente a classes do mesmo pacote, este acesso é definido quando não declaramos nenhum modificador. - **private** - Acesso permitido somente dentro da própria classe. (indicado para atributos de classes de entidade). ## O que é uma classe ![](https://i.imgur.com/6R2QNeN.png) Uma classe define estado e comportamento de um Objeto geralmente implementando métodos e atributos (nomes utilizados na maioria das linguagens modernas). Os atributos, também chamados de campos (do inglês fields), indicam as possíveis informações armazenadas por um objeto de uma classe, representando o estado de cada objeto. Os métodos são procedimentos que formam os comportamentos e serviços oferecidos por objetos de uma classe. Uma classe é uma estrutura que abstrai um conjunto de objetos com características similares. Uma classe define o comportamento de seus objetos - através de métodos - e os estados possíveis destes objetos - através de atributos. Em outras palavras, uma classe descreve os serviços oferecidos por seus objetos e quais informações eles podem armazenar. Classes não são diretamente suportadas em todas as linguagens, e são necessárias para que uma linguagem seja orientada a objetos. Uma classe representa um conjunto de objetos com características afins. Uma classe define o comportamento dos objetos através de seus métodos, e quais estados ele é capaz de manter através de seus atributos. ## Classe Java Beans JavaBeans são componentes de software escritos na linguagem de programação Java. Segundo a especificação da Sun Microsystems os JavaBeans são "componentes reutilizáveis de software que podem ser manipulados visualmente com a ajuda de uma ferramenta de desenvolvimento". Um bean também pode ser definido como uma classe Java que expõe propriedades, seguindo uma convenção de nomeclatura simples para os métodos getter e setter. Praticamente são classes escritas de acordo com uma convenção em particular. São usados para encapsular muitos objetos em um único objeto (o bean), assim eles podem ser transmitidos como um único objeto em vez de vários objetos individuais. São características de uma Classe JavaBean: * Atributos privados * Construtores * Vazio (sem argumentos) * Com entrada de argumetos (Sobrecarga) * Métodos set e get (encapsulamento) * Sobrescrita dos métodos da Classe Object * toString * equals * hashCode ## Objeto É uma instância de uma Classe. Armazenamento de estados através de seus atributos e reação a mensagens enviadas por outros objetos. Cliente c1 = new Cliente(); [Classe] [Objeto] [Construtor :arrow_right: Instância] Um objeto, na vida real, é qualquer coisa a qual pudermos dar um nome. Um objeto, em programação orientada a objetos, é uma instância (ou seja, um exemplar) de uma classe. A Wikilivros é um exemplo de Wiki, ou, a Wikilivros é uma instância de Wiki. Isto poderia ser representado em um programa orientado a objetos com uma classe chamada Wiki e um objeto do tipo Wiki chamado Wikilivros. Um objeto é capaz de armazenar estados através de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos. **Atributos** são características de um objeto. Basicamente a estrutura de dados que vai representar a classe. Exemplos: um objeto da classe "Funcionário" teria como atributos "nome", "endereço", "telefone", "CPF", etc. O conjunto de valores dos atributos de um determinado objeto é chamado de estado. ## Encapsulamento ![](https://i.imgur.com/WUWlyyN.png) Em linguagens orientadas a objetos, é possível encapsular o estado de um objeto. Em termos práticos, isso se realiza limitando o acesso a atributos de uma classe exclusivamente através de seus métodos. Para isso, as linguagens orientadas a objeto oferecem limitadores de acesso para cada membro de uma classe. Em orientação a objetos, o Encapsulamento é o mecanismo a partir do qual os atributos de uma Classe são protegidos do acesso externo. Esta proteção baseia-se no uso de modificadores de acesso restritivos para os atributos e na criação de métodos que irão realizar o acesso indireto a esses atributos. Tipicamente os limitadores de acesso são: * **público (public)** - o membro pode ser acessado por qualquer classe. Os membros públicos de uma classe definem sua interface * **protegido (protected)** - o membro pode ser acessado apenas pela própria classe e suas sub-classes * **privado (private)** - o membro pode ser acessado apenas pela própria classe Cada linguagem de programação pode possuir limitadores de acesso próprios. Por exemplo, em Java, o nível de acesso padrão de um membro permite que qualquer classe de seu pacote (package) possa ser acessado. Em C♯, o limitador de acesso interno (internal) permite que o membro seja acessado por qualquer classe do Assembly (isto é, da biblioteca ou executável). ## Sobrecarga de Métodos (Overloading) A sobrecarga de métodos ocorre quando tem dois ou mais métodos que possuem a mesma assinatura e só mudando o tipo ou a quantidades de parâmetros declarados nele. Casos que pode ser identificado à sobrecarga: Quando declaramos dois ou mais construtores na classe. ```java= package entity; public class Cliente { private Integer idCliente; private String nome; public Cliente() { } public Cliente(Integer idCliente, String nome) { super(); this.idCliente = idCliente; this.nome = nome; } } ``` ## Atalhos do Eclipse |TECLAS |O que faz| |--|--| |CTRL + S|Salvar a classe| |CTRL + SHIFT + S| Salvar todas as classes| |CTRL + ESPAÇO| Autocompleta os comandos| |ALT + S| Atalho para getters and setters e construtores| |CTRL + SHIFT + O| Faz algumas das importações| |CTRL + W| Fecha a aba| |CTRL + SHIFT + W| Fecha todas as abas| |CTRL + D| Exclui a linha| |F11| Rodar o main| |CTRL + PG UP| Pula as abas das classes para frente| |CTRL + PG DOWN| Pula as abas das classes para trás| |CTRL + SHIFT + F| Formata as o texto| |CTRL + N| cria novo arquivo| |CTRL + SHIFT + L| Listar todos os atalhos| ## Importando um Projeto Java Project No menu do STS clicar em File -> Import ![image](https://hackmd.io/_uploads/HyHHirxvC.png) Selecionar Existing project into workspace -> Next ![image](https://hackmd.io/_uploads/B1WYf8ePA.png) Clicar em Browse ![image](https://hackmd.io/_uploads/SJ6jM8xvA.png) Selecionar onde o projeto de exemplo está localizado -> Clicar em Selecionar Pasta ![image](https://hackmd.io/_uploads/r1b6GIewR.png) Clicar em Finish ![image](https://hackmd.io/_uploads/r1RAG8xwR.png) *Aguardar baixar as dependências da internet ⏳* ## Passo a passo para criar um projeto no STS Abrir o STS -> Clicar no menu File -> Clicar em New -> Clicar em Java Project ![image](https://hackmd.io/_uploads/rJEMkLlPR.png) Digitar o nome do projeto -> Clicar em Finish ![image](https://hackmd.io/_uploads/ryuL1Ulv0.png) *Aguardar o projeto ser criado* Clicar no diretorio SRC com o botão direito -> Clicar em New -> Clicar em package ![image](https://hackmd.io/_uploads/rJnhJ8lPR.png) Digitar o nome do diretorio `br.com.arq` -> Clicar em Finish ![image](https://hackmd.io/_uploads/rkK7g8xPC.png) Clicar no diretorio criado com o botão direito -> Clicar em New -> Clicar em Class ![image](https://hackmd.io/_uploads/Bkgdx8gvA.png) Digitar o nome da classe `main` -> Clicar em Finish ![image](https://hackmd.io/_uploads/rk7oxLlw0.png) ## Estrutura do Projeto depois de Criado: ![image](https://hackmd.io/_uploads/BydpQUevR.png) ``` D:. │ .classpath │ .project │ ├───.settings │ org.eclipse.core.resources.prefs │ org.eclipse.jdt.core.prefs │ ├───bin │ │ module-info.class │ │ │ └───br │ └───com │ └───arq │ │ Main.class │ │ │ ├───model │ │ Produto.class │ │ │ └───request │ ProdutoRequest.class │ └───src │ module-info.java │ └───br └───com └───arq │ Main.java │ ├───model │ Produto.java │ └───request ProdutoRequest.java ``` ## Modelo (que representa a tabela) **Produto.java** ```java= package br.com.arq.model; public class Produto { // modificador de acesso tipo private Integer id; private String nome; private String descricao; private Double preco; } ``` **Produto.java** ```java= package br.com.arq.model; // È uma classe Validação //É uma Classe Pura em seu conteúdo // encapsumento básico // Construtores e Saída toString() public class Produto { private Integer id; private String nome; private String descricao; private Double preco; public Produto(Integer id, String nome, String descricao, Double preco) { super(); this.id = id; this.nome = nome; this.descricao = descricao; this.preco = preco; } public Produto() { super(); } @Override public String toString() { return "Produto [id=" + id + ", nome=" + nome + ", descricao=" + descricao + ", preco=" + preco + "]"; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public Double getPreco() { return preco; } public void setPreco(Double preco) { this.preco = preco; } } ``` ### request (entrada) ```java= # ProdutoRequest package br.com.arq.request; public class ProdutoRequest { private Integer id; private String nome; private String descricao; private Double preco; @Override public String toString() { return "ProdutoRequest [id=" + id + ", nome=" + nome + ", descricao=" + descricao + ", preco=" + preco + "]"; } public ProdutoRequest() { } public ProdutoRequest(Integer id, String nome, String descricao, Double preco) { super(); this.id = id; this.nome = nome; this.descricao = descricao; this.preco = preco; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public Double getPreco() { return preco; } public void setPreco(Double preco) { this.preco = preco; } // Boolean _ 1 ou 0 public Boolean validaId() { if (this.id >= 1) { return true; } return false; } public Boolean validaNome() { if (this.nome.length() >= 2) { return true; } return false; } public Boolean validaDescricao() { if (this.descricao.length()>= 3) { return true; } return false; } public Boolean validaPreco() { if (this.preco >= 0.) { return true; } return false; } } ``` ## main ```java= package br.com.arq; import br.com.arq.model.Produto; import br.com.arq.request.ProdutoRequest; public class Main { //ctrl + shift + f _ alinhamento //ctrl + shiftt + o _ importação public static void main(String[] args) { Produto produto= new Produto(-100, "x", "to", -1.); ProdutoRequest request = new ProdutoRequest(produto.getId(), produto.getNome(), produto.getDescricao(), produto.getPreco()); System.out.println(request.validaId()); System.out.println(request.validaNome()); System.out.println(request.validaDescricao()); System.out.println(request.validaPreco()); if (request.validaId() & request.validaDescricao() & request.validaNome() & request.validaPreco()) { System.out.println("produtos validos"); }else { System.out.println("produtos nao validados"); } } } ``` ### response (saída) ## Para rodar o projeto: Clicar na classe `main` com o botão direito -> Run as -> Java application ![image](https://hackmd.io/_uploads/BJ5yBLxvC.png) Resultado no console: ![image](https://hackmd.io/_uploads/SJRbH8lwC.png) ## No Banco de Dados Mysql Abrir o Mysql e digitar os comandos: ``` # para criar o banco de dados create database bancoproduto; ``` ![image](https://hackmd.io/_uploads/Sy7kwIeD0.png) ``` # para entrar no banco criado use bancoproduto; # para criar a tabela create table produto (id int primary key, nome varchar(250), descricao varchar (250), tipo varchar (250), preco double); ``` ![image](https://hackmd.io/_uploads/Bk5_wUewA.png) ``` # para inserir um produto insert into produto values (1, 'hiphone', 'iphone indiano', 'original so que nao', 250); # listar os produtos gravados; select * from produtos; ``` ![image](https://hackmd.io/_uploads/r1c7dUevA.png) :::info **EDSON BELEM TREINAMENTO** - edsonbelemtreinamento.com.br :::