1
resposta

[Sugestão] Desafio: listando conta pelo número

Fiz algumas alterações na logica do menu principal para ter uma escolha entre qual tipo de busca

public Set listarContaPornumero(int numero){

    PreparedStatement executeSelect;
    ResultSet resultSet;
    Set<Conta> conta = new HashSet<>();

    String sqlSelect = "SELECT * FROM conta where numero =?";

    try {

        executeSelect = contaConn.prepareStatement(sqlSelect);
        executeSelect.setInt(1, numero);
        resultSet = executeSelect.executeQuery();

        while (resultSet.next()){

            Integer numeroConta = resultSet.getInt(1);
            BigDecimal saldoConta = resultSet.getBigDecimal(2);
            String nomeCliente = resultSet.getString(3);
            String cpfCliente = resultSet.getString(4);
            String emailCliente = resultSet.getString(5);

            DadosCadastroCliente dadosCadastroCliente= new DadosCadastroCliente(nomeCliente,cpfCliente,emailCliente);
            Cliente cliente = new Cliente(dadosCadastroCliente);

            conta.add(new Conta(numeroConta,cliente));
        }
        executeSelect.close();
        resultSet.close();
        contaConn.close();

    }catch (SQLException e) {

        throw new RuntimeException(e);
    }

    return conta;

}

ContaServiço inclusão

public Set listarContaPornumero(int numero){

    Connection connSelect = connection.RecuperarConexao();
    return  new ContaDAO(connSelect).listarContaPornumero(numero);
}

Alteração no menu

private static void listarContas() {

    System.out.println("Digite 1 para todas as contas ou 2 para informar o numero de uma conta");
    int opcaoListaConta = teclado.nextInt();

    if(opcaoListaConta==1){
        System.out.println("Contas cadastradas:");
        var contas = service.listarContasAbertas();
        contas.stream().forEach(System.out::println);

        System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu principal");
        teclado.next();
    } else if (opcaoListaConta==2) {

         System.out.println("Digite o numero da conta:");
         int numeroDaConta = teclado.nextInt();

         var conta = service.listarContaPornumero(numeroDaConta);
         conta.stream().forEach(System.out::println);

         System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu principal");
         teclado.next();
    }else{
    
         System.out.println("Opção para busca inválida,pressione qualquer tecla e de ENTER para voltar ao menu principal ");
         teclado.next();
    }
}
1 resposta

Olá, Pablo! Tudo bem?

Excelente contribuição! É muito bom ver como você não apenas resolveu o desafio, mas também pensou na experiência do usuário ao refatorar o menu principal para oferecer opções de busca distintas. Esse tipo de proatividade é o que diferencia um desenvolvedor que apenas segue instruções de um que entende a lógica de negócio.

Sua implementação com JDBC está muito bem estruturada por alguns motivos fundamentais:

  • Segurança com Prepared Statements: O uso de where numero =? e o preenchimento com executeSelect.setInt(1, numero) é a forma correta de evitar ataques de SQL Injection, garantindo que o parâmetro seja tratado como dado e não como parte do comando SQL.
  • Encapsulamento (DAO Pattern): Você manteve a separação de responsabilidades ao colocar a lógica de banco de dados no ContaDAO e a lógica de orquestração no ContaServiço. Isso torna o código muito mais fácil de manter e testar.
  • Uso de Coleções: Utilizar um Set<Conta> é uma escolha interessante, especialmente se você quiser garantir que, estruturalmente, não haja duplicidade de objetos de conta na sua listagem.
  • Lógica do Menu: A inclusão da condicional no listarContas() para escolher entre a listagem total ou a busca por número deixou o sistema muito mais funcional e profissional.

Uma pequena observação técnica:

Notei que dentro do seu try, você está fechando a conexão com contaConn.close(). Em aplicações reais, é preciso ter cuidado ao fechar a conexão dentro do DAO se ela foi aberta em outro lugar (como no seu ContaServiço), para não tentar reutilizar uma conexão já encerrada em outras operações. Uma alternativa moderna e segura no Java é o try-with-resources, que fecha automaticamente o PreparedStatement e o ResultSet para você ao final do bloco.

Parabéns pelo XP e pela dedicação em compartilhar sua solução com a comunidade!

Espero que possa ter lhe ajudado!