Table of Contents
Curso de Desenvolvimento Desktop com Java 🖥️
Bem-vindo ao curso definitivo de Desenvolvimento de Sistemas Desktop Orientados a Objetos. Aqui você aprenderá a projetar e construir aplicações robustas, com interfaces modernas e persistência em banco de dados.
🚀 O que vamos construir?
Ao longo de 16 aulas, vamos evoluir do básico de Java até a criação de um sistema completo com o padrão MVC e banco de dados SQLite.
-
Módulo 1: Fundamentos OO --- Classes, Objetos, Encapsulamento, Herança e Polimorfismo. Ver Aulas
-
Módulo 2: Arquitetura MVC --- Organização profissional em camadas e separação de responsabilidades. Ver Aulas
-
Módulo 3: Interface Gráfica (GUI) --- Criação de janelas, botões, tabelas e menus usando Swing. Ver Aulas
-
Módulo 4: Banco de Dados --- Persistência real com SQL, JDBC e o padrão DAO. Ver Aulas
🛠️ Requisitos
- JDK 17+
- IntelliJ IDEA ou Eclipse
- Vontade de aprender!
Plano de Ensino - Desenvolvimento Desktop 📚
Objetivo Geral
Capacitar o estudante a projetar, codificar, depurar e implementar sistemas desktop orientados a objetos, utilizando o padrão MVC e persistência em banco de dados.
📅 Ementa das Aulas
| Aula | Tópico |
|---|---|
| 01 | Introdução ao Desenvolvimento Desktop |
| 02 | Classes, Objetos e Instanciação |
| 03 | Encapsulamento e Construtores |
| 04 | Herança e Polimorfismo |
| 05 | Classes Abstratas e Interfaces |
| 06 | Organização de Projetos e Pacotes |
| 07 | Padrão MVC na Prática |
| 08 | Introdução à Interface Gráfica (GUI) |
| 09 | Componentes Básicos (Label, Text, Button) |
| 10 | Componentes Intermediários e Layouts |
| 11 | Interfaces Avançadas (Abas, Menus, Tabelas) |
| 12 | Introdução a Banco de Dados Relacional |
| 13 | Conexão com Banco de Dados (JDBC) |
| 14 | CRUD e Padrão DAO |
| 15 | Segurança, SQL Injection e Boas Práticas |
| 16 | Projeto Integrador Final |
🛠 Metodologia
- Projetos Práticos Experimentais.
- Exercícios de Fixação.
- Quizzes de Verificação Cognitiva.
Aulas
Aula 01 - Introdução ao Desenvolvimento Desktop 🖥️
Bem-vindo à primeira aula do curso de Desenvolvimento Desktop! Nesta aula, vamos entender o que é o desenvolvimento de aplicações voltadas para o ambiente de desktop e como configurar nosso ambiente.
😊 O que é Software Desktop?
Sistemas desktop são aplicações instaladas diretamente no sistema operacional (Windows, macOS, Linux) de um computador. Diferente das aplicações web, elas rodam localmente e têm acesso direto ao hardware e arquivos do sistema.
Exemplos de Aplicações
- ERP (Enterprise Resource Planning): Sistemas de gestão empresarial.
- PDV (Ponto de Venda): Sistemas de caixa de supermercados e lojas.
- Sistemas Acadêmicos: Para controle de notas e faltas.
- Editores de Imagem/Vídeo: Como Photoshop ou Premiere.
📊 Estrutura de um Projeto
graph TD
A[Projeto Desktop] --> B[Camada de Visão - GUI]
A --> C[Camada de Lógica - Business]
A --> D[Camada de Dados - Persistence]
B --> E[Eventos de Usuário]
C --> F[Regras de Negócio]
D --> G[Banco de Dados]
🧠 Conceitos Importantes
[!NOTE] Compilação: É o processo de transformar o código fonte (escrito em Java, C#, etc.) em um formato que o computador entenda (Bytecode ou Binário).
[!TIP] IDE: Utilizaremos o IntelliJ IDEA ou Eclipse para facilitar o desenvolvimento, depuração e execução dos nossos programas.
💻 Primeiro Programa
Vamos ver como é a estrutura básica de um programa Java executado via terminal.
📝 Exercícios Progressivos
- Básico: Explique a principal diferença entre uma aplicação Web e uma aplicação Desktop.
- Básico: Pesquise e cite 3 softwares desktop que você utiliza no dia a dia.
- Intermediário: O que acontece quando clicamos no botão "Build" ou "Run" em uma IDE?
- Intermediário: Por que sistemas de PDV (caixas de mercado) ainda são majoritariamente desktop?
- Desafio: Crie um diagrama simples (pode ser no papel ou Mermaid) representando a interação entre um usuário e um sistema de login desktop.
🚀 Mini-projeto: Configure o ambiente Java em sua máquina e execute o clássico "Hello World" no terminal.
Aula 02 - Classes, Objetos e Instanciação 🧱
Hoje vamos mergulhar no coração da Programação Orientada a Objetos (POO): as Classes e os Objetos.
😊 Conceito de Classe e Objeto
Imagine que uma Classe é uma planta de uma casa. Ela define onde ficam as janelas, o tamanho dos quartos, etc. O Objeto é a casa construída a partir dessa planta.
- Classe: O molde/modelo.
- Objeto: A instância real do modelo.
Atributos e Métodos
- Atributos: Características do objeto (ex: cor, peso, preço).
- Métodos: Ações que o objeto pode realizar (ex: acelerar, salvar, calcular).
📊 Modelagem de Produto
classDiagram
class Produto {
+String nome
+double preco
+int quantidade
+exibirDetalhes()
+aplicarDesconto(porcentagem)
}
🧠 Exemplo Prático de Instanciação
[!IMPORTANT] A palavra-chave
newé utilizada para criar (instanciar) um novo objeto a partir de uma classe.
// Criando o objeto
Produto p1 = new Produto();
p1.nome = "Teclado Mecânico";
p1.preco = 250.00;
// Chamando um método
p1.exibirDetalhes();
📝 Exercícios Progressivos
- Básico: Defina com suas palavras o que é uma Classe.
- Básico: Diferencie Atributo de Método.
- Intermediário: Crie uma modelagem simples (Lista de atributos e métodos) para uma classe
Cliente. - Intermediário: Se tivermos a classe
Cachorro, cite 3 possíveis atributos e 2 métodos. - Desafio: Desenhe um diagrama Mermaid para uma classe
ContaBancariacom atributos comosaldoe métodos comodepositaresacar.
🚀 Mini-projeto: Crie uma classe Produto no Java e instancie dois objetos diferentes (ex: Mouse e Monitor), atribuindo valores distintos a eles.
Aula 03 - Encapsulamento e Construtores 🔒
Nesta aula, vamos aprender como proteger nossos dados e como inicializar nossos objetos de forma correta.
😊 Encapsulamento
Encapsulamento é a técnica de esconder os detalhes internos de uma classe e fornecer uma interface segura para interagir com ela. É como um controle remoto: você sabe quais botões apertar, mas não precisa saber como o circuito interno funciona.
Modificadores de Acesso
public: Acesso total.private: Acesso restrito à própria classe.protected: Acesso às subclasses.
Getters e Setters
São métodos utilizados para ler (get) e modificar (set) atributos privados.
📊 Estrutura de Encapsulamento
graph LR
User[Usuário/Outra Classe] -- Getter/Setter --> Interface[Métodos Públicos]
Interface -- Acessa --> Data[Atributos Privados]
🧠 Construtores
Um Construtor é um método especial chamado no momento da criação do objeto. Ele serve para garantir que o objeto comece com valores válidos.
[!CAUTION] Se você não definir nenhum construtor, o Java criará um padrão (vazio). Mas se você criar um, o padrão deixará de existir.
public class Cliente {
private String nome;
// Construtor
public Cliente(String nome) {
this.nome = nome;
}
}
💻 Exemplo no Terminal
📝 Exercícios Progressivos
- Básico: Para que serve o modificador
private? - Básico: Qual a função de um método "Setter"?
- Intermediário: Por que não devemos deixar todos os atributos como
public? - Intermediário: O que é a palavra-chave
thisdentro de um construtor? - Desafio: Crie uma classe
Funcionariocom atributosalarioprivado. Crie um setter que só aceite valores positivos.
🚀 Mini-projeto: Implemente a classe ContaBancaria com encapsulamento total e um construtor que peça o nome do titular e o saldo inicial.
Aula 04 - Herança e Polimorfismo 🧬
Hoje exploraremos dois pilares poderosos da POO que permitem o reuso de código e a flexibilidade do sistema.
😊 Herança
A herança permite que uma classe (Filha ou Subclasse) herde atributos e métodos de outra classe (Pai ou Superclasse).
Vantagem: Evita repetição de código (DRY - Don't Repeat Yourself).
Exemplo de Hierarquia:
- Pessoa (Pai)
- Cliente (Filho)
- Funcionário (Filho)
📊 Diagrama de Herança
classDiagram
Pessoa <-- Cliente
Pessoa <-- Funcionario
class Pessoa {
+String nome
+String cpf
}
class Cliente {
+double limiteCredito
}
class Funcionario {
+double salario
}
🧠 Polimorfismo
Polimorfismo significa "muitas formas". É a capacidade de um objeto ser tratado como sua superclasse, mas se comportar de acordo com sua classe real.
[!IMPORTANT] A Sobre-escrita (@Override) é essencial para o polimorfismo, permitindo que o filho personalize um comportamento herdado do pai.
📝 Exercícios Progressivos
- Básico: Na frase "Todo Carro é um Veículo", quem é a Superclasse?
- Básico: O que significa a anotação
@Override? - Intermediário: Explique a diferença entre Herança e Composição (brevíssimo).
- Intermediário: Crie uma hierarquia entre
Animal,CachorroeGato. Qual método seria sobre-escrito? - Desafio: No sistema de um banco, por que é útil tratar
ContaCorrenteeContaPoupancaapenas comoContaem um loop de processamento?
🚀 Mini-projeto: Crie uma classe Pessoa e duas subclasses. Implemente um método apresentar() na classe pai e mude o comportamento nas classes filhas usando @Override.
Aula 05 - Classes Abstratas e Interfaces 🧩
Hoje vamos aprender como definir contratos e modelos incompletos para garantir a fluidez da nossa arquitetura.
😊 Classes Abstratas
Uma Classe Abstrata é uma classe que não pode ser instanciada diretamente. Ela serve apenas como um "rascunho" ou base para outras classes.
- Pode conter métodos com corpo (comuns).
- Pode conter métodos sem corpo (abstratos), que obrigam os filhos a implementarem.
📊 Exemplo: Forma Geométrica
classDiagram
Forma <|-- Circulo
Forma <|-- Quadrado
class Forma {
<<abstract>>
+String cor
+calcularArea()*
}
🧠 Interfaces
Uma Interface é um "contrato". Ela define o que uma classe deve fazer, mas não como fazer.
[!TIP] Use Interfaces quando quiser definir um comportamento comum a classes que não pertencem necessariamente à mesma hierarquia (ex:
Autenticavel).
🧠 Glossário Rápido
[!NOTE] Extends: Usado para herança (Classes). Implements: Usado para contratos (Interfaces).
📝 Exercícios Progressivos
- Básico: Posso criar um objeto de uma classe abstrata (
new ClasseAbstrata())? - Básico: Quantas interfaces uma classe Java pode implementar?
- Intermediário: Qual a principal diferença entre uma Classe Abstrata e uma Interface?
- Intermediário: Se eu tenho a interface
Voadorcom o métodovoar(), o que acontece se eu esquecer de implementar esse método na classePassaro? - Desafio: Crie um diagrama Mermaid para um sistema de pagamentos (
Pagamentoabstrato,CartaoeBoletocomo filhos).
🚀 Mini-projeto: Crie a classe abstrata Funcionario com o método abstrato calcularBonus(). Implemente as classes Gerente e Operador com cálculos diferentes.
Aula 06 - Organização de Projetos 📂
À medida que o software cresce, a organização se torna fundamental. Hoje vamos aprender como estruturar pastas e pacotes.
😊 Pacotes (Packages)
Pacotes são como pastas que organizam classes relacionadas. Eles evitam conflitos de nomes e facilitam a manutenção.
Convenção: com.empresa.projeto.modulo
📊 Estrutura de Camadas
Um sistema bem projetado deve ser separado em responsabilidades:
graph TD
UI[View - Interface] --> Logic[Controller - Lógica]
Logic --> Data[Model - Dados]
Data --> DB[(Banco de Dados)]
Por que separar em camadas?
- Manutenibilidade: Fácil de encontrar erros.
- Reuso: Posso trocar a interface sem mexer no banco.
- Trabalho em Equipe: Várias pessoas podem mexer em partes diferentes ao mesmo tempo.
🧠 Introdução ao Padrão MVC
- Model: Representa os dados e regras de negócio.
- View: O que o usuário vê (telas).
- Controller: O intermediário que recebe comandos da View e atualiza o Model.
💻 Estrutura de Pastas Sugerida
├── src
│ ├── model # Classes de dados
│ ├── view # Telas (Swing/JavaFX)
│ ├── controller # Lógica de controle
│ └── util # Funções auxiliares
📝 Exercícios Progressivos
- Básico: Por que usamos pacotes em Java?
- Básico: Qual a função da camada
Modelno MVC? - Intermediário: O que acontece se misturarmos código de banco de dados dentro de um botão da tela?
- Intermediário: Cite uma vantagem da separação de responsabilidades.
- Desafio: Organize as classes
Cliente,ClienteControllereTelaClienteem uma estrutura de pastas lógica.
🚀 Mini-projeto: Crie um novo projeto no seu IDE e estruture os pacotes model, view e controller. Mova as classes criadas nas aulas anteriores para os pacotes corretos.
Aula 07 - Padrão MVC na Prática 🏗️
Nesta aula, vamos aprender a separar as responsabilidades do nosso sistema de forma profissional utilizando o padrão MVC (Model-View-Controller).
😊 O que é MVC?
O MVC é um padrão de arquitetura que divide a aplicação em três componentes principais:
- Model (Modelo): Onde os dados vivem. Não conhece a interface nem o banco diretamente.
- View (Visão): A cara do sistema. Botões, campos de texto e janelas.
- Controller (Controle): O cérebro. Escuta os eventos da View e manda o Model agir.
📊 Fluxo de Dados no MVC
sequenceDiagram
participant User
participant View
participant Controller
participant Model
User->>View: Clica no botão "Salvar"
View->>Controller: enviaDados(form)
Controller->>Model: criar(objeto)
Model-->>Controller: Confirmação
Controller-->>View: atualizarTabela()
View-->>User: Mensagem "Sucesso!"
🧠 Separação de Responsabilidades
[!IMPORTANT] A regra de ouro é: A View nunca deve conter lógica de negócio (cálculos, validações complexas, acesso a dados). Ela deve apenas repassar o que o usuário quer para o Controller.
💻 Refatoração para MVC
Imagine que tínhamos tudo em um único arquivo. Agora separamos:
model/ # Produto.java
view/ # Principal.java (JFrame)
📝 Exercícios Progressivos
- Básico: Relacione as siglas: M - __, V - _, C - ___.
- Básico: Por que o Controller é chamado de "intermediário"?
- Intermediário: Se eu quiser mudar a cor de um botão, em qual camada devo mexer?
- Intermediário: Se eu mudar a fórmula de cálculo de imposto de um produto, em qual camada devo mexer?
- Desafio: Descreva o que acontece no MVC quando um usuário solicita a exclusão de um registro em uma tabela.
🚀 Mini-projeto: Refatore o mini-projeto da aula anterior (Produto) para que ele utilize o padrão MVC. O Controller deve ser responsável por imprimir os detalhes no console após a ação da "View" (que por enquanto será um método main).
Aula 08 - Introdução à Interface Gráfica (GUI) 🎨
Chegou a hora de dar "cara" aos nossos sistemas! Vamos sair do terminal e entrar nas janelas.
😊 O que é GUI?
GUI (Graphical User Interface) permite que os usuários interajam com o software através de elementos visuais como ícones, botões e janelas, em vez de apenas texto.
Componentes de uma Janela
- JFrame: A moldura (janela principal).
- JPanel: Uma área dentro da janela para organizar itens.
- JButton: Botões de ação.
- Layouts: Regras que definem onde cada coisa fica.
📊 Ciclo de Eventos
Diferente do terminal (sequencial), uma GUI é baseada em Eventos.
graph LR
Wait[Aguardando Ação] -- Clique --> Listener[Listener de Evento]
Listener -- Dispara --> Action[Lógica do Sistema]
Action -- Atualiza --> UI[Interface Visual]
UI --> Wait
🧠 Tratamento de Eventos (Listeners)
[!NOTE] Um ActionListener é um objeto que "fica ouvindo" se um clique aconteceu em um botão. Quando o clique ocorre, ele executa um código específico.
💻 Minha Primeira Janela
JFrame janela = new JFrame("Meu Sistema");
janela.setSize(400, 300);
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
janela.setVisible(true);
🧠 Dica de Design
[!TIP] Use nomes claros para seus botões e componentes. Em vez de
jButton1, usebtnSalvaroubtnSair. Isso facilita muito a leitura do código no futuro.
📝 Exercícios Progressivos
- Básico: O que significa a sigla GUI?
- Básico: Qual a função do
JFrame? - Intermediário: Para que serve o método
setDefaultCloseOperation? O que acontece se não usarmos? - Intermediário: Explique o conceito de "Event-Driven Programming" (Programação Orientada a Eventos).
- Desafio: Desenhe (ou use Mermaid) a estrutura de uma janela que contenha 3 botões (Incluir, Alterar, Excluir).
🚀 Mini-projeto: Crie uma janela simples em Java que, ao ser clicada em um botão, exiba uma mensagem de "Olá!" usando JOptionPane.
Aula 09 - Componentes Básicos 🏗️
Nesta aula, vamos conhecer os "tijolos" fundamentais para construir qualquer formulário desktop.
😊 Componentes de Texto e Ação
- JLabel: Usado para exibir textos informativos ou instruções (ex: "Nome:", "Senha:").
- JTextField: Campo de uma única linha para o usuário digitar informações.
- JButton: O botão clássico para disparar ações.
- JOptionPane: Caixas de diálogo prontas para avisos ou perguntas rápidas.
📊 Estrutura de um Componente
graph LR
Comp[Componente] --> Attr[Atributos: Cor, Fonte, Tamanho]
Comp --> Event[Eventos: Clique, Tecla Pressionada]
Comp --> Pos[Posição: X, Y]
🧠 Tratamento de Eventos (Prática)
[!IMPORTANT] Para capturar o texto digitado em um
JTextField, usamos o método.getText(). Para limpar o campo, usamos.setText("").
String nome = txtNome.getText();
if(nome.isEmpty()) {
JOptionPane.showMessageDialog(null, "Digite seu nome!");
}
🧠 Dica de UX
[!TIP] Feedback Visual: Sempre que uma ação for concluída (ou falhar), avise o usuário. Um
JOptionPaneé a forma mais simples de fazer isso.
📝 Exercícios Progressivos
- Básico: Qual a diferença entre um
JLabele umJTextField? - Básico: Como exibimos uma mensagem de erro na tela?
- Intermediário: Qual método é usado para pegar o texto de um campo de entrada?
- Intermediário: Por que devemos validar se um campo está vazio antes de processar os dados?
- Desafio: Escreva o código (ou lógica) para um botão que pegue dois números de dois
JTextField, some-os e exiba o resultado em umJOptionPane.
🚀 Mini-projeto: Crie um formulário de login simples com: Dois JLabel, um JTextField (usuário), um JPasswordField (senha) e um JButton. Ao clicar, verifique se usuário e senha são iguais a "admin".
Aula 10 - Componentes Intermediários 🎛️
Hoje vamos aprender a usar componentes de seleção e como organizar tudo isso de forma bonita usando Layouts.
😊 Componentes de Seleção
- JCheckBox: Permite selecionar múltiplas opções (ex: Interesses, Habilidades).
- JRadioButton: Permite selecionar apenas uma opção de um grupo (ex: Sexo, Estado Civil).
- Nota: Precisam de um
ButtonGrouppara funcionar corretamente.
- Nota: Precisam de um
- JComboBox: Uma lista suspensa (dropdown) para economizar espaço em tela.
📊 Organização com Layouts
Colocar componentes em posições fixas (X, Y) é perigoso porque a janela pode ser redimensionada. Por isso usamos Layout Managers:
| Layout | Descrição |
|---|---|
| FlowLayout | Itens em linha, um após o outro. |
| BorderLayout | Divide em Norte, Sul, Leste, Oeste e Centro. |
| GridLayout | Divide em uma grade de linhas e colunas iguais. |
graph TD
Container[JPanel/JFrame] --> Layout[Layout Manager]
Layout --> C1[Componente 1]
Layout --> C2[Componente 2]
Layout --> C3[Componente 3]
🧠 Dica de Organização
[!NOTE] Use JPanels como sub-containers. Você pode ter um painel com
GridLayoutpara o formulário e outro painel comFlowLayoutapenas para os botões na parte de baixo.
📝 Exercícios Progressivos
- Básico: Qual componente usar para "Termos de Aceite" (onde o usuário marca se concorda)?
- Básico: Qual a diferença entre
JCheckBoxeJRadioButton? - Intermediário: Qual
Layout Managervocê usaria para criar uma calculadora (teclado numérico)? - Intermediário: O que acontece se você não adicionar
JRadioButtonsa umButtonGroup? - Desafio: Desenhe a estrutura (usando blocos) de uma tela de cadastro que use
BorderLayoutpara separar o Título (Norte), Campos (Centro) e Botões (Sul).
🚀 Mini-projeto: Crie uma tela de "Escolha seu Plano" com 3 JRadioButton (Prata, Ouro, VIP) e um JComboBox com as cidades de atendimento. Exiba a escolha do usuário ao clicar em um botão.
Aula 11 - Interfaces Avançadas 📑
Hoje vamos aprender a organizar grandes volumes de informação usando abas, menus e tabelas profissionais.
😊 Componentes de Organização
- JTabbedPane: Cria abas, permitindo separar diferentes formulários ou relatórios em uma mesma janela.
- JMenuBar / JMenu / JMenuItem: Cria a barra de menus no topo da janela (Arquivos, Editar, Ajuda).
- JTable: O componente mais importante para sistemas de gestão. Exibe dados em formato de planilha.
📊 Estrutura de uma JTable
A JTable funciona através de um Model (normalmente DefaultTableModel).
graph TD
Data[Lista de Objetos] --> Model[DefaultTableModel]
Model --> UI[JTable Visual]
UI -- Clique na Linha --> RowData[Dados da Linha]
🧠 Validação e UX (User Experience)
[!IMPORTANT] Validação de Formulários: Antes de adicionar dados à tabela ou ao banco, verifique se os tipos estão corretos (ex: se o preço é realmente um número).
try {
double preco = Double.parseDouble(txtPreco.getText());
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "Preço inválido!");
}
🧠 Dica de Carreira
[!TIP] Sistemas desktop modernos dão muita importância às tabelas. Aprender a filtrar, ordenar e colorir linhas de uma
JTableé um diferencial enorme.
📝 Exercícios Progressivos
- Básico: Quando devemos usar abas (
JTabbedPane) em um sistema? - Básico: Qual a diferença entre
JMenueJMenuItem? - Intermediário: Por que usamos um
TableModelem vez de colocar os dados direto naJTable? - Intermediário: Como podemos impedir que o usuário digite letras em um campo de "Idade"?
- Desafio: Desenhe (ou descreva) o menu principal de um "Sistema de Biblioteca", contendo as opções de Cadastro, Movimentação e Relatórios.
🚀 Mini-projeto: Crie uma tela com duas abas: "Cadastro" (com campos de texto) e "Listagem" (com uma JTable). Ao clicar em salvar na primeira aba, os dados devem aparecer na tabela da segunda aba.
Aula 12 - Introdução a Banco de Dados 🗄️
Nesta aula, iniciamos nossa jornada na persistência de dados. O que acontece com os dados quando fechamos o programa?
😊 Banco de Dados Relacional
Um banco de dados relacional (como MySQL, SQL Server ou SQLite) organiza os dados em tabelas que se relacionam entre si.
Conceitos Básicos:
- Tabela: Conjunto de registros de um mesmo tipo (ex: Cliente).
- Registro (Linha): Uma instância de dado (ex: João Santos).
- Coluna (Campo): Uma característica (ex: Nome, CPF).
- Chave Primária (PK): O identificador único de um registro.
📊 Modelagem Simples
erDiagram
PRODUTO {
int id PK
string nome
double preco
int estoque
}
🧠 Linguagem SQL
Para conversar com o banco, usamos o SQL (Structured Query Language).
[!NOTE] CREATE TABLE: Cria a estrutura. INSERT: Adiciona dados. SELECT: Recupera dados.
💻 Comandos Básicos
sqlite> INSERT INTO produto (nome, preco) VALUES ('Mouse', 50.0);
sqlite> SELECT * FROM produto;
1|Mouse|50.0
📝 Exercícios Progressivos
- Básico: O que significa a sigla SQL?
- Básico: Para que serve a "Chave Primária" (Primary Key)?
- Intermediário: Qual a diferença entre um Banco de Dados e uma Planilha de Excel?
- Intermediário: Escreva o comando SQL para inserir um cliente chamado "Maria" com o CPF "123.456.789-00".
- Desafio: Modele uma tabela
Funcionariocom pelo menos 5 colunas e defina os tipos de dados ideais para cada uma.
🚀 Mini-projeto: Instale o SQLite Browser (ou use o terminal) e crie sua primeira tabela de Produtos com 3 registros iniciais.
Aula 13 - Conexão com Banco de Dados 🔌
Nesta aula, aprenderemos como fazer o Java "conversar" com o Banco de Dados através do Driver JDBC.
😊 O que é JDBC?
JDBC (Java Database Connectivity) é um conjunto de classes e interfaces que permite que aplicações Java se conectem a diversos bancos de dados (MySQL, SQLite, PostgreSQL, etc) usando uma linguagem comum.
O Papel do Driver
O Driver é como um tradutor. Cada banco de dados tem o seu próprio driver.
📊 Estrutura de Conexão
graph LR
App[Aplicação Java] -- JDBC API --> Driver[Driver JDBC]
Driver -- Protocolo Nativo --> DB[(Banco de Dados)]
🧠 Testando a Conexão
Para conectar, precisamos de uma URL de Conexão. No caso do SQLite, ela aponta para um arquivo local.
[!IMPORTANT] Sempre feche a conexão (
connection.close()) quando terminar de usá-la para não desperdiçar memória do sistema.
String url = "jdbc:sqlite:meubanco.db";
try (Connection conn = DriverManager.getConnection(url)) {
if (conn != null) {
System.out.println("Conectado com sucesso!");
}
} catch (SQLException e) {
System.out.println("Erro ao conectar: " + e.getMessage());
}
🧠 Dica de Segurança
[!CAUTION] Nunca deixe a senha do seu banco de dados escrita diretamente no código fonte (Hardcoded). Use arquivos de configuração ou variáveis de ambiente.
📝 Exercícios Progressivos
- Básico: Para que serve o JDBC?
- Básico: O que acontece se tentarmos conectar ao banco sem o "Driver" instalado?
- Intermediário: Por que usamos o bloco
try-catchao realizar uma conexão? - Intermediário: Qual a diferença entre uma conexão com SQLite (local) e MySQL (servidor) em termos de URL?
- Desafio: Desenhe um diagrama de sequência mostrando a aplicação pedindo uma conexão ao
DriverManager.
🚀 Mini-projeto: Crie uma classe ConexaoBanco com um método estático que retorne uma Connection ativa para o seu banco SQLite.
Aula 14 - CRUD e DAO 💾
Hoje aprenderemos o padrão mais utilizado no mercado para persistência de dados: o DAO.
😊 O que é DAO?
DAO (Data Access Object) é um padrão de projeto que isola todo o código de acesso ao banco de dados em classes específicas. Isso mantém o restante do sistema (Controller e Model) limpo e focado em suas próprias tarefas.
O que é CRUD?
É o acrônimo para as quatro operações básicas em um banco de dados: * Create (INSERT) * Read (SELECT) * Update (UPDATE) * Delete (DELETE)
📊 Camada DAO no Sistema
graph TD
UI[View] --> Ctrl[Controller]
Ctrl --> DAO[ProdutoDAO]
DAO --> DB[(Banco de Dados)]
DAO -- Retorna List/Object --> Ctrl
🧠 Exemplo de DAO (Insert)
[!IMPORTANT] Ao usar o DAO, o Controller não sabe qual SQL está sendo executado. Ele apenas pede:
dao.salvar(produto).
public void salvar(Produto p) {
String sql = "INSERT INTO produto (nome, preco) VALUES (?, ?)";
// Código para executar...
}
📝 Exercícios Progressivos
- Básico: O que significa a sigla CRUD?
- Básico: Qual a principal vantagem do padrão DAO?
- Intermediário: Por que passamos um objeto (ex:
Produto) para o método do DAO em vez de passar os atributos soltos? - Intermediário: Em qual camada do MVC o DAO deve ser chamado?
- Desafio: Descreva as 4 assinaturas de métodos (nome e parâmetros) que uma classe
ClienteDAOdeveria ter para um CRUD completo.
🚀 Mini-projeto: Crie a classe ProdutoDAO e implemente o método salvar. Teste inserindo um produto através do seu código Java e verifique no banco de dados.
Aula 15 - Segurança e Boas Práticas 🛡️
Na penúltima aula, vamos aprender como proteger nosso sistema contra ataques e como escrever um código profissional e limpo.
😊 Prevenção contra SQL Injection
O SQL Injection é um dos ataques mais comuns, onde um usuário mal-intencionado tenta "injetar" comandos SQL através de campos de formulário.
[!IMPORTANT] A SOLUÇÃO: Nunca concatene strings para montar seu SQL. Use sempre o PreparedStatement.
// ERRADO (Vulnerável)
String sql = "SELECT * FROM usuario WHERE login = '" + login + "'";
// CORRETO (Seguro)
String sql = "SELECT * FROM usuario WHERE login = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, login);
📊 Tratamento de Exceções Profissional
Não basta apenas imprimir o erro. Devemos registrar o que aconteceu para poder consertar depois.
graph LR
Error[Erro no Sistema] --> Log[Arquivo de Log]
Error --> UserMsg[Mensagem Amigável ao Usuário]
Log --> Dev[Desenvolvedor Analisa]
🧠 Boas Práticas (Refatoração)
[!TIP] DRY (Don't Repeat Yourself): Se você está repetindo o mesmo código de conexão em todas as telas, crie uma classe
ConexaoBancoe reutilize-a.
💻 Depuração (Debug)
Aprender a usar o Debug da IDE (colocar Breakpoints) economiza horas de trabalho. Em vez de adivinhar o que está errado, você vê o valor das variáveis em tempo real.
📝 Exercícios Progressivos
- Básico: O que é SQL Injection?
- Básico: Por que não devemos mostrar a "Exception" técnica completa para o usuário final?
- Intermediário: Qual a função do
PreparedStatementna segurança? - Intermediário: O que são "Logs" e por que são importantes em sistemas desktop?
- Desafio: Escreva um pequeno trecho de código que trate uma
SQLExceptione exiba uma mensagem amigável: "Houve um problema ao conectar com o servidor. Tente novamente mais tarde."
🚀 Mini-projeto: Refatore seu ProdutoDAO para que todos os métodos utilizem PreparedStatement e tenham tratamento de erro com try-catch.
Aula 16 - Projeto Integrador 🚀
Parabéns por chegar até aqui! Agora é hora de colocar todo o conhecimento em prática construindo um sistema completo.
😊 O Desafio Final
Você deve desenvolver um sistema desktop funcional seguindo todos os padrões aprendidos: POO + MVC + GUI + Banco de Dados (DAO).
Sugestões de Temas:
- Controle de Vendas: Cadastro de produtos e registro de vendas simples.
- Biblioteca Pessoal: Cadastro de livros e controle de empréstimos.
- Controle de Tarefas (To-do): Lista de tarefas com prioridade e status.
- Gestão de Pets: Cadastro de animais de estimação e histórico de consultas.
📊 Requisitos do Projeto
O projeto será avaliado seguindo estes critérios:
mindmap
root((Projeto Final))
Arquitetura
Padrao MVC
Padrao DAO
Interface GUI
Menus e Abas
Tabelas Funcionais
Validacao de Dados
Banco de Dados
Conexao JDBC
CRUD Completo
Codigo
Boas Praticas
Comentarios em PT-BR
🧠 Checklist de Entrega
- [ ] Banco de Dados criado (arquivo
.db). - [ ] Telas de Cadastro e Listagem funcionando.
- [ ] Operações de Alterar e Excluir implementadas.
- [ ] Código organizado em pacotes (
model,view,controller,dao). - [ ] Sem erros de execução (Exceptions tratadas).
📝 Documentação Exigida
[!NOTE] Escreva um pequeno arquivo
README.mdpara o seu projeto explicando: 1. O que o sistema faz. 2. Como executá-lo. 3. Quais tecnologias utilizou.
🚀 Mini-projeto: Inicie o desenvolvimento do seu sistema. Comece pela modelagem do banco de dados e pela criação das classes de modelo Java.
Boa sorte e bom trabalho! Você está pronto para o mercado desktop! 🖥️🎓
Exercícios
Exercícios Integrados 📝
Pratique os conceitos aprendidos em aula com exercícios práticos e desafios de codificação.
-
Módulo 1: Fundamentos ---
-
Módulo 2: Arquitetura ---
-
Módulo 3: Interfaces (GUI) ---
-
Módulo 4: Persistência ---
Exercícios - Aula 01 📝
🟢 Básicos
- Cite duas vantagens de softwares desktop em relação a sistemas puramente web (ex: acesso offline).
- O que é uma IDE e cite o nome de uma muito utilizada para Java.
🟡 Intermediários
- Descreva o papel do "Bytecode" no ecossistema Java e como ele se relaciona com a compilação.
- Por que a instalação direta no sistema operacional permite que aplicações desktop tenham melhor desempenho em tarefas pesadas (como edição de vídeo)?
🔴 Desafio
- Imagine que você vai desenvolver um sistema para um Supermercado que não tem internet estável. Crie uma pequena justificativa técnica (em 5 linhas) explicando por que a arquitetura Desktop é a ideal para este cenário.
Exercícios - Aula 02 📝
🟢 Básicos
- Qual a diferença prática entre uma Classe e um Objeto? Use uma metáfora diferente da "planta da casa".
- No código Java, qual a palavra-chave utilizada para criar uma instância de um objeto?
🟡 Intermediários
- Se você criar uma classe
Livrocom os atributostituloeautor, escreva como você instanciaria dois livros diferentes. - O que acontece na memória do computador quando executamos o comando
new MinhaClasse()?
🔴 Desafio
- Modele uma classe
Computadorcom 4 atributos (ex: marca, ram) e 2 métodos (ex: ligar, desligar). Represente isso através de um diagrama MermaidclassDiagram.
Exercícios - Aula 03 📝
🟢 Básicos
- Qual a diferença entre os modificadores
publiceprivate? - Para que serve um método construtor em Java?
🟡 Intermediários
- Por que é considerado uma "má prática" deixar os atributos de uma classe como
public? - Explique o uso da palavra-chave
thisdentro de um método ou construtor.
🔴 Desafio
- Crie uma classe
Contacom o atributosaldoprivado. Implemente um métodosacar(double valor)que verifique se o saldo é suficiente antes de realizar a operação. Se não for, exiba uma mensagem de erro.
Exercícios - Aula 04 📝
🟢 Básicos
- Qual a palavra-chave utilizada em Java para indicar que uma classe herda de outra?
- O que acontece se uma classe filha tentar acessar um atributo
privateda classe pai?
🟡 Intermediários
- Explique a diferença entre a "Superclasse" e a "Subclasse".
- Por que usamos a anotação
@Override? O que acontece se o nome do método for digitado errado?
🔴 Desafio
- Imagine um sistema de e-commerce. Crie uma hierarquia de classes para
Produto,Livro(tem autor e páginas) eEletronico(tem voltagem). Use Mermaid para o diagrama.
Exercícios - Aula 05 📝
🟢 Básicos
- Qual a principal diferença entre uma Classe Comum e uma Classe Abstrata?
- Como se chama op processo de uma classe "cumprir" os métodos definidos em uma Interface?
🟡 Intermediários
- Por que dizemos que uma Interface é um "contrato"?
- Uma classe pode herdar de uma classe abstrata e implementar duas interfaces ao mesmo tempo? Explique.
🔴 Desafio
- Projete a interface
Autenticavelcom o métodoautenticar(String login, String senha). Crie a classeUsuarioque implementa essa interface.
Exercícios - Aula 06 📝
🟢 Básicos
- Qual a regra de ouro para nomear pacotes (packages) em Java?
- O que acontece se tivermos duas classes com o mesmo nome em pacotes diferentes?
🟡 Intermediários
- Explique a importância da separação de responsabilidades (camadas).
- O que o comando
importfaz no topo do arquivo Java?
🔴 Desafio
- Desenhe a estrutura de pastas de um projeto chamado "SistEscola" que contenha as camadas de
view,modelecontroller.
Exercícios - Aula 07 📝
🟢 Básicos
- Identifique os papéis: Quem recebe o clique do botão? Quem salva no banco? Quem guarda o nome do produto? (MVC)
- Por que a View não deve ter código de conexão com o banco de dados?
🟡 Intermediários
- Descreva o caminho que a informação percorre no MVC quando um usuário clica para "Listar Produtos".
- Qual o perigo de ter uma "Fat View" (Visão gorda, com muita lógica)?
🔴 Desafio
- Refatore mentalmente um código onde o
JButtonfaz umINSERTdireto no banco. Como você dividiria isso em 3 classes (Produto, ProdutoController, TelaProduto)?
Exercícios - Aula 08 📝
🟢 Básicos
- Qual a função principal do
JFrameem uma aplicação Swing? - Cite 3 componentes visuais que podem ser adicionados a uma janela.
🟡 Intermediários
- Explique por que a programação de interface gráfica é chamada de "Orientada a Eventos".
- O que acontece com o processo do Java quando fechamos uma janela (
JFrame) se não configurarmos osetDefaultCloseOperation?
🔴 Desafio
- Desenhe (ou descreva) o ciclo de vida de um clique em um botão: desde a ação física do usuário até a execução do método no Java.
Exercícios - Aula 09 📝
🟢 Básicos
- Identifique o componente: Qual exibe texto fixo e qual permite que o usuário digite seu e-mail?
- Para que serve o método
.getText()?
🟡 Intermediários
- Como você faria para limpar todos os campos de um formulário após o usuário clicar em "Cancelar"?
- Explique a diferença entre
JTextFieldeJPasswordField. Qual deles é mais seguro para senhas e por quê?
🔴 Desafio
- Escreva um pequeno trecho de lógica que verifique se o campo "Idade" está vazio ou contém um valor negativo. Exiba um aviso caso ocorra.
Exercícios - Aula 10 📝
🟢 Básicos
- Qual componente você usaria para uma pergunta de "Sim/Não" independente?
- Por que usar
Layout Managersem vez de coordenadas fixas (X, Y)?
🟡 Intermediários
- Descreva a diferença entre
FlowLayouteGridLayout. - Como você garantiria que apenas um dos 4
JRadioButtonsde uma pergunta fosse selecionado?
🔴 Desafio
- Projete a estrutura de uma calculadora simples (0-9, +, -, =) usando
BorderLayoutpara o visor eGridLayoutpara os botões.
Exercícios - Aula 11 📝
🟢 Básicos
- Em quais ocasiões é melhor usar
JTabbedPaneem vez de criar várias janelas independentes? - Qual a relação entre uma
JTablee umTableModel?
🟡 Intermediários
- Como você faria para capturar qual linha o usuário clicou em uma
JTable? - Escreva uma breve explicação sobre como o bloco
try-catchajuda no tratamento de erros de conversão de dados (ex: converter texto em número).
🔴 Desafio
- Projete (diagrama ou texto) a barra de menu de um software de "Controle Hospitalar". Quais menus e submenus seriam essenciais?
Exercícios - Aula 12 📝
🟢 Básicos
- Qual a diferença entre uma "Tabela" e um "Registro" em um banco de dados?
- Para que serve o comando
SELECTem SQL?
🟡 Intermediários
- Escreva o comando SQL para criar uma tabela chamada
clientecom as colunasid(chave primária),nome(texto) eemail(texto). - Explique por que não é recomendado guardar senhas de usuários em texto limpo (sem criptografia) no banco de dados.
🔴 Desafio
- Modele um banco de dados para uma "Livraria" com duas tabelas:
LivroeAutor. Como você faria para ligar um livro a um autor?
Exercícios - Aula 13 📝
🟢 Básicos
- Qual a função do "Driver JDBC"?
- O que significa a sigla JDBC?
🟡 Intermediários
- Descreva o que acontece se esquecermos de fechar uma conexão com o banco de dados (
conn.close()). - Qual a diferença entre a URL de conexão do SQLite e a do MySQL?
🔴 Desafio
- Crie uma classe
DatabaseAdminque tenha um método para testar se o arquivo do banco de dados existe antes de tentar a conexão JDBC.
Exercícios - Aula 14 📝
🟢 Básicos
- Explique o que significa cada letra da sigla CRUD.
- Qual o objetivo principal de criar uma classe DAO?
🟡 Intermediários
- Imagine um método
excluir(int id)no DAO. Escreva o comando SQL que seria usado dentro dele. - Por que o Controller não deve conter comandos SQL como
INSERTouSELECT?
🔴 Desafio
- Projete a classe
FuncionarioDAO. Quais métodos ela deveria ter e quais seriam os parâmetros de cada um?
Exercícios - Aula 15 📝
🟢 Básicos
- Explique por que a concatenação de strings em SQL (
"WHERE nome = '" + nome + "'") é perigosa. - O que é um "Log" de sistema?
🟡 Intermediários
- Pesquise e explique brevemente o que é o princípio "DRY" (Don't Repeat Yourself).
- Como um desenvolvedor pode usar o "Breakpoints" para encontrar um erro difícil no código?
🔴 Desafio
- Escreva um bloco de código Java que tente realizar uma divisão por zero, capture a exceção e mostre um
JOptionPanecom uma mensagem educada para o usuário.
Exercícios - Aula 16 📝
🟢 Básicos
- Quais são as 4 camadas obrigatórias que seu projeto final deve ter?
- O que é o arquivo de documentação
README.mde por que ele é importante?
🟡 Intermediários
- Explique a importância de validar os dados na
Viewantes de enviá-los aoControllerno seu projeto final. - Como você organizaria o banco de dados do seu sistema para suportar a busca de registros por nome?
🔴 Desafio
- Escolha um dos temas sugeridos (Vendas, Biblioteca, Tarefas ou Pets) e faça um rascunho rápido (em tópicos) das telas e das tabelas que seu sistema terá.
Projetos
Projetos e Desafios 🚀
Aplicações práticas para consolidar o conhecimento em desenvolvimento desktop.
-
Módulo 1: Fundamentos OO ---
-
Módulo 2: MVC & Camadas ---
-
Módulo 3: Interface Swing ---
-
Módulo 4: Persistência JDBC ---
Projeto 01 - Primeiro Programa Desktop 🚀
Nesta atividade, vamos configurar o ambiente e executar nosso primeiro código Java no ambiente de terminal e IDE.
Atividades
- Instalar o JDK (Java Development Kit) versão 17 ou superior.
- Configurar uma IDE (IntelliJ IDEA, Eclipse ou VS Code).
- Criar a classe
HelloWorlde executá-la. - Experimentar a compilação manual via comando
javacno terminal.
Entrega
- Print da tela do terminal exibindo a mensagem "Olá, Mundo Desktop!".
- Código-fonte da classe criada.
Projeto 02 - Modelagem de Entidades 🧱
Vamos aplicar os conceitos de Classes e Objetos para modelar produtos de um sistema de estoque.
Atividades
- Criar a classe
Produtocom os atributosnome,precoequantidade. - Implementar um método
exibirInfo()que mostre os dados no console. - No método
main, instanciar pelo menos 3 produtos diferentes (ex: Teclado, Mouse, Monitor). - Atualizar o preço de um dos produtos e exibir os dados novamente.
Entrega
- Código da classe
Produto. - Código da classe
Mainpara teste.
Projeto 03 - Segurança de Dados com Encapsulamento 🔒
Neste projeto, vamos criar uma conta bancária segura protegendo o saldo de acessos indevidos.
Atividades
- Criar a classe
ContaBancaria. - Definir o atributo
saldocomoprivate. - Criar métodos
depositar(valor)esacar(valor)com validações básicas (ex: não aceitar valores negativos). - Implementar um construtor que inicialize o nome do titular e o saldo inicial.
Entrega
- Classe
ContaBancariacom Getters e Setters necessários. - Demonstração de uma tentativa de saque maior que o saldo disponível.
Projeto 04 - Hierarquia de Usuários 🧬
Vamos usar herança para organizar os diferentes tipos de usuários de um sistema empresarial.
Atividades
- Criar a classe base
Pessoa(nome, cpf). - Criar as subclasses
Cliente(limite) eFuncionario(salario). - Usar
@Overridepara personalizar o métodoexibirDados()em cada classe. - Criar uma lista de pessoas no
maine percorrer exibindo os dados de cada uma (Polimorfismo).
Entrega
- Diagrama de classes UML simples (Mermaid).
- Código-fonte das classes e do teste polimórfico.
Projeto 05 - Sistema de Pagamentos Abstrato 🧩
Implementação de diversos métodos de pagamento usando classes abstratas ou interfaces.
Atividades
- Criar a classe abstrata
Pagamentocom o método abstratoprocessar(). - Implementar as classes
CartaoCredito,BoletoePix. - Adicionar lógica específica em cada uma (ex: Cartão pede número, Boleto gera código).
- Simular o processamento de uma venda com diferentes meios de pagamento.
Entrega
- Código completo da estrutura de pagamentos.
- Documentação rápida sobre a vantagem de usar o método abstrato neste caso.
Projeto 06 - Arquitetura de Pastas Profissional 📂
Organização do sistema seguindo os padrões de pacotes da indústria.
Atividades
- Criar a estrutura de pacotes:
br.com.sistema.model,br.com.sistema.view,br.com.sistema.controller. - Mover as classes
Produtopara o pacote model. - Criar uma classe simples em cada pacote e realizar o
importcorreto entre elas. - Validar se o projeto continua compilando e executando após a mudança.
Entrega
- Árvore de diretórios do projeto (comando
treeou print). - Exemplo de um arquivo que utilize classes de mais de um pacote.
Projeto 07 - Implementando o MVC 🏗️
Neste projeto, vamos aplicar a separação total entre Interface, Lógica e Dados.
Atividades
- Criar o
ProdutoControllerpara gerenciar a lista de produtos. - Criar a classe
Produtono model. - Criar um console "View" (ou interface simples) que solicita os dados ao usuário.
- Garantir que a View peça ao Controller para salvar ou listar, sem mexer no Model diretamente.
Entrega
- Código organizado nas 3 pastas (model, view, controller).
- Relato sobre a dificuldade de separar as responsabilidades.
Projeto 08 - Minha Primeira Janela Swing 🎨
Criação da interface visual básica para a aplicação.
Atividades
- Criar uma classe herdando de
JFrame. - Configurar título, tamanho e operação de fechamento.
- Adicionar um
JButtoncentralizado. - Adicionar um
ActionListenerque exiba um "Olá!" ao clicar no botão.
Entrega
- Print da janela aberta.
- Código da classe
MinhaJanela.
Projeto 09 - Formulário de Dados Básicos 🏗️
Construção de um formulário de cadastro funcional com validação simples.
Atividades
- Adicionar
JLabeleJTextFieldpara Nome e E-mail. - Adicionar um botão "Salvar".
- Ao clicar em salvar, validar se os campos não estão vazios.
- Exibir os dados em um
JOptionPanede informação.
Entrega
- Código da classe da tela de cadastro.
- Print da validação de campo vazio funcionando.
Projeto 10 - Seleção de Preferências 🎛️
Uso de componentes de seleção e organização com layouts.
Atividades
- Criar um formulário de "Pesquisa de Perfil".
- Usar
JCheckBoxpara interesses (Programação, Design, Redes). - Usar
JRadioButtonpara nível de experiência (Iniciante, Pleno, Sênior). - Organizar os campos usando
GridLayout.
Entrega
- Código da tela organizado por painéis.
- Print da tela exibindo as seleções feitas pelo usuário.
Projeto 11 - Interface com Abas e Listagem 📑
Organização avançada com JTabbedPane e JTable.
Atividades
- Criar uma janela com duas abas: "Cadastro" e "Relatório".
- Na aba Relatório, adicionar uma
JTable. - Criar um botão na aba Cadastro que adicione os dados digitados diretamente na
JTableda outra aba. - Adicionar uma barra de menu (JMenuBar) com a opção "Sair".
Entrega
- Código da tela com abas e lógica da tabela.
- Print demonstrando a transição entre as abas.
Projeto 12 - Criando a Base de Dados 🗄️
Modelagem e criação física do banco de dados relacional.
Atividades
- Instalar o SQLite Browser (ou usar terminal).
- Criar o arquivo
meusistema.db. - Executar o comando SQL para criar a tabela
produtocom ID auto-incremento. - Inserir manualmente 5 registros de teste no banco.
Entrega
- Print do SQLite Browser exibindo a tabela e os dados.
- O arquivo do banco de dados (
.db).
Projeto 13 - Fábrica de Conexões 🔌
Implementação da ponte segura entre o Java e o SQLite.
Atividades
- Criar a classe
ConexaoDBusando o padrão Singleton ou apenas métodos estáticos. - Implementar o método
getConexao()que retorna umajava.sql.Connection. - Tratar as exceções de banco de dados com
try-catch. - Criar um método
mainsimples apenas para testar se a conexão abre e fecha sem erros.
Entrega
- Código da classe de conexão.
- Console exibindo "Conectado com sucesso!".
Projeto 14 - CRUD Completo com DAO 💾
Implementação da camada de persistência para a entidade Produto.
Atividades
- Criar a classe
ProdutoDAO. - Implementar os métodos
salvar,listar,atualizareexcluir. - Usar
PreparedStatementem todas as queries. - Criar um programa de teste (Console) que execute as 4 operações em sequência.
Entrega
- Código da classe
ProdutoDAO. - Print do console provando que o registro foi inserido, alterado e deletado.
Projeto 15 - Blindando o Sistema 🛡️
Refatoração do sistema focando em segurança e tratamento de erros.
Atividades
- Revisar todos os campos de texto para garantir que não há concatenação de SQL.
- Implementar uma classe de
Logsimples que escreva erros em um arquivo.txt. - Adicionar mensagens personalizadas ao usuário quando o banco de dados estiver inacessível.
- Experimentar o Debug da IDE para acompanhar o fluxo de um
INSERT.
Entrega
- Código refatorado com tratamentos de erro robustos.
- Exemplo do arquivo de log gerado após um erro simulado.
Projeto 16 - Sistema Completo Final 🚀
Consolidação de todos os módulos em um software desktop real.
Atividades
- Escolher um dos temas sugeridos (Vendas, Biblioteca, etc).
- Desenvolver a interface visual com Swing (Menus, Abas, Tabelas).
- Implementar a lógica no Controller e os dados no Model.
- Garantir persistência real no banco de dados via DAO.
- Criar o arquivo
README.mddo seu projeto.
Entrega
- Link do repositório ou arquivo compactado com o projeto completo.
- Documentação simplificada do sistema.
Quizzes
Quizzes Interativos 🧠
Teste seus conhecimentos rapidamente ao final de cada módulo do curso.
-
Fase 1: Fundamentos ---
-
Fase 2: Arquitetura ---
-
Fase 3: Componentes ---
-
Fase 4: Dados & Final ---
Quiz 01 - Introdução a Microsserviços 🌐
Quiz 02 - Arquitetura e Gateway 🏗️
Quiz 03 - Modelagem de APIs RESTful 📡
Quiz 04 - Documentação e Mocks 📝
Quiz 05 - Implementação de APIs ⚙️
Quiz 06 - Services e Regras de Negócio 🧠
Quiz 07 - Repositories e Banco de Dados 🗄️
Quiz 08 - Boas Práticas e Validação de Dados ✅
Quiz 09 - Segurança e Autenticação com JWT 🔐
Quiz 10 - Controle de Acesso (RBAC) 🛡️
Quiz 11 - Refresh Token e Segurança Avançada 🏗️
Quiz 12 - Introdução ao React ⚛️
Quiz 13 - Estado e Reatividade (useState) 🎣
Quiz 14 - Efeitos e APIs (useEffect) 🌐
Quiz 15 - Navegação com React Router 🚦
Quiz 16 - Projeto Final e Carreira 🎓
Slides
Slides das Aulas 📺
Material visual para acompanhamento dos conceitos teóricos e práticos.
-
Módulo 1: Fundamentos ---
-
Módulo 2: Arquitetura ---
-
Módulo 3: Interface GUI ---
-
Módulo 4: Persistência ---
Aula 01 - Introdução a Microsserviços 🌐
De Monólitos a Sistemas Distribuídos
Agenda de Hoje 📅
- Panorama do Software Moderno
- Monólitos vs Microsserviços
- A Economia das APIs
- Escalabilidade Vertical vs Horizontal
- Cinto de Utilidades (Ferramentas)
- Setup do Ambiente
1. O Mundo Cloud-Native ☁️
- Sistemas globais exigem disponibilidade 24/7.
- Milhões de requisições por segundo.
- Deploy contínuo (várias vezes ao dia).
2. A Evolução da Arquitetura 🏛️➡️🏗️
2.1 O Monólito 🏛️
- Um único projeto, um único deploy.
- Tudo ou nada: erro em um lugar afeta tudo.
- Difícil de escalar partes específicas.
- Ideal para: Projetos pequenos, MVPs rápidos.
2.2 Microsserviços 🏗️
- Conjunto de serviços independentes.
- Comunicação via rede (APIs).
- Cada um com seu banco de dados.
- Ideal para: Sistemas complexos e escaláveis.
3. O Papel das APIs 📡
- Contract-First: Acordo de comunicação.
- REST como padrão dominante.
- JSON: A língua universal.
Escalabilidade: Vertical vs Horizontal
| Vertical (Scale Up) | Horizontal (Scale Out) |
|---|---|
| Aumenta CPU/RAM | Adiciona mais servidores |
| Tem limite físico | Virtualmente ilimitada |
| Causa downtime no upgrade | Zero downtime (Redundância) |
Arquitetura de Microsserviços
graph LR
User[Cliente] --> AGW[API Gateway]
AGW --> S1[Usuários]
AGW --> S2[Pedidos]
AGW --> S3[Pagamentos]
S1 --> DB1[(DB)]
S2 --> DB2[(DB)]
S3 --> DB3[(DB)]
4. Ferramentas Indispensáveis 🛠️
Client HTTP: Postman & Insomnia
- Testar rotas sem Frontend.
- Analisar Headers e Status Codes.
- Simular diferentes cenários de erro.
Containerização: Docker 🐋
- "Roda na minha máquina, roda em qualquer lugar".
- Isola dependências e versões.
- Facilita a subida de múltiplos serviços locais.
5. Estrutura de Projeto Backend 📂
- Divisão clara de responsabilidades.
- Controllers, Services e Repositories.
- Tratamento global de exceções.
6. Setup do Ambiente 🚀
Requisitos:
- IDE: VS Code ou IntelliJ.
- Postman (Desktop ou Extensão).
- Docker Desktop.
- Git & GitHub.
Resumo da Aula ✅
- Microsserviços trazem resiliência e escala.
- APIs são o coração da comunicação moderna.
- Ferramentas como Docker mudaram o jogo.
- Começamos nossa jornada Fullstack!
Próxima Aula: Arquitetura e Gateway 🏗️
- Como os serviços conversam?
- O que é Service Discovery?
- Protegendo a porta de entrada.
Dúvidas? 🤔
"A arquitetura de hoje é o legado de amanhã. Escolha com sabedoria."
Aula 02 - Arquitetura e Gateway 🏗️
Orquestrando Microsserviços
Agenda 📅
- Comunicação entre Serviços
- Síncrono vs Assíncrono
- O Papel do API Gateway
- Service Discovery
- Load Balancing
- Padrões de Resiliência
1. Como os Serviços Conversam? 💬
- Microsserviços são ilhas que precisam de pontes.
- Dois mundos: Sync e Async.
1.1 Comunicação Síncrona 🔄
- Cliente bloqueia até a resposta.
- Uso de HTTP/REST ou gRPC.
- Risco: Acoplamento temporal e gargalos.
1.2 Comunicação Assíncrona 📬
- Envia e esquece (Eventos).
- Uso de Filas e Tópicos (Broker).
- Vantagem: Escalabilidade e desacoplamento.
2. API Gateway: O Porteiro 🚪
- Única entrada para o mundo exterior.
- Esconde a complexidade interna.
Gateway Responsibilities
- Roteamento:
/p-> Pagamento,/e-> Estoque. - Segurança: Autenticação centralizada.
- Rate Limit: Proteção contra flood.
- Logs & Monitoramento.
3. Service Discovery 🔎
- Onde está o servidor de pagamentos?
- Agenda dinâmica de IPs e Portas.
- Ferramentas: Netflix Eureka, Consul.
4. Load Balancing ⚖️
- Distribuição inteligente da carga.
- Evita que um container "morra" de trabalho.
graph TD
GW[Gateway] --> LB[Load Balancer]
LB --> S1[Serviço A]
LB --> S2[Serviço B]
LB --> S3[Serviço C]
5. Resiliência: Circuit Breaker 🔌
- Detecta serviços lentos ou falhos.
- Abre o circuito para proteger o resto do sistema.
- Evita o cascateamento de erros.
Comparativo: Sync vs Async
| Característica | Síncrono 🔄 | Assíncrono 📬 |
|---|---|---|
| Resposta | Imediata | Eventual |
| Desempenho | Limitado pelo destino | Alto débito |
| Uso comum | Cadastro/Login | Geração de Relatórios |
6. Prática: O "Dashboard" Agregador 💻
- Como o Gateway une dados de 3 serviços?
- Agregação de respostas (Aggregation Pattern).
Desafio Relâmpago ⚡
O que acontece se o seu API Gateway cair? Ele é um ponto único de falha?
Resumo ✅
- Sync é fácil, Async é escalável.
- API Gateway protege e organiza.
- Service Discovery é essencial em containers.
- Resiliência não é opcional!
Próxima Aula: Modelagem REST 📡
- Verbos HTTP.
- Status Codes.
- O contrato ideal.
Dúvidas? 🏗️
Aula 03 - Modelagem de APIs RESTful 📡
Recursos, Verbos e Contratos
Agenda 📅
- O que é REST?
- Recursos e URIs
- Verbos HTTP (GET, POST, PUT...)
- Status Codes
- JSON: A Linguagem das APIs
- Boas Práticas de Design
1. REST: A "Língua" da Web 🌐
- Style arquitetural para sistemas distribuídos.
- Baseado no protocolo HTTP.
- Independência entre Client e Server.
Princípios REST
- Stateless: Cada requisição é única.
- Uniform Interface: Padrões compartilhados.
- Cacheable: Melhore a performance.
2. Identificando Recursos 📍
- Um recurso é qualquer coisa que expomos.
- URI: O endereço do recurso.
O que NÃO fazer:
GET /obterUsuarios ❌
O que fazer:
GET /usuarios ✅ (Sempre substantivos no plural!)
3. Os Verbos HTTP 🛠️
Eles definem a intenção da chamada:
- GET: Buscar dados.
- POST: Criar novo dado.
- PUT: Atualizar (Trocar tudo).
- PATCH: Atualizar (Apenas um pedaço).
- DELETE: Remover dado.
Idempotência e Segurança
| Verbo | Seguro? | Idempotente? |
|---|---|---|
| GET | Sim ✅ | Sim ✅ |
| POST | Não ❌ | Não ❌ |
| PUT | Não ❌ | Sim ✅ |
| DELETE | Não ❌ | Sim ✅ |
4. Status Codes: A Resposta 🚦
- 2xx: Deu certo! (200, 201, 204).
- 4xx: Você (cliente) errou algo (400, 401, 404).
- 5xx: Eu (servidor) quebrei (500, 503).
5. O Formato JSON 🏗️
- Leve, legível e universal.
6. Design de URIs Complexas
Como buscar os pedidos de um usuário específico?
GET /usuarios/123/pedidos ✅
- Hierarquia lógica e limpa.
7. Prática: Postman em Ação 💻
- Testando verbos em APIs reais.
- Analisando Headers e Body.
Desafio REST ⚡
Se você quer mudar apenas o e-mail de um usuário, qual verbo deve usar: PUT ou PATCH?
Resumo ✅
- REST é sobre recursos e padrões.
- URIs usam substantivos no plural.
- Status codes guiam o frontend.
- JSON é o padrão de facto.
Próxima Aula: Swagger e Mocks 📝
- Documentação automática.
- Como trabalhar sem o backend pronto?
Dúvidas? 📡
Aula 04 - Documentação e Mocks 📝
Developer Experience e Contratos
Agenda 📅
- Por que documentar?
- OpenAPI vs Swagger
- Swagger UI e Editor
- O Poder dos Mocks
- Developer Experience (DX)
- Ferramentas de Simulação
1. Documentação é DX 🚀
- Sua API é seu produto.
- Documentar economiza tempo de suporte.
- Facilita a integração com Front/Mobile.
2. OpenAPI (OAS) 📜
- O padrão mundial.
- Arquivo YAML ou JSON descritivo.
- Agnóstico de linguagem.
3. Swagger: O Canivete Suíço 🛠️
- Editor: Escreva e valide o contrato.
- UI: Gere a página visual de testes.
- Codegen: Gere código (client/server) automaticamente.
Swagger UI em Ação
- Permite testar endpoints no próprio navegador.
- Mostra exemplos de JSON de entrada e saída.
- Exibe todos os Status Codes possíveis.
4. O Poder dos Mocks 🎭
- Development in Parallel: Front não espera pelo Back.
- Servidor "Fake" que retorna dados reais.
- Valide a experiência antes da implementação complexa.
5. Developer Experience (DX) 👨💻
Como ser amado por outros devs:
- Nomes de rotas claros.
- Erros descritivos no Body.
- Exemplos de requisição.
- Documentação atualizada (ou gerada pelo código).
6. Ferramentas Recomendadas 🧰
- Swagger Editor: Online ou Local.
- Mockoon: Mock local amigável.
- Prism: Mock via CLI.
- Postman: Collections documentadas.
7. Prática: Editando um YAML 💻
- Desenhando um endpoint
GET /tarefas. - Definindo parâmetros de entrada.
- Criando esquemas de dados.
Desafio: Mock vs Stubs ⚡
Qual a principal vantagem de um Mock Server online (como Postman) em relação a um Mock rodando apenas no computador do desenvolvedor?
Resumo ✅
- OpenAPI é o contrato.
- Swagger UI é a vitrine da sua API.
- Mocks destravam o desenvolvimento da equipe.
- DX é o diferencial de uma boa API.
Próxima Aula: Implementação Backend! 💻
Módulo 2: Manipulação de Dados
- Controllers e Services.
- Repositories e Banco de Dados.
- Mão na massa com código real!
Dúvidas? 📝
Aula 05 - Implementação de APIs ⚙️
Controllers e Rotas
Agenda 📅
- Camadas do Backend
- O Papel do Controller
- Rotas e Handlers
- Capturando Dados (Params/Body)
- Status Codes na Prática
- Injeção de Dependência
1. Organização em Camadas 🧱
- Controller: Trata a entrada (HTTP).
- Service: Regras de negócio.
- Repository: Acesso ao banco.
2. O Papel do Controller 🎮
- Ele é o ponto de entrada.
- Não deve ter lógica complexa!
- Deve apenas orquestrar a execução.
Controller = Garçom 🤵 Service = Cozinheiro 👨🍳
3. Rotas e Handlers 📍
- Rota: Verbo HTTP + Path.
- Handler: Função executada.
4. Capturando Dados 📥
- Path Params:
/id/123(Identificação). - Query Params:
?q=busca(Filtro). - Body: Enviando JSON (Criação/Update).
5. Respostas de Qualidade 📤
- Nunca esqueça o Status Code!
- Sucesso: 200, 201, 204.
- Erro: 400, 401, 404, 500.
6. Injeção de Dependência 💉
- Receber serviços prontos.
- Facilita testar o Controller "isolado".
7. Prática: O Primeiro Endpoint 💻
- Mapeando um
GET /ping. - Retornando um
pongem JSON. - Testando no Insomnia/Postman.
Desafio: Params vs Query ⚡
Se você quer listar todos os alunos de uma sala com o nome "Pedro", qual tipo de parâmetro você usaria para o nome?
Resumo ✅
- Controllers são a porta de entrada.
- Devem ser leves e objetivos.
- Capturam dados e retornam status/JSON.
- Seguem as rotas definidas.
Próxima Aula: Regras de Negócio! 🧠
Services e Validações
- Onde o cálculo acontece.
- Isolando o código do "mundo externo".
Dúvidas? ⚙️
Aula 06 - Services e Regras de Negócio 🧠
O Cérebro da Aplicação
Agenda 📅
- Por que separar as coisas?
- Responsabilidades do Service
- O Fluxo: Controller -> Service
- Tratamento de Erros Profissional
- DTOs: Protegendo os Dados
- Service vs ViewModel (Mobile)
1. O Problema: "Controller Gordo" 🍔
- Lógica de negócio misturada com HTTP.
- Código impossível de reutilizar.
- Difícil de testar.
2. A Solução: Layered Architecture 🧱
- Controller: Trata o transporte (HTTP).
- Service: Trata a regra (O QUE fazer).
3. O que vai no Service? ⚖️
- Validações complexas.
- Cálculos de valores.
- Envio de e-mails/notificações.
- Integração com repositórios.
4. Tratamento de Erros ⚠️
- O Service Lança (Throws).
- O Controller Captura (Catches).
// Service
if (!saldo) throw new Error("Saldo Insuficiente");
// Controller
try { ... } catch (e) { res.status(400)... }
5. DTOs: Filtrando a Saída 📦
- Nunca envie "tudo" do banco para o cliente.
- Proteja campos sensíveis (Ex:
senha_hash). - Melhore a performance (menos dados trafegados).
6. Service vs ViewModel 🆚
- No Backend: Service é o cérebro.
- No Mobile/Front: ViewModel é o cérebro.
- Ambos servem para "limpar" a camada de visualização.
7. Prática: Validando um Cadastro 💻
- Verificando se o e-mail é válido.
- Verificando se o usuário já existe.
- Lançando erros específicos.
Desafio: Onde colocar? ⚡
Se uma regra diz: "Usuários VIP ganham 20% de desconto", essa regra deve ficar no Controller ou no Service?
Resumo ✅
- Controllers recebem, Services processam.
- Mantenha seus Controllers "finos" (Slim Controllers).
- Centralize as regras para facilitar a manutenção.
- DTOs são as fronteiras dos dados.
Próxima Aula: Onde os dados vivem! 🗄️
Repositories e Banco de Dados
- PostgreSQL e SQL básico.
- Camada de persistência.
Dúvidas? 🧠
Aula 07 - Repositories e Banco de Dados 🗄️
Onde a informação descansa
Agenda 📅
- Por que Bancos de Dados?
- PostgreSQL: O Robusto
- SQL Básico (SELECT, INSERT...)
- Relacionamentos (1:N, N:N)
- Camada de Persistence
- O Padrão Repository
1. Persistência de Dados 💾
- Sem banco, o servidor esquece tudo ao reiniciar.
- Precisamos de segurança e integridade.
- Estritamente Tipado: O banco garante o formato.
2. Por que PostgreSQL? 🐘
- Código Aberto (Open Source).
- Extremamente confiável (ACID).
- Suporta dados complexos (JSONB).
3. SQL: A Linguagem Universal 🗣️
- DDL: Define a estrutura (Tabelas).
- DML: Manipula os dados (Linhas).
4. O Coração: Relacionamentos 🔗
- 1:N: Um cliente, muitos pedidos.
- N:N: Muitos alunos, muitos cursos.
- Foreign Key: A âncora que liga tudo.
5. Camada de Persistence 🧱
- O código que conversa com o driver do banco.
- Onde as queries são traduzidas para o código.
6. Padrão Repository 📥
- "Não me diga como, diga O QUE você quer".
- Isola o SQL da regra de negócio.
7. Migrations 📜
- Controle de versão para o Banco.
- Permite "voltar no tempo" se algo quebrar.
- Mantém o time em sincronia.
Desafio SQL ⚡
Qual comando você usaria para mudar o preço de todos os produtos da categoria 'Games' para 99.90?
Resumo ✅
- Bancos de dados dão memória ao sistema.
- PostgreSQL é o padrão da indústria.
- SQL é habilidade obrigatória para backend.
- Repository Pattern traz flexibilidade.
Próxima Aula: Integridade! ✅
Validação e Boas Práticas
- Garantindo que dados "sujos" não entrem no banco.
- Tratamento de exceções de banco.
Dúvidas? 🗄️
Aula 08 - Boas Práticas e Validação ✅
Qualidade e Segurança no Backend
Agenda 📅
- Por que Validar Tudo?
- Validação vs Sanitização
- Schema Validation (Ex: Zod)
- Clean Code (Código Limpo)
- Tratamento de Erros Profissional
- Middlewares Globais
1. Regra de Ouro: Desconfiança 🛡️
- O cliente é o "lado perigoso" da aplicação.
- Validações evitam dados corrompidos.
- Defesa em Profundidade: Garanta a regra no banco E no código.
2. Validar vs Sanitizar 🧼
- Validar: Checar (Idade > 18?).
- Sanitizar: Limpar (Remover
<script>).
3. Schema Validation 📐
- Crie "moldes" para seus dados.
- Validação centralizada e reutilizável.
4. O Backend Elegante (Clean Code) ✨
- DRY: Don't Repeat Yourself (Não repita lógica).
- KISS: Keep It Simple, Stupid (Mantenha o simples).
- Nomes de funções que explicam o que está acontecendo.
5. Tratamento de Erros 🚨
- Controller trata o fluxo, não o detalhe técnico.
- Try/Catch Global: Evite crashes.
- Mensagens amigáveis para o cliente.
6. Logs vs Mensagens 📜
- Terminal/Log: Detalhe técnico completo.
- Cliente (JSON): Apenas o que ele precisa saber.
"Ocorreu um erro interno" (Cliente) ✅ "Query failed at line 42 due to NULL constraint" (Logs) ✅
7. Prática: O Schema Perfeito 💻
- Validando um produto complexo.
- Tratando erros de tipo (String no lugar de Number).
Desafio: Limpeza ⚡
Se você recebe um texto de um post com muitos espaços em branco no final, você deve Validar ou Sanitizar?
Resumo ✅
- Backend robusto exige validação rigorosa.
- Limpe os dados antes de salvar (Sanitize).
- Middleware Global centraliza a gestão de falhas.
- Código limpo economiza meses de manutenção.
Próxima Aula: Módulo 3! 🔐
Segurança e Autenticação
- Quem é você? (Authentication).
- O que você pode fazer? (Authorization).
Dúvidas? ✅
Aula 09 - Segurança e Autenticação com JWT 🔐
Portas trancadas e Crachás Digitais
Agenda 📅
- Autenticação vs Autorização
- O Fim das Sessões (Stateful)
- O que é JWT?
- Estrutura: Header, Payload, Signature
- Fluxo de Login completo
- Melhores Práticas de Segurança
1. Quem é Você? (Autenticação) 🚦
- Validar a identidade do usuário.
- Login e Senha.
- Autorização: O que você PODE fazer? (Níveis de acesso).
2. Por que JWT? 🤔
- Abordagem Stateless (Sem estado).
- O servidor não guarda sessão na memória (escalável!).
- Perfeito para Microserviços e Mobile.
3. Estrutura do Token 🎫
- Header: Algoritmo (ex: HS256).
- Payload: Os dados (id, role, nome).
- Signature: O lacre de segurança.
4. O Coração do JWT: A Assinatura 🖋️
- Usa uma
SECRET_KEYno servidor. - Garante que o token não foi "hackeado" ou alterado.
5. Fluxo de Login 🌊
- Envia credenciais -> 2. Servidor valida -> 3. Gera JWT -> 4. Frontend guarda o Token -> 5. Envia no Header em cada requisição.
6. Segurança em Mobile 📱
- Nunca guarde em arquivos de texto!
- Use EncryptedSharedPreferences (Android) ou Keychain (iOS).
7. Melhores Práticas 🏆
- Use chaves secretas longas e seguras.
- Defina tempo de expiração (
expiresIn). - Protocolo HTTPS é obrigatório!
Desafio de Segurança ⚡
O Payload do JWT é criptografado ou apenas codificado? Posso guardar a senha do usuário lá?
Resumo ✅
- JWT permite autenticação rápida e escalável.
- Header + Payload + Signature.
- Stateless = Servidor mais leve.
Próxima Aula: Controle de Acesso 🛡️
Quem manda aqui? (RBAC)
- Middlewares de autorização.
- Protegendo rotas por nível de usuário.
Dúvidas? 🔐
Aula 10 - Controle de Acesso (RBAC) 🛡️
Hierarquia e Segurança em Camadas
Agenda 📅
- O que é RBAC? (Roles)
- Autenticação vs Autorização
- O Fluxo do Middleware
- Erros 401 vs 403
- Protegendo rotas na prática
- Hierarquia de Perfis
1. Role-Based Access Control 👑
- Permissões ligadas a Perfis (Roles).
- Ex: ADMIN, EDITOR, VIEWER.
- Facilita a gestão de milhares de usuários.
2. A Cancela (Middleware) 🚧
- O middleware checa se o usuário tem a "chave" certa.
- Se não tiver -> 403 Forbidden.
- Se tiver ->
next().
3. O Fluxo de Segurança 🌊
graph LR
Req[Request] --> Auth[Autenticação]
Auth --> |OK| Role[Autorização]
Role --> |OK| Controller[Recurso Final]
4. 401 vs 403: Não confunda! ❌
- 401 (Unauthorized): "Quem é você?". Token inválido ou ausente.
- 403 (Forbidden): "Eu sei quem você é, mas não deixo entrar". Falta de permissão.
5. Implementação Dinâmica 🔒
// Middleware genérico
router.delete('/usuario/:id',
autenticar,
autorizar(['ADMIN']),
userController.remover
);
6. Hierarquia de Acesso 🏛️
- Um Admin deve poder acessar rotas de User?
- Design de sistema: Roles "Pai" e "Filho".
7. Melhores Práticas 🏆
- Centralize a lógica em Middlewares.
- Nunca exponha permissões sensíveis no frontend (segurança do lado do servidor).
Desafio: Segurança ⚡
Em um sistema escolar, o Diretor e o Professor podem ver notas. O Aluno só vê as dele. Como você configuraria a Role da rota GET /notas?
Resumo ✅
- RBAC organiza permissões por grupos.
- Middlewares são os guardiões das rotas.
- Diferenciar 401 de 403 é vital para Debug.
Próxima Aula: Segurança Avançada 🏗️
Session vs Token e Refresh Tokens
- O que fazer quando o token expira?
- Protegendo contra ataques comuns (XSS, CSRF).
Dúvidas? 🛡️
Aula 11 - Refresh Token e Segurança Avançada 🏗️
Blindando sua API contra o mundo
Agenda 📅
- O Problema do Token Curto ⏰
- Refresh Tokens (O que são?)
- CORS: Origens e Destinos
- Helmet: Headers de Aço
- Rate Limit: Contra Brute Force
- Ataques Comuns (XSS, Injection)
1. Por que Tokens Expiram? ⏰
- Segurança! Se roubarem o token, ele dura pouco.
- Problema: O usuário odeia fazer login toda hora.
2. Refresh Token 🔁
- Um token de longa duração (7 dias+).
- Serve apenas para trocar por um novo Access Token.
- Deve ser invalidado se o usuário deslogar.
3. CORS: Cross-Origin Resource Sharing 🌍
- "Quem pode me chamar?".
- Resolvido via Headers no Servidor.
- Nunca use
origin: '*'em ambientes reais!
4. Helmet: Proteção de Headers 🪖
- Remove o
X-Powered-By(não diz que é Express). - Adiciona proteção contra Clickjacking e XSS.
5. Rate Limiting 🔨
- 5 tentativas de login por minuto? Sim.
- Evita que robôs tentem descobrir senhas via "força bruta".
6. Onde salvar os Tokens? 🛡️
- Frontend: LocalStorage? Seguro?
- Melhor Prática: Cookies
HttpOnly+Secure.
7. Melhores Práticas de Segurança 🏆
- Use HTTPS sempre.
- Valide TODAS as entradas do usuário.
- Mantenha as bibliotecas atualizadas.
Desafio de Segurança ⚡
Qual a diferença entre 401 e 403 no contexto de Refresh Tokens? Se eu recebo 401, eu tento o refresh ou deslogo o usuário?
Resumo ✅
- Refresh Token equilibra UX e Segurança.
- CORS e Helmet são as portas do seu castelo.
- Proteja-se contra robôs com Rate Limit.
Próximo Módulo: Front-End Moderno 🎨
Saindo das APIs e indo para a Web!
- Introdução ao React/Vite.
- Consumindo nossas APIs no navegador.
Dúvidas? 🏗️
Aula 12 - Introdução ao React ⚛️
O Poder dos Componentes Modernos
Agenda 📅
- O que são SPAs?
- Por que React?
- Vite: A Ferramenta Rápida
- JSX: JS + HTML
- Componentes e LEGO
- Props: O Coração Dinâmico
1. Single Page Applications (SPA) 📄
- O site que nunca recarrega.
- Navegação fluida e instantânea.
- Ex: Gmail, Facebook, Spotify Web.
2. Por que o React venceu? ⚔️
- Componentização (Foco no Reuso).
- Virtual DOM (Foco na Performance).
- Gigantesco Ecossistema (Foco no Emprego).
3. Vite: O Novo Padrão ⚡
- Inicia o projeto em segundos.
- Feedback instantâneo durante o código.
4. JSX: A Mistura Perfeita 🧪
- Parece HTML, mas tem o poder do Javascript.
5. Componentes = LEGO 🧩
- Pequenas partes isoladas.
- Facilita testes e trabalho em equipe.
6. Props: Passando o Bastão 🎁
- Permite que componentes recebam dados do "pai".
- Torna componentes genéricos e reutilizáveis.
Resumo ✅
- SPA torna a Web parecida com Apps.
- React organiza sua UI em componentes.
- Vite é seu melhor amigo no desenvolvimento.
Próxima Aula: Dinâmica e Estado 🎣
O que acontece quando o usuário clica?
- Hooks:
useState. - Reatividade na prática.
Dúvidas? ⚛️
Aula 13 - Estado e Hooks 🎣
Tornando seu App Interativo
Agenda 📅
- O que é o Estado (State)?
- Hook
useState - Lidando com Cliques e Eventos
- Inputs Controlados
- Imutabilidade e Arrays
1. O Problema da Estática 🧱
- Variáveis comuns mudam nos bastidores...
- ...mas a tela continua a mesma!
- O React precisa de um sinal para re-desenhar.
2. useState: O Motor de Mudança 🚀
- cont: O valor atual.
- setCont: A função que atualiza.
- 0: O ponto de partida.
3. Eventos no React ⚡
onClick={funcao}onChange={(e) => ...}- Sempre em CamelCase!
4. Inputs Controlados ⌨️
- O React é quem manda no valor do input.
value={estado}+onChange.- Facilita validação e limpeza de campos.
5. Imutabilidade (Muito Importante!) 💎
- Nunca altere o estado original:
lista.push(x)❌ - Sempre crie uma cópia nova:
setLista([...lista, x])✅
6. Fluxo de Dados 🌊
- O estado flui do Pai para o Filho via Props.
- Se o estado do Pai muda, todo mundo abaixo dele atualiza.
Desafio de Estado ⚡
Se eu tenho um botão que soma +1 ao contador, o que acontece com a interface se eu esquecer de importar o useState e usar uma variável global let contador = 0?
Resumo ✅
useStatetraz vida aos componentes.- Mudança de estado = Re-renderização.
- Use sempre funções disparadoras (
set...).
Próxima Aula: Efeitos e APIs 🌐
Buscando dados no mundo real!
- Hook:
useEffect. - Consumindo nossa API Backend.
Dúvidas? 🎣
Aula 14 - Efeitos e APIs 🌐
Conectando seu App ao Mundo Real
Agenda 📅
- O que são Side Effects?
- Hook
useEffect - O Array de Dependências
- Buscando dados com
fetch - Estados de Carregamento e Erro
1. Além da Interface 🧪
- Efeitos colaterais são ações que tocam o mundo externo ao componente.
- Ex: Buscar usuários, mudar o título da aba, iniciar um cronômetro.
2. useState vs useEffect 🥊
- useState: Para dados que o usuário vê mudando.
- useEffect: Para ações que o componente faz "sozinho".
3. Os 3 Momentos do useEffect 🕒
- Montagem: Quando o componente nasce.
- Atualização: Quando um dado monitorado muda.
- Desmontagem: Quando o componente morre (Cleanup).
4. O Array de Dependências [] 🗃️
[]-> Roda só uma vez.[cont]-> Roda sempre quecontmudar.Sem array-> Roda em toda atualização (Perigo!).
5. Chamadas de API (Fetch) 📨
useEffect(() => {
fetch("https://api...")
.then(res => res.json())
.then(data => setData(data));
}, []);
6. UX: Estados de Rede 🛡️
- Loading: Mostre um Spinner enquanto espera.
- Error: Avise se a internet caiu ou o usuário não existe.
- Empty: Diga se não há resultados.
Desafio de Efeito ⚡
Se você colocar um alert("Olá") dentro de um useEffect sem o array [], quantas vezes o alerta vai aparecer se o usuário ficar digitando em um campo de texto que atualiza o estado?
Resumo ✅
useEffectorganiza as ações assíncronas.- Controle quando rodar via array de dependências.
- Trate sempre o carregamento e erros para uma boa UX.
Próxima Aula: Navegação 🚦
Multi-páginas com React Router!
/home,/perfil,/contato.- Links e Navegação Programática.
Dúvidas? 🌐
Aula 15 - React Router 🚦
Criando Apps Multi-Página
Agenda 📅
- O que são SPAs?
- Multi-páginas (Simuladas)
- Componentes de Rota
- Navegação (
LinkeuseNavigate) - Parâmetros dinâmicos (
:id)
1. O Mundo do SPA ⚛️
- O site é uma única página HTML.
- O Javascript "troca" a tela sem recarregar.
- UX rápida e fluida.
2. React Router Dom ⚙️
- A biblioteca padrão para web.
- Permite que a URL combine com o que aparece na tela.
3. A Estrutura Básica 🏗️
- BrowserRouter: O container principal.
- Routes: O seletor de rotas.
- Route: Define o caminho (
path) e o componente (element).
4. Navegando sem Recarregar! 🏃♂️
- Use
<Link to="/contato"> - NUNCA use
<a href="...">para rotas internas.
5. Navegação Programática 🚀
- Ideal para redirecionar após ações (Login, Clique em Card).
6. Rotas Dinâmicas (URL Params) 🆔
path="/perfil/:username"- Hook
useParams()captura o valor. - Uma única página que se adapta a mil perfis.
7. Página 404 (Not Found) 👻
path="*"- Garante que o usuário nunca caia em uma tela em branco.
Desafio de Roteamento ⚡
Se eu digitar www.meusite.com/asdfg e não tiver uma rota configurada para isso, o que o usuário vai ver se eu NÃO colocar uma rota com o path="*"?
Resumo ✅
- Roteamento traz a sensação de um site real.
- Hooks
useNavigateeuseParamssão essenciais. - SPAs são o padrão da indústria moderna.
Próxima Aula: O Grande Final 🏆
Projeto Integrado: Backend + Frontend!
- Conectando nossa API Node ao site React.
- O Projeto Final do Curso!
Dúvidas? 🚦
Aula 16 - Projeto Final e Conclusão �
De aluno a Desenvolvedor Full-Stack
Agenda 📅
- O Desafio Final 🔗
- Requisitos Técnicos
- Portfólio no GitHub
- Onde continuar estudando?
- Mensagem de Encerramento
1. O Desafio Final 🚀
Você deve entregar um projeto integrado contendo: - Frontend: SPA em React com rotas. - Backend: API segura em Node.js. - Integração: Conexão real entre os dois. - Design: CSS moderno e responsivo.
2. Sugestões de Temas 💡
- Gerenciador de Tarefas �
- Mini E-commerce 🛒
- Rede Social Simplificada 💬
- Dashboard de Monitoramento 📊
3. O README de Elite ✨
- Prints ou Vídeos do site funcionando.
- Lista detalhada de tecnologias.
- Guia: "Como rodar o Projeto".
4. Onde ir agora? 📚
- TypeScript: Segurança de tipos.
- Bancos SQL: Postgres e MySQL.
- Next.js: O rei do mercado React.
- Docker: Infraestrutura moderna.
5. Soft Skills 🤝
- Não é só saber programar!
- Trabalho em equipe.
- Resolução de problemas reais.
6. O Mercado Full-Stack 📈
- Demanda altíssima por devs completos.
- Salários excelentes.
- Dashboards e Sistemas Web movem o mundo!
7. Mensagem Final 🌟
"Programar é a arte de criar soluções onde antes só havia problemas."
- Você construiu a base sólida.
- O código é sua ferramenta de transformação.
Parabéns pela Jornada! 🎓🚀
Vá e construa o futuro da Web.
Dúvidas Finais? 🤔
Configuração
Configuração do Ambiente 🛠️
Guias passo a passo para preparar sua máquina para o desenvolvimento Java Desktop.
-
:material-java: Desenvolvimento Java --- Instalação do JDK 17+ e configuração das variáveis de ambiente.
-
IDE (Ambiente) --- Configuração do IntelliJ IDEA ou Eclipse para projetos Java.
-
Banco de Dados --- Instalação do SQLite e ferramentas de visualização (DB Browser).
Setup 01: Android Studio 🤖
O Android Studio é a IDE oficial para o desenvolvimento Android.
1. Requisitos de Sistema
- RAM: Mínimo 8GB (Sugerido 16GB+).
- Espaço: Mínimo 10GB para IDE + SDKs.
- Processador: Intel Core i5 ou equivalente.
2. Instalação
- Acesse o site oficial: developer.android.com/studio.
- Baixe a versão mais recente para o seu Sistema Operacional.
- Execute o instalador e escolha a opção "Standard" na configuração inicial.
3. Configurando o SDK
- Após a instalação, vá em Settings > Languages & Frameworks > Android SDK.
- Certifique-se de que a versão mais recente do Android (estável) esteja instalada.
- Na aba SDK Tools, instale o "Android Emulator" e o "Intel x86 Emulator Accelerator (HAXM)" se estiver no Windows com Intel.
4. Criando um Emulador (AVD)
- Abra o Device Manager.
- Clique em Create Device.
- Escolha um dispositivo (ex: Pixel 7).
- Selecione uma imagem de sistema (ex: Level 34 - Android 14).
- Finalize e clique no "Play" para iniciar o celular virtual.
5. Solução de Problemas ⚠️
- VT-x is disabled: Você precisa habilitar a virtualização na BIOS do seu computador.
- Studio muito lento: Adicione a pasta do projeto e as pastas do Android SDK nas exclusões do seu Antivírus.
Setup 02: Xcode (iOS Foundation) 🍎
O Xcode é a ferramenta necessária para compilar e testar apps iOS.
[!IMPORTANT] O Xcode requer um computador Mac (macOS).
1. Instalação
- Abra a App Store no seu Mac.
- Pesquise por Xcode.
- Clique em Obter/Instalar.
- Após o download, abra o Xcode para carregar os componentes adicionais do macOS.
2. Configurando Simuladores
- Vá em Settings > Platforms.
- Verifique se o componente "iOS" está baixado.
- Se não estiver, clique em "GET" para baixar a versão mais estável.
3. Comandos de Linha (CLI)
Para que ferramentas de automação funcionem, você precisa instalar os Command Line Tools:
4. Opcional: CocoaPods
Muitos projetos iOS antigos ainda usam CocoaPods para dependências:
5. Solução de Problemas ⚠️
- Espaço em Disco: O Xcode é muito grande. Garanta pelo menos 40GB de espaço livre para ele e os simuladores.
- Build Lento: Use simuladores de modelos mais simples (ex: iPhone SE) para poupar memória RAM se necessário.
Sobre
Sobre o Curso
🎓 Desenvolvimento Desktop Profissional
Este curso foi projetado para capacitar desenvolvedores na criação de aplicações desktop robustas, focando na Programação Orientada a Objetos, Arquitetura MVC e integração com Banco de Dados Relacional.
🎯 Objetivos do Curso
-
Aplicações Robustas --- Compreender a arquitetura de sistemas que rodam diretamente no sistema operacional, com alto desempenho e acesso a recursos locais.
-
Padrões de Projeto --- Dominar o padrão MVC e DAO para criar códigos organizados, testáveis e fáceis de manter.
-
Persistência de Dados --- Implementar armazenamento real de informações utilizando SQL e drivers JDBC, garantindo a integridade dos dados.
-
Interface Gráfica (GUI) --- Desenvolver interfaces ricas e funcionais utilizando a biblioteca Swing, focando em usabilidade e experiência do usuário.
📚 O Que Você Vai Aprender
Módulo 1 – Fundamentos e OO
- Classes, Objetos e Instanciação
- Encapsulamento, Getters e Setters
- Herança, Polimorfismo e Sobre-escrita
- Classes Abstratas e Interfaces
Módulo 2 – Estruturação e Arquitetura
- Organização de Projetos e Pacotes
- Padrão de Arquitetura MVC
- Separação de Responsabilidades
- Refatoração de Código
Módulo 3 – Interface Gráfica (GUI)
- Conceitos de GUI e Eventos
- Componentes Básicos e Intermediários
- Layout Managers (Border, Flow, Grid)
- Interfaces Avançadas (Tabelas e Menus)
Módulo 4 – Banco de Dados e Persistência
- Introdução ao SQL e SQLite
- Conexão JDBC e Driver Manager
- Padrão DAO (CRUD Completo)
- Segurança e Prevenção de SQL Injection
🛠️ Metodologia
Foco 100% prático baseado em projetos (PBL). Cada aula introduz um novo conceito que é imediatamente aplicado em um mini-projeto, culminando em um sistema completo ao final do curso.
Pronto para dominar o Desktop? Começar Agora
Roadmap do Projeto 🗺️
Este documento descreve a evolução do aprendizado ao longo das 16 aulas.
graph TD
A1[Aula 01: Introdução] --> A2[Aula 02-05: Fundamentos OO]
A2 --> A3[Aula 06-07: Arquitetura MVC]
A3 --> A4[Aula 08-11: Interfaces GUI]
A4 --> A5[Aula 12-15: Banco de Dados/DAO]
A5 --> A6[Aula 16: Projeto Final 🚀]
📈 Marcos do Aprendizado
- Marco 1: Pensamento OO (Aulas 01-05)
Capacidade de abstrair problemas reais em classes e objetos.
- Marco 2: Organização Profissional (Aulas 06-07)
Aplicação de padrões de mercado para estruturação de software.
- Marco 3: Domínio da Interface (Aulas 08-11)
Criação de janelas e componentes que interagem com o usuário.
- Marco 4: Persistência Robusta (Aulas 12-15)
Integração segura com bancos de dados relacionais.
- Marco Final: O Desenvolvedor Desktop (Aula 16)
Entrega de um sistema completo e funcional.
Materiais Extras 📚
Recursos recomendados para aprofundar seus conhecimentos em Desenvolvimento Desktop e Java.
🛠️ Ferramentas
- IntelliJ IDEA Community - A melhor IDE para Java.
- DB Browser for SQLite - Para visualizar as tabelas do seu banco de dados.
- JDK 17+ - Kit de desenvolvimento Java.
📖 Documentação Oficial
📺 Canais Recomendados
- Loiane Groner (Java e POO)
- Curso em Vídeo (Java Básico e Moderno)
[!TIP] Use fones de ouvido e foco total nas aulas práticas. A prática é o que leva à perfeição no desenvolvimento de software! 😊
Versão para Impressão
Esta página foi gerada automaticamente para impressão.