diff --git a/.vscode/settings.json b/.vscode/settings.json
index 16a1be93..d86e7f97 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -14,5 +14,6 @@
         "org.mockito.Answers.*"
     ],
     "maven.executable.preferMavenWrapper": false,
-    "terminal.integrated.defaultProfile.linux": "zsh"
+    "terminal.integrated.defaultProfile.linux": "zsh",
+    "java.configuration.updateBuildConfiguration": "interactive"
 }
diff --git a/README.md b/README.md
index b0d5a8ce..63a65574 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 ## Postgres Playground
 
-[![](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/manoelcampos/java-postgres-playground)
+[![](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/danielledsena/java-postgres-playground)
 
 > **Warning**
 > O gitpod.io não funciona se você tiver a extensão do tradutor habilitada no seu navegador.
diff --git a/dados.sql b/dados.sql
index bdd08cb8..272c8659 100644
--- a/dados.sql
+++ b/dados.sql
@@ -3,6 +3,27 @@
 -- Área por estado: https://pt.wikipedia.org/wiki/Lista_de_unidades_federativas_do_Brasil_por_área
 -- População por estado (prévio censo 2022): https://pt.wikipedia.org/wiki/Lista_de_unidades_federativas_do_Brasil_por_população
 
+drop table if exists transacao;
+
+CREATE TABLE transacao (
+    id serial not null primary key,
+    cliente varchar(120) not null,
+    valor decimal(10, 2) not null,
+    moeda varchar(3) not null,
+    tipo char not null
+);
+
+
+drop table if exists aluno;
+
+CREATE TABLE aluno (
+    matricula serial not null primary key,
+    nome varchar(120) not null,
+    nota1 decimal(4, 2),
+    nota2 decimal(4, 2),
+    nota3 decimal(4, 2)
+);
+
 drop table if exists item_venda;
 drop table if exists venda;
 
diff --git a/pom.xml b/pom.xml
index 25e313c4..b56d3466 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
  
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <java.version>11</java.version>
+        <java.version>17</java.version>
         <maven.compiler.source>${java.version}</maven.compiler.source>
         <maven.compiler.target>${java.version}</maven.compiler.target>
         <maven.compiler.release>${java.version}</maven.compiler.release>
@@ -31,6 +31,11 @@
     </properties>
 
     <dependencies>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.15.2</version>
+        </dependency>
 
         <dependency>
             <groupId>org.postgresql</groupId>
diff --git a/src/main/java/com/example/App.java b/src/main/java/com/example/App.java
deleted file mode 100644
index 9407ea49..00000000
--- a/src/main/java/com/example/App.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package com.example;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-
-public class App {
-    private static final String PASSWORD = "";
-    private static final String USERNAME = "gitpod";
-    private static final String JDBC_URL = "jdbc:postgresql://localhost/postgres";
-
-    public static void main(String[] args) {
-        new App();
-    }
-
-    public App(){
-        try(var conn = getConnection()){
-            carregarDriverJDBC();
-            listarEstados(conn);
-            localizarEstado(conn, "PR");
-            listarDadosTabela(conn, "produto");
-        } catch (SQLException e) {
-            System.err.println("Não foi possível conectar ao banco de dados: " + e.getMessage());
-        }        
-    }
-
-    private void listarDadosTabela(Connection conn, String tabela) {
-        var sql = "select * from " + tabela;
-        //System.out.println(sql);
-        try {
-            var statement = conn.createStatement();
-            var result = statement.executeQuery(sql);
-
-            var metadata = result.getMetaData();
-            int cols = metadata.getColumnCount();
-
-            for (int i = 1; i <= cols; i++) {
-                System.out.printf("%-25s | ", metadata.getColumnName(i));
-            }
-            System.out.println();
-
-            while(result.next()){
-                for (int i = 1; i <= cols; i++) {
-                    System.out.printf("%-25s | ", result.getString(i));
-                }
-                System.out.println();
-            }
-        } catch (SQLException e) {
-            System.err.println("Erro na execução da consulta: " + e.getMessage());
-        }
-        
-    }
-
-    private void localizarEstado(Connection conn, String uf) {
-        try{
-            //var sql = "select * from estado where uf = '" + uf + "'"; //suscetível a SQL Injection
-            var sql = "select * from estado where uf = ?";
-            var statement = conn.prepareStatement(sql);
-            //System.out.println(sql);
-            statement.setString(1, uf);
-            var result = statement.executeQuery();
-            if(result.next()){
-                System.out.printf("Id: %d Nome: %s UF: %s\n", result.getInt("id"), result.getString("nome"), result.getString("uf"));
-            }
-            System.out.println();
-        } catch(SQLException e){
-            System.err.println("Erro ao executar consulta SQL: " + e.getMessage());
-        }
-        
-    }
-
-    private void listarEstados(Connection conn) {
-        try{
-            System.out.println("Conexão com o banco realizada com sucesso.");
-
-            var statement = conn.createStatement();
-            var result = statement.executeQuery("select * from estado");
-            while(result.next()){
-                System.out.printf("Id: %d Nome: %s UF: %s\n", result.getInt("id"), result.getString("nome"), result.getString("uf"));
-            }
-            System.out.println();
-        } catch (SQLException e) {
-            System.err.println("Não foi possível executar a consulta ao banco: " + e.getMessage());
-        }
-    }
-
-    private Connection getConnection() throws SQLException {
-        return DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD);
-    }
-
-    private void carregarDriverJDBC() {
-        try {
-            Class.forName("org.postgresql.Driver");
-        } catch (ClassNotFoundException e) {
-            System.err.println("Não foi possível carregar a biblioteca para acesso ao banco de dados: " + e.getMessage());
-        }
-    }
-}
diff --git a/src/main/java/com/example/AppBd.java b/src/main/java/com/example/AppBd.java
new file mode 100644
index 00000000..1576d6af
--- /dev/null
+++ b/src/main/java/com/example/AppBd.java
@@ -0,0 +1,46 @@
+package com.example;
+import java.sql.SQLException;
+
+import com.example.dao.ConnectionManager;
+import com.example.dao.EstadoDAO;
+import com.example.dao.ProdutoDAO;
+import com.example.dao.DAO;
+import com.example.model.Marca;
+import com.example.model.Produto;
+
+
+public class AppBd {
+    public static void main(String[] args){
+        new AppBd();
+    }
+
+    public AppBd() {
+        try (var conn = ConnectionManager.getConnection()) {
+            var estadoDAO = new EstadoDAO(conn);
+            var listaEstados = estadoDAO.listar();
+            for (var estado : listaEstados) {
+                System.out.println(estado);
+            }
+            estadoDAO.localizar("CE");
+
+            var marca = new Marca();
+            marca.setId(2L);
+
+            var produto = new Produto();
+            produto.setId(206L);
+            produto.setMarca(marca);
+            produto.setValor(321);
+            produto.setNome("Produto atualizado 2");
+
+            var produtoDAO = new ProdutoDAO(conn);
+            //produtoDAO.inserir(conn, produto);
+            produtoDAO.atualizar(produto);
+            produtoDAO.excluir(202L);
+
+            var dao = new DAO(conn);
+            dao.listar("produto");
+        } catch(SQLException e) {
+            System.err.println("Não foi possível se conectar ao banco de dados: " + e.getMessage()); 
+        } 
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/MathUtil.java b/src/main/java/com/example/MathUtil.java
new file mode 100644
index 00000000..2dc05902
--- /dev/null
+++ b/src/main/java/com/example/MathUtil.java
@@ -0,0 +1,32 @@
+package com.example;
+
+public class MathUtil {
+    public static int mdc(int a, int b) {
+        a = Math.abs(a);
+        b = Math.abs(b);
+        int maior = Math.max(a, b);
+        b = Math.min(a, b);
+        a = maior;
+
+        if (b > 0 && a % b == 0)
+            return b;
+        if (b == 0)
+            return Math.abs(a);
+        return mdc(a-b, b);
+    }
+
+    public static int mdc(int ...valores) {
+        if(valores == null)
+            throw new NullPointerException("É necessário passar um valor diferente de nulo.");
+
+        if(valores.length == 0)
+            throw new IllegalArgumentException("É necessário no mínimo um valor para calcular o MDC");
+        
+        int a = valores[0];
+        for (int b : valores) {
+            a = mdc(a, b);
+        }
+
+        return a;
+    }
+}
diff --git a/src/main/java/com/example/dao/ConnectionManager.java b/src/main/java/com/example/dao/ConnectionManager.java
new file mode 100644
index 00000000..54a69af1
--- /dev/null
+++ b/src/main/java/com/example/dao/ConnectionManager.java
@@ -0,0 +1,17 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+public class ConnectionManager {
+
+    private static final String JDBC_URL = "jdbc:postgresql://localhost/postgres";
+    private static final String USERNAME = "gitpod";
+    private static final String PASSWORD = "";
+
+    public static Connection getConnection() throws SQLException {
+        return DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD);
+    }
+    
+}
diff --git a/src/main/java/com/example/dao/DAO.java b/src/main/java/com/example/dao/DAO.java
new file mode 100644
index 00000000..24321ac2
--- /dev/null
+++ b/src/main/java/com/example/dao/DAO.java
@@ -0,0 +1,38 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+public class DAO {
+    protected Connection conn;
+
+    public DAO(Connection conn) {
+        this.conn = conn;
+    }
+
+    public void listar(String tabela) {
+        var sql = "select * from " + tabela;
+        try {
+            var statement = conn.createStatement();
+            var result = statement.executeQuery(sql);
+
+            var metadata = result.getMetaData();
+            int cols = metadata.getColumnCount();
+
+            for (int i = 1; i <= cols; i++) {
+                System.out.printf("%-25s | ", metadata.getColumnName(i));
+            }
+            System.out.println();
+
+            while (result.next()) {
+                for (int i = 1; i <= cols; i++) {
+                    System.out.printf("%-25s | ", result.getString(i));
+                }
+                System.out.println();
+            }
+        } catch (SQLException e) {
+            System.err.println("Erro na execução da consulta: " + e.getMessage());
+        }
+
+    }
+}
diff --git a/src/main/java/com/example/dao/EstadoDAO.java b/src/main/java/com/example/dao/EstadoDAO.java
new file mode 100644
index 00000000..e10f49bb
--- /dev/null
+++ b/src/main/java/com/example/dao/EstadoDAO.java
@@ -0,0 +1,43 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.LinkedList;
+import java.util.List;
+
+import com.example.model.Estado;
+
+public class EstadoDAO extends DAO {
+    public EstadoDAO(Connection conn) {
+        super(conn);
+    }
+
+    public List<Estado> listar() throws SQLException {
+        var lista = new LinkedList<Estado>();
+        var statement = conn.createStatement();
+        var result = statement.executeQuery("select * from estado");
+        while(result.next()) {
+            var estado = new Estado();
+            estado.setId(result.getLong("id"));
+            estado.setNome(result.getString("nome"));
+            estado.setUf(result.getString("uf"));
+            lista.add(estado);
+        }
+
+        return lista;
+    }
+
+    public void localizar(String uf) {
+        try {
+            var sql = "select * from estado where uf = ?";
+            var statement = conn.prepareStatement(sql);
+            statement.setString(1, uf);
+            var result = statement.executeQuery();
+            if (result.next()) {
+                System.out.printf("Id: %d Nome: %s UF: %s\n", result.getInt("id"), result.getString("nome"), result.getString("uf"));
+            }
+        } catch (SQLException e) {
+            System.err.println("Erro ao executar consulta SQL: " + e.getMessage());
+        }
+    }
+}
diff --git a/src/main/java/com/example/dao/ProdutoDAO.java b/src/main/java/com/example/dao/ProdutoDAO.java
new file mode 100644
index 00000000..33966cfa
--- /dev/null
+++ b/src/main/java/com/example/dao/ProdutoDAO.java
@@ -0,0 +1,50 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import com.example.model.Produto;
+
+public class ProdutoDAO extends DAO {
+    public ProdutoDAO(Connection conn) {
+        super(conn);
+    }
+
+    public void excluir(long id) {
+        var sql = "delete from produto where id = ?";
+        try {
+            var statement = conn.prepareStatement(sql);
+            statement.setLong(1, id);
+            if (statement.executeUpdate() == 1)
+                System.out.println("Produto excluído com sucesso");
+            else System.out.println("Produto não foi localizado");
+        } catch (SQLException e) {
+            System.err.println("Erro ao excluir o produto: " + e.getMessage());
+        }
+    }
+
+    public void inserir(Produto produto) {
+        var sql = "insert into produto (nome, marca_id, valor) values (?, ?, ?)";
+        try (var statement = conn.prepareStatement(sql)) {
+            statement.setString(1, produto.getNome());
+            statement.setLong(2, produto.getMarca().getId());
+            statement.setDouble(3, produto.getValor());
+            statement.executeUpdate();
+        } catch (SQLException e) {
+            System.err.println("Erro ao inserir o produto: " + e.getMessage());
+        }
+    }
+
+    public void atualizar(Produto produto) {
+        var sql = "update produto set nome = ?, marca_id = ?, valor = ? where id = ?";
+        try (var statement = conn.prepareStatement(sql)) {
+            statement.setString(1, produto.getNome());
+            statement.setLong(2, produto.getMarca().getId());
+            statement.setDouble(3, produto.getValor());
+            statement.setLong(4, produto.getId());
+            statement.executeUpdate();
+        } catch (SQLException e) {
+            System.err.println("Erro ao atualizar o produto: " + e.getMessage());
+        }
+    }
+}
diff --git a/src/main/java/com/example/educacao/Principal.java b/src/main/java/com/example/educacao/Principal.java
new file mode 100644
index 00000000..651256cf
--- /dev/null
+++ b/src/main/java/com/example/educacao/Principal.java
@@ -0,0 +1,28 @@
+package com.example.educacao;
+
+import java.sql.SQLException;
+
+import com.example.dao.ConnectionManager;
+import com.example.educacao.dao.AlunoDAO;
+import com.example.educacao.model.Aluno;
+
+public class Principal {
+    public static void main(String[] args) {
+        try(var conn = ConnectionManager.getConnection()) {
+            var alunoDAO = new AlunoDAO(conn);
+            var aluno = new Aluno();
+            aluno.setMatricula(1);
+
+            //aluno.setNome("José");
+            //alunoDAO.inserir(aluno);
+            //System.out.println("Aluno inserido com sucesso.");
+
+            double nota = 8;
+            alunoDAO.inserirNota(1, nota, aluno.getMatricula());
+        } catch(SQLException e) {
+            System.err.println("Não foi possível conectar ao BD.");
+        } catch(RuntimeException e) {
+            System.err.println(e.getMessage());
+        }
+    }
+}
diff --git a/src/main/java/com/example/educacao/dao/AlunoDAO.java b/src/main/java/com/example/educacao/dao/AlunoDAO.java
new file mode 100644
index 00000000..e26d8bbe
--- /dev/null
+++ b/src/main/java/com/example/educacao/dao/AlunoDAO.java
@@ -0,0 +1,43 @@
+package com.example.educacao.dao;
+import com.example.dao.DAO;
+import com.example.educacao.model.Aluno;
+
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Connection;
+
+public class AlunoDAO extends DAO {
+    public AlunoDAO(Connection conn) {
+        super(conn);
+    }
+
+    public void inserir(Aluno aluno) {
+        try {
+            var sql = "insert into aluno (nome) values (?)";
+            var statement = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
+            statement.setString(1, aluno.getNome());
+            statement.executeUpdate();
+            var result = statement.getGeneratedKeys();
+            if (result.next()) {
+                aluno.setMatricula(result.getInt(1));
+            }
+        } catch (SQLException e) {
+            throw new RuntimeException("Não foi possível inserir o aluno no BD.", e);
+        }
+    }
+
+    public void inserirNota(int idDisciplina, double nota, int matricula){
+        if (idDisciplina <= 0 || idDisciplina > 3)
+            throw new IllegalArgumentException("O id da disciplina deve estar entre 1 e 3");
+
+        try {
+            var sql = "update aluno set nota" + idDisciplina + " = ? where matricula = ?";
+            var statement = conn.prepareStatement(sql);
+            statement.setDouble(1, nota);
+            statement.setInt(2, matricula);
+            statement.execute();
+        } catch (SQLException e) {
+            throw new RuntimeException("Não foi possível inserir a nota no BD.", e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/educacao/model/Aluno.java b/src/main/java/com/example/educacao/model/Aluno.java
new file mode 100644
index 00000000..290bb40c
--- /dev/null
+++ b/src/main/java/com/example/educacao/model/Aluno.java
@@ -0,0 +1,68 @@
+package com.example.educacao.model;
+
+public class Aluno {
+    private Integer matricula;
+    private String nome;
+    /**
+     * Nota da disciplina 1
+     */
+    private double nota1; 
+    /**
+     * Nota da disciplina 2
+     */
+    private double nota2; 
+    /**
+     * Nota da disciplina 3
+     */
+    private double nota3;
+
+    public Integer getMatricula() {
+        return matricula;
+    }
+
+    public void setMatricula(Integer matricula) {
+        this.matricula = matricula;
+    }
+
+    public String getNome() {
+        return nome;
+    }
+
+    public void setNome(String nome) {
+        this.nome = nome;
+    }
+
+    public double getNota1() {
+        return nota1;
+    }
+
+    public void setNota1(double nota1) {
+        if(nota1 < 0 || nota1 > 10)
+            throw new IllegalArgumentException("A nota não pode ser negativa.");
+        this.nota1 = nota1;
+    }
+
+    public double getNota2() {
+        return nota2;
+    }
+
+    public void setNota2(double nota2) {
+        if(nota2 < 0 || nota2 > 10)
+            throw new IllegalArgumentException("A nota não pode ser negativa.");
+        this.nota2 = nota2;
+    }
+
+    public double getNota3() {
+        return nota3;
+    }
+
+    public void setNota3(double nota3) {
+        if(nota3 < 0 || nota3 > 10)
+            throw new IllegalArgumentException("A nota não pode ser negativa.");
+        this.nota3 = nota3;
+    }
+
+    public double CalculaMedia() {
+        return (nota1 + nota2 + nota3) / 3;
+    }
+}
diff --git a/src/main/java/com/example/financeiro/Currency.java b/src/main/java/com/example/financeiro/Currency.java
new file mode 100644
index 00000000..ab422e36
--- /dev/null
+++ b/src/main/java/com/example/financeiro/Currency.java
@@ -0,0 +1,29 @@
+package com.example.financeiro;
+
+public class Currency {
+    /**
+     * Sigla da moeda de origem (com 3 letras).
+     */
+    private String from;
+    private String to;
+    private double quote;
+
+    public Currency(String from, String to, double quote) {
+        this.from = from;
+        this.to = to;
+        this.quote = quote;
+    }
+
+    public String getFrom() {
+        return from;
+    }
+
+    public String getTo() {
+        return to;
+    }
+
+    public double getQuote() {
+        return quote;
+    }
+
+}
diff --git a/src/main/java/com/example/financeiro/CurrencyAPI.java b/src/main/java/com/example/financeiro/CurrencyAPI.java
new file mode 100644
index 00000000..1588462d
--- /dev/null
+++ b/src/main/java/com/example/financeiro/CurrencyAPI.java
@@ -0,0 +1,22 @@
+package com.example.financeiro;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+
+public class CurrencyAPI {
+    private static List<Currency> currencyList = 
+    List.of(
+        new Currency("USD", "BRL", 4.96),
+        new Currency("EUR", "BRL", 5.41),
+        new Currency("BRL", "EUR", 0.18)
+    );
+
+    public static double getQuote(String from, String to) {
+        for (var currency : currencyList) {
+            if(currency.getFrom().equals(from) && currency.getTo().equals(to)) {
+                return currency.getQuote();
+            }
+        }
+        throw new NoSuchElementException("Não foi encontrada uma cotação para o par de moedas indicado.");
+    }
+}
diff --git a/src/main/java/com/example/financeiro/Meta.java b/src/main/java/com/example/financeiro/Meta.java
new file mode 100644
index 00000000..baf95294
--- /dev/null
+++ b/src/main/java/com/example/financeiro/Meta.java
@@ -0,0 +1,23 @@
+package com.example.financeiro;
+
+public class Meta {
+    private String currency;
+    private double regularMarketPrice;
+
+    public String getCurrency() {
+        return currency;
+    }
+
+    public void setCurrency(String currency) {
+        this.currency = currency;
+    }
+
+    public double getRegularMarketPrice() {
+        return regularMarketPrice;
+    }
+    
+    public void setRegularMarketPrice(double regularMarketPrice) {
+        this.regularMarketPrice = regularMarketPrice;
+    }
+    
+}
diff --git a/src/main/java/com/example/financeiro/Principal.java b/src/main/java/com/example/financeiro/Principal.java
new file mode 100644
index 00000000..16bf6a31
--- /dev/null
+++ b/src/main/java/com/example/financeiro/Principal.java
@@ -0,0 +1,36 @@
+package com.example.financeiro;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse.BodyHandlers;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.json.JsonMapper;
+
+public class Principal {
+    private static final String ADDRESS = "https://query1.finance.yahoo.com/v7/finance/spark?symbols=USDBRL=X";
+
+    public static void main(String[] args) {
+        System.out.println(CurrencyAPI.getQuote("EUR", "BRL"));
+
+        var http = HttpClient.newHttpClient();
+        try {
+            var mapper = new JsonMapper()
+                            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            var req = HttpRequest.newBuilder(new URI(ADDRESS)).GET().build();
+            var resp = http.send(req, BodyHandlers.ofString());
+
+            var yahooFinanceData = mapper.readValue(resp.body(), YahooFinanceData.class);
+            var result = yahooFinanceData.getSpark().getResult()[0];
+            System.out.println(result.getResponse()[0].getMeta().getRegularMarketPrice());
+        } catch (URISyntaxException e) {
+            System.err.println("Endereço da API inválido.");
+        } catch (IOException | InterruptedException e) {
+            System.err.println("Ocorreu um erro ao enviar requisição à API.");
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/src/main/java/com/example/financeiro/Response.java b/src/main/java/com/example/financeiro/Response.java
new file mode 100644
index 00000000..89aed1ee
--- /dev/null
+++ b/src/main/java/com/example/financeiro/Response.java
@@ -0,0 +1,13 @@
+package com.example.financeiro;
+
+public class Response {
+    private Meta meta;
+
+    public Meta getMeta() {
+        return meta;
+    }
+
+    public void setMeta(Meta meta) {
+        this.meta = meta;
+    }
+}
diff --git a/src/main/java/com/example/financeiro/Result.java b/src/main/java/com/example/financeiro/Result.java
new file mode 100644
index 00000000..5af725d3
--- /dev/null
+++ b/src/main/java/com/example/financeiro/Result.java
@@ -0,0 +1,13 @@
+package com.example.financeiro;
+
+public class Result {
+    private Response []response;
+
+    public Response[] getResponse() {
+        return response;
+    }
+
+    public void setResponse(Response[] response) {
+        this.response = response;
+    }
+}
diff --git a/src/main/java/com/example/financeiro/Spark.java b/src/main/java/com/example/financeiro/Spark.java
new file mode 100644
index 00000000..816dc99f
--- /dev/null
+++ b/src/main/java/com/example/financeiro/Spark.java
@@ -0,0 +1,13 @@
+package com.example.financeiro;
+
+public class Spark {
+    private Result []result;
+
+    public Result[] getResult() {
+        return result;
+    }
+
+    public void setResult(Result[] result) {
+        this.result = result;
+    }
+}
diff --git a/src/main/java/com/example/financeiro/YahooFinanceData.java b/src/main/java/com/example/financeiro/YahooFinanceData.java
new file mode 100644
index 00000000..53c78ee9
--- /dev/null
+++ b/src/main/java/com/example/financeiro/YahooFinanceData.java
@@ -0,0 +1,13 @@
+package com.example.financeiro;
+
+public class YahooFinanceData {
+    private Spark spark;
+
+    public Spark getSpark() {
+        return spark;
+    }
+
+    public void setSpark(Spark spark) {
+        this.spark = spark;
+    }
+}
diff --git a/src/main/java/com/example/financeiro/dao/TransacaoDAO.java b/src/main/java/com/example/financeiro/dao/TransacaoDAO.java
new file mode 100644
index 00000000..5540a5a9
--- /dev/null
+++ b/src/main/java/com/example/financeiro/dao/TransacaoDAO.java
@@ -0,0 +1,14 @@
+package com.example.financeiro.dao;
+
+import java.sql.Connection;
+
+import com.example.dao.DAO;
+
+public class TransacaoDAO extends DAO {
+
+    public TransacaoDAO(Connection conn) {
+        super(conn);
+    }
+    
+    
+}
diff --git a/src/main/java/com/example/financeiro/model/Transacao.java b/src/main/java/com/example/financeiro/model/Transacao.java
new file mode 100644
index 00000000..0b613a52
--- /dev/null
+++ b/src/main/java/com/example/financeiro/model/Transacao.java
@@ -0,0 +1,79 @@
+package com.example.financeiro.model;
+
+import java.util.List;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.LinkedList;
+
+
+public class Transacao {
+    private Integer id;
+    private String cliente;
+    private double valor;
+    private String moeda;
+    private char tipo;
+
+    public Transacao(String cliente, double valor, String moeda, char tipo) {
+        this.cliente = cliente;
+        this.valor = valor;
+        this.moeda = moeda;
+        this.tipo = tipo;
+    }
+
+    public List<Transacao> lista = new LinkedList<>();
+
+    public void adicionar(Transacao t) {
+        lista.add(t);
+    }
+
+    public List<Transacao> filtrar(String cliente) {
+        return filtrar(transacao -> transacao.getCliente().equals(cliente));
+    }
+
+    public List<Transacao> filtrar(char tipo) {
+        return filtrar(transacao -> transacao.getTipo() == tipo);
+    }
+
+    public List<Transacao> filtrar(String cliente, char tipo) {
+        return filtrar(transacao -> transacao.getCliente().equals(cliente) && transacao.getTipo() == tipo);
+    }
+
+    private List<Transacao> filtrar(Predicate<Transacao> predicate) {
+        return lista.stream().filter(predicate).collect(Collectors.toCollection(LinkedList::new));
+    }
+
+    public double getSaldo(String cliente) {
+        double saldo = 0.0;
+        for (Transacao t: lista) {
+            if (t.cliente.equals(cliente)) {
+                saldo += t.valor;
+            }
+        }
+
+        return saldo;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public String getCliente() {
+        return cliente;
+    }
+
+    public double getValor() {
+        return valor;
+    }
+
+    public String getMoeda() {
+        return moeda;
+    }
+
+    public char getTipo() {
+        return tipo;
+    }
+
+    public List<Transacao> getLista() {
+        return lista;
+    }
+}
diff --git a/src/main/java/com/example/model/Cidadao.java b/src/main/java/com/example/model/Cidadao.java
new file mode 100644
index 00000000..e7950734
--- /dev/null
+++ b/src/main/java/com/example/model/Cidadao.java
@@ -0,0 +1,5 @@
+package com.example.model;
+
+public class Cidadao {
+    
+}
diff --git a/src/main/java/com/example/model/Cliente.java b/src/main/java/com/example/model/Cliente.java
new file mode 100644
index 00000000..bb6ea405
--- /dev/null
+++ b/src/main/java/com/example/model/Cliente.java
@@ -0,0 +1,5 @@
+package com.example.model;
+
+public class Cliente {
+    
+}
diff --git a/src/main/java/com/example/model/Estado.java b/src/main/java/com/example/model/Estado.java
new file mode 100644
index 00000000..48df8079
--- /dev/null
+++ b/src/main/java/com/example/model/Estado.java
@@ -0,0 +1,51 @@
+package com.example.model;
+
+public class Estado {
+    private Long id;
+    private String nome;
+    private String uf;
+    private RegiaoGeografica regiao;
+    private int areaKm2;
+    private int populacao;
+
+    public Long getId() {
+        return id;
+    }
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public String getNome() {
+        return nome;
+    }
+    public void setNome(String nome) {
+        this.nome = nome;
+    }
+    public String getUf() {
+        return uf;
+    }
+    public void setUf(String uf) {
+        this.uf = uf;
+    }
+    public RegiaoGeografica getRegiao() {
+        return regiao;
+    }
+    public void setRegiao(RegiaoGeografica regiao) {
+        this.regiao = regiao;
+    }
+    public int getAreaKm2() {
+        return areaKm2;
+    }
+    public void setAreaKm2(int areaKm2) {
+        this.areaKm2 = areaKm2;
+    }
+    public int getPopulacao() {
+        return populacao;
+    }
+    public void setPopulacao(int populacao) {
+        this.populacao = populacao;
+    }
+
+    public String toString() {
+        return "Estado: " + nome + " Id: " + id + " UF: " + uf;
+    }
+}
diff --git a/src/main/java/com/example/model/Marca.java b/src/main/java/com/example/model/Marca.java
new file mode 100644
index 00000000..b6ca1e96
--- /dev/null
+++ b/src/main/java/com/example/model/Marca.java
@@ -0,0 +1,22 @@
+package com.example.model;
+
+public class Marca {
+    private Long id;
+    private String nome;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getNome() {
+        return nome;
+    }
+
+    public void setNome(String nome) {
+        this.nome = nome;
+    }
+}
diff --git a/src/main/java/com/example/model/Produto.java b/src/main/java/com/example/model/Produto.java
new file mode 100644
index 00000000..eea749f7
--- /dev/null
+++ b/src/main/java/com/example/model/Produto.java
@@ -0,0 +1,40 @@
+package com.example.model;
+
+public class Produto {
+    private Long id;
+    private String nome;
+    private Marca marca;
+    private double valor;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getNome() {
+        return nome;
+    }
+
+    public void setNome(String nome) {
+        this.nome = nome;
+    }
+
+    public Marca getMarca() {
+        return marca;
+    }
+
+    public void setMarca(Marca marca) {
+        this.marca = marca;
+    }
+
+    public double getValor() {
+        return valor;
+    }
+
+    public void setValor (double valor) {
+        this.valor = valor;
+    }
+}
diff --git a/src/main/java/com/example/model/RegiaoGeografica.java b/src/main/java/com/example/model/RegiaoGeografica.java
new file mode 100644
index 00000000..002ef58f
--- /dev/null
+++ b/src/main/java/com/example/model/RegiaoGeografica.java
@@ -0,0 +1,22 @@
+package com.example.model;
+
+public class RegiaoGeografica {
+    private Long id;
+    private String nome;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getNome() {
+        return nome;
+    }
+
+    public void setNome(String nome) {
+        this.nome = nome;
+    }
+}
diff --git a/src/test/java/com/example/MathUtilTest.java b/src/test/java/com/example/MathUtilTest.java
new file mode 100644
index 00000000..98fbb54e
--- /dev/null
+++ b/src/test/java/com/example/MathUtilTest.java
@@ -0,0 +1,163 @@
+package com.example;
+
+import static org.junit.jupiter.api.Assertions.*;
+import org.junit.jupiter.api.Test;
+
+import static com.example.MathUtil.mdc;
+
+public class MathUtilTest {
+    @Test
+    void testMdcP1BImpar() {
+        int a = 6, b = 3;
+        int esperado = 3;
+        int obtido = MathUtil.mdc(a, b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP1BPar() {
+        int a = 6, b = 2;
+        int esperado = 2;
+        int obtido = MathUtil.mdc(a, b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP3Negativo() {
+        int a = -6, b = 0;
+        int esperado = 6;
+        int obtido = MathUtil.mdc(a, b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP3Positivo() {
+        int a = 6, b = 0;
+        int esperado = 6;
+        int obtido = MathUtil.mdc(a, b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP4() {
+        int m = 2, a = 6, b = 3;
+        int esperado = 6;
+        int obtido = m * MathUtil.mdc(a, b);
+
+        assertEquals(MathUtil.mdc(m * a, m * b), obtido);
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP5Decrescente() {
+        int a = 6, b = 2;
+        int esperado = MathUtil.mdc(b, a);
+        int obtido = MathUtil.mdc(a, b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP5Crecente() {
+        int a = 2, b = 6;
+        int esperado = MathUtil.mdc(b, a);
+        int obtido = MathUtil.mdc(a, b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP7() {
+        int a = 6, b = 2;
+        int esperado = MathUtil.mdc(-a, b);
+        int obtido = MathUtil.mdc(-a, -b);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP8Positivo() {
+        int a = 6;
+        int esperado = 6;
+        int obtido = MathUtil.mdc(a, a);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP8Negativo() {
+        int a = -6;
+        int esperado = 6;
+        int obtido = MathUtil.mdc(a, a);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP9() {
+        int a = 6, b = 3, c = 2;
+
+        assertTrue(mdc(a, mdc(b, c)) == mdc(mdc(a, b), c) && mdc(mdc(a, b), c) == mdc(a, b, c));
+    }
+
+    @Test
+    void testMdcP12DoisPrimos() {
+        int p = 7, a = p;
+        int esperado = p;
+        int obtido = MathUtil.mdc(p, a);
+
+        assertEquals(esperado, obtido);
+    }
+
+    @Test
+    void testMdcP12UmPrimo() {
+        int p = 7, a = 2;
+        int esperado = 1;
+        int obtido = MathUtil.mdc(p, a);
+
+        assertEquals(esperado, obtido);
+    } 
+
+    @Test
+    void testMdcP12PrimoEUm() {
+        int p = 7, a = 1;
+        int esperado = 1;
+        int obtido = MathUtil.mdc(p, a);
+
+        assertEquals(esperado, obtido);
+    } 
+
+    @Test
+    void testMdcCasoGeral() {
+        int a = 30, b = 12;
+        int esperado = 6;
+        int obtido = MathUtil.mdc(a, b);
+
+        assertEquals(esperado, obtido);
+    } 
+
+    @Test
+    void testMdc3Valores() {
+        int a = 12, b = 6, c = 4;
+        int esperado = 2;
+        int obtido = mdc(a, b, c);
+
+        assertEquals(esperado, obtido);
+    } 
+
+    @Test
+    void testMdcNenhumValor() {
+        assertThrows(IllegalArgumentException.class, MathUtil::mdc);
+    } 
+
+    @Test
+    void testMdcNull() {
+        var exception = assertThrows(NullPointerException.class, () -> mdc(null));
+        var msgEsperada = "É necessário passar um valor diferente de nulo.";
+        assertEquals(msgEsperada, exception.getMessage());
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/com/example/educacao/model/AlunoTest.java b/src/test/java/com/example/educacao/model/AlunoTest.java
new file mode 100644
index 00000000..9e909780
--- /dev/null
+++ b/src/test/java/com/example/educacao/model/AlunoTest.java
@@ -0,0 +1,34 @@
+package com.example.educacao.model;
+
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
+public class AlunoTest {
+    @Test
+    void calculaMediaComErroDePrecisao() {
+        var aluno = new Aluno();
+
+        aluno.setNota1(10);
+        aluno.setNota2(8);
+        aluno.setNota3(8);
+
+        double esperado = 8.66;
+        double obtido = aluno.CalculaMedia();
+
+        assertEquals(esperado, obtido, 0.01);
+    }
+
+    @Test
+    void calculaMediaComValoresIguais() {
+        var aluno = new Aluno();
+
+        aluno.setNota1(10);
+        aluno.setNota2(10);
+        aluno.setNota3(10);
+
+        double esperado = 10;
+        double obtido = aluno.CalculaMedia();
+
+        assertEquals(esperado, obtido);
+    }
+}
