From adb6098e528d8856e4fac6937895bea2cc473922 Mon Sep 17 00:00:00 2001
From: AndreFSAntunes <60117758+AndreFSAntunes@users.noreply.github.com>
Date: Wed, 2 Aug 2023 20:29:28 -0300
Subject: [PATCH 1/9] Update README.md

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index b0d5a8ce..63368837 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.

From 9dfd5c9b43a8f7a370651e8eb3780dc297a14212 Mon Sep 17 00:00:00 2001
From: Andre Antunes <andre.antunes@live.com>
Date: Sat, 19 Aug 2023 16:54:04 +0000
Subject: [PATCH 2/9] Environment config

---
 config.env                                   |  3 +
 src/main/java/com/example/AppBd.java         | 58 ++++++++++++++++++++
 src/main/java/com/example/EnvFileReader.java | 30 ++++++++++
 src/main/java/com/example/EnvHandler.java    | 18 ++++++
 4 files changed, 109 insertions(+)
 create mode 100644 config.env
 create mode 100644 src/main/java/com/example/AppBd.java
 create mode 100644 src/main/java/com/example/EnvFileReader.java
 create mode 100644 src/main/java/com/example/EnvHandler.java

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/src/main/java/com/example/AppBd.java b/src/main/java/com/example/AppBd.java
new file mode 100644
index 00000000..9b7173bc
--- /dev/null
+++ b/src/main/java/com/example/AppBd.java
@@ -0,0 +1,58 @@
+package com.example;
+
+import java.io.IOException;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+public class AppBd {
+    public static String dbHost;
+    public static String dbUser;
+    public static String dbPass;
+    public static void main(String[] args) {
+        EnvHandler.loadEnvVariables();
+        listarEstados();
+    }
+
+    private static void listarEstados() {
+        carregarDriverJDBC();
+
+        Statement statement = null;
+        try (var conn = DriverManager.getConnection(dbHost, dbUser, dbPass)) {
+
+            System.out.println("Conexão realizada com sucesso!");
+
+            statement = conn.createStatement();
+            var estados = statement.executeQuery("select * from estado");
+            while (estados.next()) {
+                System.out.printf("Id: %-3d - Nome: %-20s - UF: %s\n", estados.getInt("id"), estados.getString("nome"),
+                        estados.getString("uf"));
+            }
+
+        } catch (SQLException e) {
+            if (statement == null)
+                System.err.println("Não foi possível conectar ao banco de dados: " + e.getMessage());
+            else System.err.println("Algum erro na consulta sql: " + e.getMessage());
+        }
+    }
+
+    private static 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());
+        }
+    }
+
+    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/EnvFileReader.java b/src/main/java/com/example/EnvFileReader.java
new file mode 100644
index 00000000..79d7011a
--- /dev/null
+++ b/src/main/java/com/example/EnvFileReader.java
@@ -0,0 +1,30 @@
+package com.example;
+
+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/EnvHandler.java b/src/main/java/com/example/EnvHandler.java
new file mode 100644
index 00000000..2a9d2468
--- /dev/null
+++ b/src/main/java/com/example/EnvHandler.java
@@ -0,0 +1,18 @@
+package com.example;
+
+public class EnvHandler {
+
+    static void loadEnvVariables() {
+        String pathToEnvFile = "config.env";
+        
+        // Create a new instance of the EnvFileReader
+        EnvFileReader envReader = null;
+        envReader = AppBd.loadEnvFiles(pathToEnvFile, envReader);
+        
+        // Now you can use this instance to get the values from your .env file
+        AppBd.dbHost = envReader.get("DB_HOST");
+        AppBd.dbUser = envReader.get("DB_USER");
+        AppBd.dbPass = envReader.get("DB_PASS");
+    }
+    
+}

From a9c778a0a662bfb82226c88656811ea0f795a4d8 Mon Sep 17 00:00:00 2001
From: Andre Antunes <andre.antunes@live.com>
Date: Sun, 20 Aug 2023 03:13:41 +0000
Subject: [PATCH 3/9] CRUD + refactor

---
 src/main/java/com/example/AppBd.java          | 97 ++++++++++++-------
 src/main/java/com/example/EnvHandler.java     | 18 ----
 .../com/example/dao/ConnectionManager.java    | 32 ++++++
 src/main/java/com/example/dao/EstadoDao.java  | 46 +++++++++
 src/main/java/com/example/dao/ProdutoDao.java | 55 +++++++++++
 .../example/{ => handlers}/EnvFileReader.java |  2 +-
 .../java/com/example/handlers/EnvHandler.java | 30 ++++++
 src/main/java/com/example/model/Estado.java   | 55 +++++++++++
 src/main/java/com/example/model/Marca.java    | 28 ++++++
 src/main/java/com/example/model/Produto.java  | 47 +++++++++
 .../com/example/model/RegiaoGeografica.java   | 18 ++++
 11 files changed, 372 insertions(+), 56 deletions(-)
 delete mode 100644 src/main/java/com/example/EnvHandler.java
 create mode 100644 src/main/java/com/example/dao/ConnectionManager.java
 create mode 100644 src/main/java/com/example/dao/EstadoDao.java
 create mode 100644 src/main/java/com/example/dao/ProdutoDao.java
 rename src/main/java/com/example/{ => handlers}/EnvFileReader.java (96%)
 create mode 100644 src/main/java/com/example/handlers/EnvHandler.java
 create mode 100644 src/main/java/com/example/model/Estado.java
 create mode 100644 src/main/java/com/example/model/Marca.java
 create mode 100644 src/main/java/com/example/model/Produto.java
 create mode 100644 src/main/java/com/example/model/RegiaoGeografica.java

diff --git a/src/main/java/com/example/AppBd.java b/src/main/java/com/example/AppBd.java
index 9b7173bc..3a0b03f0 100644
--- a/src/main/java/com/example/AppBd.java
+++ b/src/main/java/com/example/AppBd.java
@@ -1,58 +1,81 @@
 package com.example;
 
-import java.io.IOException;
-import java.sql.DriverManager;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
-import java.sql.Statement;
+
+import com.example.dao.*;
+import com.example.model.Marca;
+import com.example.model.Produto;
 
 public class AppBd {
-    public static String dbHost;
-    public static String dbUser;
-    public static String dbPass;
     public static void main(String[] args) {
-        EnvHandler.loadEnvVariables();
-        listarEstados();
+        new AppBd();
     }
 
-    private static void listarEstados() {
-        carregarDriverJDBC();
-
-        Statement statement = null;
-        try (var conn = DriverManager.getConnection(dbHost, dbUser, dbPass)) {
-
-            System.out.println("Conexão realizada com sucesso!");
-
-            statement = conn.createStatement();
-            var estados = statement.executeQuery("select * from estado");
-            while (estados.next()) {
-                System.out.printf("Id: %-3d - Nome: %-20s - UF: %s\n", estados.getInt("id"), estados.getString("nome"),
-                        estados.getString("uf"));
-            }
+    public AppBd() {
+        // não é mais necessario?
+        // carregarDriverJDBC();
+        try (var conn = ConnectionManager.getConnection()) {
+            var estadoDao = new EstadoDao(conn);
+            estadoDao.listar();
+            estadoDao.localizar("TO");
 
+            // var marca = new Marca(42L);
+            // var produto = new Produto(202l, "Universal Device PRO", marca, 2000d);
+            var produtoDao = new ProdutoDao(conn);
+            // produtoDao.inserir(produto);
+            // produtoDao.excluir(204);
+            // produtoDao.alterar(produto);
+            listarDadosTabela(conn, "produto", true);
         } catch (SQLException e) {
-            if (statement == null)
-                System.err.println("Não foi possível conectar ao banco de dados: " + e.getMessage());
-            else System.err.println("Algum erro na consulta sql: " + e.getMessage());
+            System.err.println("Não foi possivel conectaro ao banco de dados: " + e.getMessage());
         }
     }
 
-    private static void carregarDriverJDBC() {
+    private void listarDadosTabela(Connection conn, String tabela, boolean lastFive) {
+        String sql = "SELECT * FROM \"" + tabela + "\"";
+        if (lastFive) sql += " order by id desc limit 5";
         try {
-            Class.forName("org.postgresql.Driver");
+            var statement = conn.createStatement();
+            var resultado = statement.executeQuery(sql);
+            var metadata = resultado.getMetaData();
+            int colunas = metadata.getColumnCount();
+
+            printHeader(metadata, colunas);
 
-        } catch (ClassNotFoundException e) {
-            System.err
-                    .println("Não foi possível carregar a biblioteca para acesso ao banco de dados: " + e.getMessage());
+            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());
         }
     }
 
-    static EnvFileReader loadEnvFiles(String pathToEnvFile, EnvFileReader envReader) {
-        try {
-            envReader = new EnvFileReader(pathToEnvFile);
-        } catch (IOException e) {
-            e.printStackTrace();
+    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("-");
         }
-        return envReader;
+        System.out.println();
     }
-}
 
+    
+    // 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());
+    //     }
+    // }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/EnvHandler.java b/src/main/java/com/example/EnvHandler.java
deleted file mode 100644
index 2a9d2468..00000000
--- a/src/main/java/com/example/EnvHandler.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.example;
-
-public class EnvHandler {
-
-    static void loadEnvVariables() {
-        String pathToEnvFile = "config.env";
-        
-        // Create a new instance of the EnvFileReader
-        EnvFileReader envReader = null;
-        envReader = AppBd.loadEnvFiles(pathToEnvFile, envReader);
-        
-        // Now you can use this instance to get the values from your .env file
-        AppBd.dbHost = envReader.get("DB_HOST");
-        AppBd.dbUser = envReader.get("DB_USER");
-        AppBd.dbPass = envReader.get("DB_PASS");
-    }
-    
-}
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/EstadoDao.java b/src/main/java/com/example/dao/EstadoDao.java
new file mode 100644
index 00000000..d0e9635d
--- /dev/null
+++ b/src/main/java/com/example/dao/EstadoDao.java
@@ -0,0 +1,46 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class EstadoDao {
+    private Connection conn;
+
+    public EstadoDao(Connection conn) {
+        this.conn = 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() throws SQLException {
+        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());
+        }
+
+    }
+
+    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"));
+        }
+    }
+}
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..d8a7391c
--- /dev/null
+++ b/src/main/java/com/example/dao/ProdutoDao.java
@@ -0,0 +1,55 @@
+package com.example.dao;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import com.example.model.Produto;
+
+public class ProdutoDao {
+    private Connection conn;
+
+    public ProdutoDao(Connection conn) {
+        this.conn = conn;
+    }
+
+    private 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());
+        }
+    }
+
+    private 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());
+        }
+
+    }
+
+    private 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/EnvFileReader.java b/src/main/java/com/example/handlers/EnvFileReader.java
similarity index 96%
rename from src/main/java/com/example/EnvFileReader.java
rename to src/main/java/com/example/handlers/EnvFileReader.java
index 79d7011a..3eca56d8 100644
--- a/src/main/java/com/example/EnvFileReader.java
+++ b/src/main/java/com/example/handlers/EnvFileReader.java
@@ -1,4 +1,4 @@
-package com.example;
+package com.example.handlers;
 
 import java.io.BufferedReader;
 import java.io.FileReader;
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..3a9b05d1
--- /dev/null
+++ b/src/main/java/com/example/model/Estado.java
@@ -0,0 +1,55 @@
+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;
+    }
+}
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..440e15bd
--- /dev/null
+++ b/src/main/java/com/example/model/RegiaoGeografica.java
@@ -0,0 +1,18 @@
+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;
+    }
+}

From 3d9547077502281e79ef56ca4fa67fbac9d75e81 Mon Sep 17 00:00:00 2001
From: Andre Antunes <andre.antunes@live.com>
Date: Sun, 20 Aug 2023 16:01:03 +0000
Subject: [PATCH 4/9] Refactor and clean up

---
 src/main/java/com/example/AppBd.java          | 63 +++----------------
 src/main/java/com/example/dao/Dao.java        | 47 ++++++++++++++
 src/main/java/com/example/dao/ProdutoDao.java |  6 +-
 3 files changed, 58 insertions(+), 58 deletions(-)
 create mode 100644 src/main/java/com/example/dao/Dao.java

diff --git a/src/main/java/com/example/AppBd.java b/src/main/java/com/example/AppBd.java
index 3a0b03f0..7b09860b 100644
--- a/src/main/java/com/example/AppBd.java
+++ b/src/main/java/com/example/AppBd.java
@@ -1,7 +1,6 @@
 package com.example;
 
 import java.sql.Connection;
-import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 
@@ -15,67 +14,21 @@ public static void main(String[] args) {
     }
 
     public AppBd() {
-        // não é mais necessario?
-        // carregarDriverJDBC();
         try (var conn = ConnectionManager.getConnection()) {
-            var estadoDao = new EstadoDao(conn);
-            estadoDao.listar();
-            estadoDao.localizar("TO");
+            // var estadoDao = new EstadoDao(conn);
+            // estadoDao.listar();
+            // estadoDao.localizar("TO");
 
             // var marca = new Marca(42L);
-            // var produto = new Produto(202l, "Universal Device PRO", marca, 2000d);
-            var produtoDao = new ProdutoDao(conn);
+            // var produto = new Produto(202l, "Universal Device Plus", marca, 1400d);
+            // var produtoDao = new ProdutoDao(conn);
             // produtoDao.inserir(produto);
-            // produtoDao.excluir(204);
+            // produtoDao.excluir(206);
             // produtoDao.alterar(produto);
-            listarDadosTabela(conn, "produto", true);
+            var dao = new Dao(conn);
+            dao.listar("produto", true);
         } catch (SQLException e) {
             System.err.println("Não foi possivel conectaro ao banco de dados: " + e.getMessage());
         }
     }
-
-    private void listarDadosTabela(Connection conn, 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();
-    }
-
-    
-    // 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());
-    //     }
-    // }
 }
\ No newline at end of file
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..e812e166
--- /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 {
+    private 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/ProdutoDao.java b/src/main/java/com/example/dao/ProdutoDao.java
index d8a7391c..3b9f28d7 100644
--- a/src/main/java/com/example/dao/ProdutoDao.java
+++ b/src/main/java/com/example/dao/ProdutoDao.java
@@ -12,7 +12,7 @@ public ProdutoDao(Connection conn) {
         this.conn = conn;
     }
 
-    private void excluir(int id) {
+    public void excluir(int id) {
         var sql = "delete from produto where id = ?";
         try (var statement = conn.prepareStatement(sql)) {
             statement.setLong(1, id);
@@ -24,7 +24,7 @@ private void excluir(int id) {
         }
     }
 
-    private void alterar(Produto produto) {
+    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());
@@ -39,7 +39,7 @@ private void alterar(Produto produto) {
 
     }
 
-    private void inserir(Produto produto) {
+    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());

From 5c823dc0de11e8de647495d7078566c3e7280f85 Mon Sep 17 00:00:00 2001
From: Andre Antunes <andre.antunes@live.com>
Date: Sun, 20 Aug 2023 16:01:30 +0000
Subject: [PATCH 5/9] Refactor and clean up

---
 src/main/java/com/example/AppBd.java | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/main/java/com/example/AppBd.java b/src/main/java/com/example/AppBd.java
index 7b09860b..35e970d1 100644
--- a/src/main/java/com/example/AppBd.java
+++ b/src/main/java/com/example/AppBd.java
@@ -19,12 +19,12 @@ public AppBd() {
             // estadoDao.listar();
             // estadoDao.localizar("TO");
 
-            // var marca = new Marca(42L);
-            // var produto = new Produto(202l, "Universal Device Plus", marca, 1400d);
-            // var produtoDao = new ProdutoDao(conn);
+            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);
+            produtoDao.alterar(produto);
             var dao = new Dao(conn);
             dao.listar("produto", true);
         } catch (SQLException e) {

From 39c85fc7c3b75fe2637056197a57a56ef904831d Mon Sep 17 00:00:00 2001
From: Andre Antunes <andre.antunes@live.com>
Date: Sun, 20 Aug 2023 23:17:26 +0000
Subject: [PATCH 6/9] Inheritance + further refactoring

---
 src/main/java/com/example/AppBd.java          | 32 ++++++--
 src/main/java/com/example/dao/Dao.java        |  2 +-
 src/main/java/com/example/dao/EstadoDao.java  | 80 ++++++++++++++++++-
 src/main/java/com/example/dao/ProdutoDao.java |  5 +-
 src/main/java/com/example/model/Estado.java   |  7 +-
 .../com/example/model/RegiaoGeografica.java   |  6 ++
 6 files changed, 115 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/example/AppBd.java b/src/main/java/com/example/AppBd.java
index 35e970d1..2dfcb738 100644
--- a/src/main/java/com/example/AppBd.java
+++ b/src/main/java/com/example/AppBd.java
@@ -3,10 +3,13 @@
 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) {
@@ -15,18 +18,31 @@ public static void main(String[] args) {
 
     public AppBd() {
         try (var conn = ConnectionManager.getConnection()) {
-            // var estadoDao = new EstadoDao(conn);
-            // estadoDao.listar();
+            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);
+            // 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("produto", true);
+            // 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());
         }
diff --git a/src/main/java/com/example/dao/Dao.java b/src/main/java/com/example/dao/Dao.java
index e812e166..c9a311e7 100644
--- a/src/main/java/com/example/dao/Dao.java
+++ b/src/main/java/com/example/dao/Dao.java
@@ -5,7 +5,7 @@
 import java.sql.SQLException;
 
 public class Dao {
-    private Connection conn;
+    protected Connection conn;
 
     public Dao(Connection conn) {
         this.conn = conn;
diff --git a/src/main/java/com/example/dao/EstadoDao.java b/src/main/java/com/example/dao/EstadoDao.java
index d0e9635d..b71cb0f4 100644
--- a/src/main/java/com/example/dao/EstadoDao.java
+++ b/src/main/java/com/example/dao/EstadoDao.java
@@ -3,12 +3,17 @@
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
 
-public class EstadoDao {
-    private Connection conn;
+import com.example.model.Estado;
+import com.example.model.RegiaoGeografica;
+
+public class EstadoDao extends Dao{
 
     public EstadoDao(Connection conn) {
-        this.conn = conn;
+        super(conn);
     }
 
     public void localizar(String uf) {
@@ -25,7 +30,7 @@ public void localizar(String uf) {
         }
     }
 
-    public void listar() throws SQLException {
+    public void listar(){
         try {
             var statement = conn.createStatement();
             var estados = statement.executeQuery("select * from estado");
@@ -37,10 +42,77 @@ public void listar() throws SQLException {
 
     }
 
+    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
index 3b9f28d7..a760f6ef 100644
--- a/src/main/java/com/example/dao/ProdutoDao.java
+++ b/src/main/java/com/example/dao/ProdutoDao.java
@@ -5,11 +5,10 @@
 
 import com.example.model.Produto;
 
-public class ProdutoDao {
-    private Connection conn;
+public class ProdutoDao extends Dao{
 
     public ProdutoDao(Connection conn) {
-        this.conn = conn;
+        super(conn);
     }
 
     public void excluir(int id) {
diff --git a/src/main/java/com/example/model/Estado.java b/src/main/java/com/example/model/Estado.java
index 3a9b05d1..6b83a268 100644
--- a/src/main/java/com/example/model/Estado.java
+++ b/src/main/java/com/example/model/Estado.java
@@ -15,7 +15,7 @@ public Estado(String nome, String uf, RegiaoGeografica regiao, int area, int pop
         this.area = area;
         this.populacao = populacao;
     }
-    
+
     public Long getId() {
         return id;
     }
@@ -52,4 +52,9 @@ public int getPopulacao() {
     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/RegiaoGeografica.java b/src/main/java/com/example/model/RegiaoGeografica.java
index 440e15bd..a9a1b72f 100644
--- a/src/main/java/com/example/model/RegiaoGeografica.java
+++ b/src/main/java/com/example/model/RegiaoGeografica.java
@@ -3,6 +3,12 @@
 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;
     }

From 7db0a2270db21d212aaa8905f99fea95be729286 Mon Sep 17 00:00:00 2001
From: Andre Antunes <andre.antunes@live.com>
Date: Mon, 21 Aug 2023 02:33:53 +0000
Subject: [PATCH 7/9] mdcTest + aluno

---
 dados.sql                                     | 11 +++++
 src/main/java/com/example/MathUtil.java       |  9 ++++
 .../com/example/educacao/dao/alunoDao.java    |  9 ++++
 .../com/example/educacao/model/aluno.java     | 42 +++++++++++++++++++
 src/test/java/com/example/MathUtilTest.java   | 34 +++++++++++++++
 5 files changed, 105 insertions(+)
 create mode 100644 src/main/java/com/example/MathUtil.java
 create mode 100644 src/main/java/com/example/educacao/dao/alunoDao.java
 create mode 100644 src/main/java/com/example/educacao/model/aluno.java
 create mode 100644 src/test/java/com/example/MathUtilTest.java

diff --git a/dados.sql b/dados.sql
index 3097ea8d..b066de19 100644
--- a/dados.sql
+++ b/dados.sql
@@ -3,6 +3,17 @@
 -- Á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 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/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/educacao/dao/alunoDao.java b/src/main/java/com/example/educacao/dao/alunoDao.java
new file mode 100644
index 00000000..2cb87c9f
--- /dev/null
+++ b/src/main/java/com/example/educacao/dao/alunoDao.java
@@ -0,0 +1,9 @@
+package com.example.educacao.dao;
+
+import com.example.educacao.model.aluno;
+
+public class alunoDao {
+    public void inserir(aluno aluno) {
+        return;
+    }
+}
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..c05edffb
--- /dev/null
+++ b/src/main/java/com/example/educacao/model/aluno.java
@@ -0,0 +1,42 @@
+package com.example.educacao.model;
+
+public class aluno {
+    private Integer matricula;
+    private String nome;
+    private double nota1, nota2, 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) {
+        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;
+    }
+}
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
+        );
+    }
+
+}

From fdf33d1e7354d3c2ff2828b42836e2b664b293b5 Mon Sep 17 00:00:00 2001
From: Andre Antunes <andre.antunes@live.com>
Date: Wed, 23 Aug 2023 00:28:58 +0000
Subject: [PATCH 8/9] crud aluno

---
 .../java/com/example/educacao/Principal.java  | 30 ++++++
 .../com/example/educacao/dao/alunoDao.java    | 97 ++++++++++++++++++-
 .../educacao/model/{aluno.java => Aluno.java} | 15 ++-
 .../com/example/educacao/model/AlunoTest.java | 17 ++++
 4 files changed, 154 insertions(+), 5 deletions(-)
 create mode 100644 src/main/java/com/example/educacao/Principal.java
 rename src/main/java/com/example/educacao/model/{aluno.java => Aluno.java} (74%)
 create mode 100644 src/test/java/com/example/educacao/model/AlunoTest.java

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
index 2cb87c9f..df47be8b 100644
--- a/src/main/java/com/example/educacao/dao/alunoDao.java
+++ b/src/main/java/com/example/educacao/dao/alunoDao.java
@@ -1,9 +1,98 @@
 package com.example.educacao.dao;
 
-import com.example.educacao.model.aluno;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.NoSuchElementException;
 
-public class alunoDao {
-    public void inserir(aluno aluno) {
-        return;
+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
similarity index 74%
rename from src/main/java/com/example/educacao/model/aluno.java
rename to src/main/java/com/example/educacao/model/Aluno.java
index c05edffb..ce41b094 100644
--- a/src/main/java/com/example/educacao/model/aluno.java
+++ b/src/main/java/com/example/educacao/model/Aluno.java
@@ -1,10 +1,15 @@
 package com.example.educacao.model;
 
-public class aluno {
+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;
     }
@@ -21,8 +26,10 @@ public double getNota1() {
         return nota1;
     }
     public void setNota1(double nota1) {
+        validaNota(nota1);
         this.nota1 = nota1;
     }
+    
     public double getNota2() {
         return nota2;
     }
@@ -39,4 +46,10 @@ public void setNota3(double 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/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);
+    }
+}

From 9dbd13f6354e67c1d81d4afbdd9a76158e7976d0 Mon Sep 17 00:00:00 2001
From: Andre Antunes <andre.antunes@live.com>
Date: Thu, 24 Aug 2023 02:16:41 +0000
Subject: [PATCH 9/9] transaction

---
 dados.sql                                     | 11 +++
 .../example/financeiro/dao/transacaoDao.java  | 14 +++
 .../example/financeiro/model/Transacao.java   | 91 +++++++++++++++++++
 3 files changed, 116 insertions(+)
 create mode 100644 src/main/java/com/example/financeiro/dao/transacaoDao.java
 create mode 100644 src/main/java/com/example/financeiro/model/Transacao.java

diff --git a/dados.sql b/dados.sql
index b066de19..fc503868 100644
--- a/dados.sql
+++ b/dados.sql
@@ -4,6 +4,17 @@
 -- 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 (
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;
+    }
+
+}
