diff --git a/README.md b/README.md
index 19a888a9..07e07825 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/AndreFSAntunes/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/config.env b/config.env
new file mode 100644
index 00000000..a50c8597
--- /dev/null
+++ b/config.env
@@ -0,0 +1,3 @@
+DB_HOST=jdbc:postgresql://localhost/postgres
+DB_USER=gitpod
+DB_PASS= 
\ No newline at end of file
diff --git a/dados.sql b/dados.sql
index 3097ea8d..fc503868 100644
--- a/dados.sql
+++ b/dados.sql
@@ -3,6 +3,28 @@
 -- Á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,
+    nome varchar(100) not null,
+    valor decimal(10,2) not null,
+    moeda varchar(3) not null,
+    tipo varchar(1) not null,
+    data timestamp default current_timestamp
+);
+
+drop table if exists aluno;
+
+CREATE TABLE aluno (
+    matricula serial not null primary key,
+    nome varchar(120) not null,
+    nota1 decimal(10,2),
+    nota2 decimal(10,2),
+    nota3 decimal(10,2)
+);
+
 drop table if exists item_venda;
 drop table if exists venda;
 
diff --git a/src/main/java/com/example/AppBd.java b/src/main/java/com/example/AppBd.java
new file mode 100644
index 00000000..2dfcb738
--- /dev/null
+++ b/src/main/java/com/example/AppBd.java
@@ -0,0 +1,50 @@
+package com.example;
+
+import java.sql.Connection;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.util.List;
+
+import com.example.dao.*;
+import com.example.model.Estado;
+import com.example.model.Marca;
+import com.example.model.Produto;
+import com.example.model.RegiaoGeografica;
+
+public class AppBd {
+    public static void main(String[] args) {
+        new AppBd();
+    }
+
+    public AppBd() {
+        try (var conn = ConnectionManager.getConnection()) {
+            var estadoDao = new EstadoDao(conn);
+            // var estado = new Estado(
+            //     "Terra do Nunca",
+            //     "TN",
+            //     new RegiaoGeografica(1l),
+            //     100,
+            //     15
+            // );
+            // estado.setId(29l);
+            // estadoDao.inserir(estado);
+            // estadoDao.alterar(estado);
+            List<Estado> listaEstados = estadoDao.listar(true);
+            for (var estado: listaEstados) {
+                System.out.println(estado);
+            }
+            // estadoDao.localizar("TO");
+
+            // var marca = new Marca(42L);
+            // var produto = new Produto(205l, "Universal Device Plus", marca, 1499d);
+            // var produtoDao = new ProdutoDao(conn);
+            // produtoDao.inserir(produto);
+            // produtoDao.excluir(206);
+            // produtoDao.alterar(produto);
+            // var dao = new Dao(conn);
+            // dao.listar("estado", true);
+        } catch (SQLException e) {
+            System.err.println("Não foi possivel conectaro 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..c20effa1
--- /dev/null
+++ b/src/main/java/com/example/MathUtil.java
@@ -0,0 +1,9 @@
+package com.example;
+
+public class MathUtil {
+    public static int mdc(int a, int b) {
+        if (b == 0) return Math.abs(a);
+        int resto = a % b;
+        return mdc(b, resto);
+    }
+}
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..3fcb43c1
--- /dev/null
+++ b/src/main/java/com/example/dao/ConnectionManager.java
@@ -0,0 +1,32 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+import com.example.handlers.EnvHandler;
+
+public class ConnectionManager {
+
+    public static String dbHost;
+    public static String dbUser;
+    public static String dbPass;
+
+    public static void setDbHost(String dbHost) {
+        ConnectionManager.dbHost = dbHost;
+    }
+
+    public static void setDbUser(String dbUser) {
+        ConnectionManager.dbUser = dbUser;
+    }
+
+    public static void setDbPass(String dbPass) {
+        ConnectionManager.dbPass = dbPass;
+    }
+
+    public static Connection getConnection() throws SQLException {
+        EnvHandler.loadEnvVariables();
+        return DriverManager.getConnection(dbHost, dbUser, dbPass);
+    }
+    
+}
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..c9a311e7
--- /dev/null
+++ b/src/main/java/com/example/dao/Dao.java
@@ -0,0 +1,47 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+
+public class Dao {
+    protected Connection conn;
+
+    public Dao(Connection conn) {
+        this.conn = conn;
+    }
+
+    public void listar(String tabela, boolean lastFive) {
+        String sql = "SELECT * FROM \"" + tabela + "\"";
+        if (lastFive) sql += " order by id desc limit 5";
+        try {
+            var statement = conn.createStatement();
+            var resultado = statement.executeQuery(sql);
+            var metadata = resultado.getMetaData();
+            int colunas = metadata.getColumnCount();
+
+            printHeader(metadata, colunas);
+
+            while (resultado.next()) {
+                for (int i = 1; i <= colunas; i++) {
+                    System.out.printf("%-23s | ", resultado.getString(i));
+                }
+                System.out.println();
+            }
+
+        } catch (SQLException e) {
+            System.err.println("Erro ao executar consulta sql: " + e.getMessage());
+        }
+    }
+
+    private void printHeader(ResultSetMetaData metadata, int colunas) throws SQLException {
+        for (int i = 1; i <= colunas; i++) {
+            System.out.printf("%-23s | ", metadata.getColumnName(i));
+        }
+        System.out.println();
+        for (int i = 0; i < 26 * colunas; i++) {
+            System.out.print("-");
+        }
+        System.out.println();
+    }
+}
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..b71cb0f4
--- /dev/null
+++ b/src/main/java/com/example/dao/EstadoDao.java
@@ -0,0 +1,118 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import com.example.model.Estado;
+import com.example.model.RegiaoGeografica;
+
+public class EstadoDao extends Dao{
+
+    public EstadoDao(Connection conn) {
+        super(conn);
+    }
+
+    public void localizar(String uf) {
+        try {
+            var sql = "select * from estado where uf = ?";
+            var statement = conn.prepareStatement(sql);
+            statement.setString(1, uf);
+            var resultado = statement.executeQuery();
+            printResultado(resultado);
+
+        } catch (SQLException e) {
+            System.err.println("Erro ao executar consulta sql: " + e.getMessage());
+            ;
+        }
+    }
+
+    public void listar(){
+        try {
+            var statement = conn.createStatement();
+            var estados = statement.executeQuery("select * from estado");
+            printResultado(estados);
+
+        } catch (SQLException e) {
+            System.err.println("Algum erro na consulta sql: " + e.getMessage());
+        }
+
+    }
+
+    public List<Estado> listar(boolean returnList){
+        if (!returnList) listar();
+        List<Estado> listaEstados = new LinkedList<>();
+        try {
+            var statement = conn.createStatement();
+            var estados = statement.executeQuery("select * from estado");
+            while (estados.next()) {
+                var novoEstado = new Estado(
+                    estados.getString("nome"),
+                    estados.getString("uf"),
+                    new RegiaoGeografica(estados.getLong("regiao_id")),
+                    estados.getInt("area_km2"),
+                    estados.getInt("populacao")
+                );
+                novoEstado.setId(estados.getLong("id"));
+                listaEstados.add(novoEstado);
+            }
+
+        } catch (SQLException e) {
+            System.err.println("Algum erro na consulta sql: " + e.getMessage());
+        }
+        return listaEstados;
+    }
+
+    private void printResultado(ResultSet resultado) throws SQLException {
+        while (resultado.next()) {
+            System.out.printf("Id: %-3d | Nome: %-20s | UF: %s\n", resultado.getInt("id"), resultado.getString("nome"),
+                    resultado.getString("uf"));
+        }
+    }
+
+    public void inserir(Estado estado) {
+        var sql = "insert into estado (nome, uf, regiao_id, area_km2, populacao) values (?, ? , ?, ?, ?)";
+        try (var statement = conn.prepareStatement(sql)) {
+            statement.setString(1, estado.getNome());
+            statement.setString(2, estado.getUf());
+            statement.setLong(3, estado.getRegiao().getId());
+            statement.setInt(4, estado.getArea());
+            statement.setInt(5, estado.getPopulacao());
+            statement.executeUpdate();
+            System.out.println("Estado inserido com sucesso!");
+        } catch (SQLException e) {
+            System.err.println("Erro ao executar consulta sql: " + e.getMessage());
+        }
+    }
+
+    public void excluir(int id) {
+        var sql = "delete from estado where id = ?";
+        try (var statement = conn.prepareStatement(sql)) {
+            statement.setLong(1, id);
+            if (statement.executeUpdate() == 1)
+                System.out.println("produto excluido com sucesso!");
+            else System.out.println("produto não localizado");
+        } catch (SQLException e) {
+            System.err.println("Erro ao executar consulta sql: " + e.getMessage());
+        }
+    }
+
+    public void alterar(Estado estado) {
+        var sql = "update estado set nome = ?, uf = ?, regiao_id = ?, area_km2 = ?, populacao = ? where id = ?";
+        try (var statement = conn.prepareStatement(sql)) {
+            statement.setString(1, estado.getNome());
+            statement.setString(2, estado.getUf());
+            statement.setLong(3, estado.getRegiao().getId());
+            statement.setInt(4, estado.getArea());
+            statement.setInt(5, estado.getPopulacao());
+            statement.setLong(6, estado.getId());
+            statement.executeUpdate();
+            System.out.println("Estado alterado com sucesso!");
+        } catch (SQLException e) {
+            System.err.println("Erro ao excutar consulta slq: " + 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..a760f6ef
--- /dev/null
+++ b/src/main/java/com/example/dao/ProdutoDao.java
@@ -0,0 +1,54 @@
+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(int 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 excluido com sucesso!");
+            else System.out.println("produto não localizado");
+        } catch (SQLException e) {
+            System.err.println("Erro ao executar consulta sql: " + e.getMessage());
+        }
+    }
+
+    public void alterar(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();
+            System.out.println("produto inserido com sucesso!");
+        } catch (SQLException e) {
+            System.err.println("Erro ao executar consulta sql: " + 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();
+            System.out.println("produto inserido com sucesso!");
+        } catch (SQLException e) {
+            System.err.println("Erro ao executar consulta sql: " + 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..49c4298c
--- /dev/null
+++ b/src/main/java/com/example/educacao/Principal.java
@@ -0,0 +1,30 @@
+package com.example.educacao;
+
+import java.sql.SQLException;
+import java.util.NoSuchElementException;
+
+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("Jedi Master");
+            // alunoDao.inserir(aluno);
+            // alunoDao.inserirNota(3, 5.05, alunoDao.buscaIdPorNome("Soupro"));
+            // alunoDao.inserirNota(1, 10, aluno.getMatricula());
+            // alunoDao.delete(alunoDao.buscaIdPorNome("KungFuFluter"));
+            var aluno = alunoDao.buscaAluno(5);
+            System.out.println(aluno.getNome() + " - média: " + aluno.calculaMedia());
+            
+        } catch (SQLException e) {
+            System.err.println("Não foi possivel conectaro ao banco de dados: " + e.getMessage());
+        } catch (NoSuchElementException e) {
+            System.err.println(e.getMessage());
+        } catch (RuntimeException e) {
+            System.err.println("Não foi possivel realizar operação: " + 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..df47be8b
--- /dev/null
+++ b/src/main/java/com/example/educacao/dao/alunoDao.java
@@ -0,0 +1,98 @@
+package com.example.educacao.dao;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.NoSuchElementException;
+
+import com.example.dao.Dao;
+import com.example.educacao.model.Aluno;
+
+public class alunoDao extends Dao {
+    public alunoDao(Connection conn) {
+        super(conn);
+    }
+
+    public void inserir(Aluno aluno) {
+        var sql = "insert into aluno (nome) values (?)";
+        try {
+            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(e);
+        }
+    }
+
+    public void inserirNota(int idNota, double nota, int matricula) {
+        if (idNota <= 0 || idNota > 3) {
+            throw new IllegalArgumentException("id da nota deve ser entre 1 e 3.");
+        }
+        var sql = "update aluno set nota" + idNota + " =  ? where matricula = ?";
+        try {
+            var statement = conn.prepareStatement(sql);
+            statement.setDouble(1, nota);
+            statement.setInt(2, matricula);
+            statement.executeUpdate();
+            System.out.println("Nota" +idNota+ " inserida com sucesso.");
+        } catch (SQLException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public Integer buscaIdPorNome(String nome) {
+        var sql = "select matricula from aluno where nome = ?";
+        try {
+            var statement = conn.prepareStatement(sql);
+            statement.setString(1, nome);
+            var result = statement.executeQuery();
+            if(result.next()){
+                return result.getInt("matricula");
+            } else {
+                return null;
+            }
+        } catch (SQLException e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    public void delete(Integer matricula) {
+        if (matricula == null) {
+            System.out.println("Não existe aluno com a matricula fornecida");
+            return;
+        }
+        var sql = "delete from aluno where matricula = ?";
+        try {
+            var statement = conn.prepareStatement(sql);
+            statement.setInt(1, matricula);
+            statement.executeUpdate();
+            System.out.println("Aluno de matricula " + matricula + " excluido com sucesso.");
+        } catch (SQLException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public Aluno buscaAluno(int matricula) {
+        var sql = "select * from aluno where matricula = ?";
+        try {
+            var statement = conn.prepareStatement(sql);
+            statement.setInt(1, matricula);
+            var result = statement.executeQuery();
+            if (result.next()) {
+                var aluno = new Aluno(result.getString("nome"));
+                aluno.setNota1(result.getDouble("nota1"));
+                aluno.setNota2(result.getDouble("nota2"));
+                aluno.setNota3(result.getDouble("nota3"));
+                return aluno;
+            } else {
+                throw new NoSuchElementException("Aluno with matricula " + matricula + " not found.");
+            }
+        } catch (SQLException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
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..ce41b094
--- /dev/null
+++ b/src/main/java/com/example/educacao/model/Aluno.java
@@ -0,0 +1,55 @@
+package com.example.educacao.model;
+
+public class Aluno {
+    private Integer matricula;
+    private String nome;
+    private double nota1, nota2, nota3;
+
+    public Aluno(String nome) {
+        this.nome = nome;
+    }
+    public Aluno() {
+    }
+    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) {
+        validaNota(nota1);
+        this.nota1 = nota1;
+    }
+    
+    public double getNota2() {
+        return nota2;
+    }
+    public void setNota2(double nota2) {
+        this.nota2 = nota2;
+    }
+    public double getNota3() {
+        return nota3;
+    }
+    public void setNota3(double nota3) {
+        this.nota3 = nota3;
+    }
+  
+    public double calculaMedia() {
+        return (nota1 + nota2 + nota3) / 3;
+    }
+
+    private void validaNota(double nota) {
+        if (nota < 0 || nota > 10) {
+            throw new IllegalArgumentException("nota deve ser entra 0 e 10.");
+        }
+    }
+}
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..b26f28cf
--- /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..3257dd1a
--- /dev/null
+++ b/src/main/java/com/example/financeiro/model/Transacao.java
@@ -0,0 +1,91 @@
+package com.example.financeiro.model;
+
+import java.time.LocalDateTime;
+import java.util.LinkedList;
+import java.util.List;
+
+public class Transacao {
+    private Integer id;
+    private String cliente;
+    private double valor;
+    private String moeda;
+    private String tipo;
+    private LocalDateTime data;
+
+    public Transacao(String cliente, double valor, String moeda, String tipo) {
+        this.cliente = cliente;
+        this.valor = valor;
+        this.moeda = moeda;
+        this.tipo = tipo;
+    }
+
+    public List<Transacao> todasTransacoes = new LinkedList<>();
+
+    public void adicionarTransacao(Transacao t) {
+        todasTransacoes.add(t);
+    }
+
+    public List<Transacao> filtrar(String cliente, String tipo) {
+        var transacoesFiltradas = new LinkedList<Transacao>();
+        for (Transacao t : todasTransacoes) {
+            if ((cliente == null || t.cliente.equals(cliente)) ||
+                    (tipo == null || t.tipo.equals(tipo))) {
+                transacoesFiltradas.add(t);
+            }
+        }
+        // USING STREAMS
+        // return todasTransacoes.stream()
+        // .filter(t -> (cliente == null || t.cliente.equals(cliente))
+        // || (tipo == null || t.tipo.equals(tipo)))
+        // .collect(Collectors.toList()); // newer version u just need toList()
+
+        // USING STREAM + PREDICATE
+        // Predicate<Transacao> clientePredicate = t -> cliente == null || t.cliente.equals(cliente);
+        // Predicate<Transacao> tipoPredicate = t -> tipo == null || t.tipo.equals(tipo);
+        // return todasTransacoes.stream()
+        //         .filter(clientePredicate.or(tipoPredicate))
+        //         .collect(Collectors.toList()); // newer version u just need toList()
+                //.collect(Collectors.toCollection(LinkedList::new)) // if you want to return a linkedlist
+
+        return transacoesFiltradas;
+    }
+
+    public double getSaldo(String Cliente) {
+        double saldo = 0d;
+        for (Transacao t : todasTransacoes) {
+            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 String getTipo() {
+        return tipo;
+    }
+
+    public LocalDateTime getData() {
+        return data;
+    }
+
+    public List<Transacao> getTodasTransacoes() {
+        return todasTransacoes;
+    }
+
+}
diff --git a/src/main/java/com/example/handlers/EnvFileReader.java b/src/main/java/com/example/handlers/EnvFileReader.java
new file mode 100644
index 00000000..3eca56d8
--- /dev/null
+++ b/src/main/java/com/example/handlers/EnvFileReader.java
@@ -0,0 +1,30 @@
+package com.example.handlers;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.*;
+
+public class EnvFileReader {
+
+    private final Map<String, String> envMap = new HashMap<>();
+
+    public EnvFileReader(String path) throws IOException {
+        try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                String[] parts = line.split("=", 2);
+                if (parts.length > 1) {
+                    String key = parts[0].trim();
+                    String value = parts[1].trim();
+                    envMap.put(key, value);
+                }
+            }
+        }
+    }
+
+    public String get(String key) {
+        return envMap.get(key);
+    }
+
+}
diff --git a/src/main/java/com/example/handlers/EnvHandler.java b/src/main/java/com/example/handlers/EnvHandler.java
new file mode 100644
index 00000000..ee65f8b1
--- /dev/null
+++ b/src/main/java/com/example/handlers/EnvHandler.java
@@ -0,0 +1,30 @@
+package com.example.handlers;
+
+import java.io.IOException;
+
+import com.example.dao.ConnectionManager;
+
+public class EnvHandler {
+
+    public static void loadEnvVariables() {
+        String pathToEnvFile = "config.env";
+        
+        // Create a new instance of the EnvFileReader
+        EnvFileReader envReader = null;
+        envReader = loadEnvFiles(pathToEnvFile, envReader);
+        
+        // Now you can use this instance to get the values from your .env file
+    ConnectionManager.setDbHost(envReader.get("DB_HOST"));
+    ConnectionManager.setDbUser(envReader.get("DB_USER"));
+    ConnectionManager.setDbPass(envReader.get("DB_PASS"));
+    }
+    
+    static EnvFileReader loadEnvFiles(String pathToEnvFile, EnvFileReader envReader) {
+        try {
+            envReader = new EnvFileReader(pathToEnvFile);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return envReader;
+    }
+}
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..6b83a268
--- /dev/null
+++ b/src/main/java/com/example/model/Estado.java
@@ -0,0 +1,60 @@
+package com.example.model;
+
+public class Estado {
+    private Long id;
+    private String nome;
+    private String uf;
+    private RegiaoGeografica regiao;
+    private int area;
+    private int populacao;
+
+    public Estado(String nome, String uf, RegiaoGeografica regiao, int area, int populacao) {
+        this.nome = nome;
+        this.uf = uf;
+        this.regiao = regiao;
+        this.area = area;
+        this.populacao = 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 getArea() {
+        return area;
+    }
+    public void setArea(int area) {
+        this.area = area;
+    }
+    public int getPopulacao() {
+        return populacao;
+    }
+    public void setPopulacao(int populacao) {
+        this.populacao = populacao;
+    }
+
+    @Override
+    public String toString() {
+        return "Estado [id = " + id + ", nome = " + nome + ", uf = " + uf + ", populacao = " + populacao + "]";
+    }
+}
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..8b76d626
--- /dev/null
+++ b/src/main/java/com/example/model/Marca.java
@@ -0,0 +1,28 @@
+package com.example.model;
+
+public class Marca {
+    private Long id;
+    private String nome;
+
+    public Marca(Long id, String nome) {
+        this.id = id;
+        this.nome = nome;
+    }
+    public Marca() {
+    }
+    public Marca(long id) {
+        this.id = id;
+    }
+    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..6b61e269
--- /dev/null
+++ b/src/main/java/com/example/model/Produto.java
@@ -0,0 +1,47 @@
+package com.example.model;
+
+public class Produto {
+    private Long id;
+    private String nome;
+    private Marca marca;
+    private double valor;
+
+    public Produto(Long id, String nome, Marca marca, double valor) {
+        this.id = id;
+        this.nome = nome;
+        this.marca = marca;
+        this.valor = valor;
+    }
+    public Produto(String nome, Marca marca, double valor) {
+        this.nome = nome;
+        this.marca = marca;
+        this.valor = valor;
+    }
+    public Produto() {
+    }
+    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..a9a1b72f
--- /dev/null
+++ b/src/main/java/com/example/model/RegiaoGeografica.java
@@ -0,0 +1,24 @@
+package com.example.model;
+
+public class RegiaoGeografica {
+    private Long id;
+    private String nome;
+
+    public RegiaoGeografica(Long id) {
+        this.id = id;
+    }
+    public RegiaoGeografica(Object regiaol) {
+    }
+    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..73d41789
--- /dev/null
+++ b/src/test/java/com/example/MathUtilTest.java
@@ -0,0 +1,34 @@
+package com.example;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.junit.jupiter.params.provider.Arguments;
+import java.util.stream.Stream;
+
+public class MathUtilTest {
+
+    @ParameterizedTest
+    @MethodSource("mdcDataProvider")
+    public void testMdc(int a, int b, int esperado) {
+        int obtido = MathUtil.mdc(a, b);
+        assertEquals(esperado, obtido);
+    }
+
+    private static Stream<Arguments> mdcDataProvider() {
+        return Stream.of(
+            Arguments.of(6, 3, 3),
+            Arguments.of(9, 3, 3),
+            Arguments.of(15, 5, 5),
+            Arguments.of(7, 1, 1),
+            Arguments.of(0, 1, 1),
+            Arguments.of(5, 0, 5),
+            Arguments.of(10, 0, 10),
+            Arguments.of(-5, 1, 1),
+            Arguments.of(-10, -2, 2)
+            // ... add more test cases here
+        );
+    }
+
+}
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..d45d27f6
--- /dev/null
+++ b/src/test/java/com/example/educacao/model/AlunoTest.java
@@ -0,0 +1,17 @@
+package com.example.educacao.model;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class AlunoTest {
+    @Test
+    void testCalculaMedia() {
+        var aluno = new Aluno();
+        aluno.setNota1(11);
+        aluno.setNota2(8);
+        aluno.setNota3(8);
+        var obtido = aluno.calculaMedia();
+        assertEquals(8.66, obtido, 0.01);
+    }
+}
