3
respostas

Com erro aqui !!

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

3 respostas

Oi!

Manda aqui o código da sua classe ContaService.

package br.com.alura.bytebank.domain.conta;

import br.com.alura.bytebank.Conectionfactory;
import br.com.alura.bytebank.domain.RegraDeNegocioException;
import br.com.alura.bytebank.domain.cliente.Cliente;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Set;

public class ContaService {

    private Conectionfactory connection;

    public ContaService() {

        this.connection = new Conectionfactory();
    }

    private Set<Conta> contas = new HashSet<>();

    public Set<Conta> listarContasAbertas() {
        return contas;
    }

    public BigDecimal consultarSaldo(Integer numeroDaConta) {
        var conta = buscarContaPorNumero(numeroDaConta);
        return conta.getSaldo();
    }

    public void abrir(DadosAberturaConta dadosDaConta) {
        var cliente = new Cliente(dadosDaConta.dadosCliente());
        var conta = new Conta(dadosDaConta.numero(), cliente);
        if (contas.contains(conta)) {
            throw new RegraDeNegocioException("Já existe outra conta aberta com o mesmo número!");
        }

        String sql = "INSERT INTO conta (numero, saldo, cliente nome, cliente cpf, cliente email)" +
                "VALUES (? ,? ,? ,? ,?)";

        Connection conn =  connection.recuperarconexao();

        try {
            PreparedStatement preparedStatement = conn.prepareStatement(sql);

            preparedStatement.setInt(1, conta.getNumero());

            preparedStatement.setBigDecimal(2, BigDecimal.ZERO);

            preparedStatement.setString(3, dadosDaConta.dadosCliente().nome());

            preparedStatement.setString(4, dadosDaConta.dadosCliente().cpf());

            preparedStatement.setString(5, dadosDaConta.dadosCliente().email());

            preparedStatement.execute();

        } catch (SQLException e) {
            throw new RuntimeException();
        }


    }

    public void realizarSaque(Integer numeroDaConta, BigDecimal valor) {
        var conta = buscarContaPorNumero(numeroDaConta);
        if (valor.compareTo(BigDecimal.ZERO) <= 0) {
            throw new RegraDeNegocioException("Valor do saque deve ser superior a zero!");
        }

        if (valor.compareTo(conta.getSaldo()) > 0) {
            throw new RegraDeNegocioException("Saldo insuficiente!");
        }

        conta.sacar(valor);
    }

    public void realizarDeposito(Integer numeroDaConta, BigDecimal valor) {
        var conta = buscarContaPorNumero(numeroDaConta);
        if (valor.compareTo(BigDecimal.ZERO) <= 0) {
            throw new RegraDeNegocioException("Valor do deposito deve ser superior a zero!");
        }

        conta.depositar(valor);
    }

    public void encerrar(Integer numeroDaConta) {
        var conta = buscarContaPorNumero(numeroDaConta);
        if (conta.possuiSaldo()) {
            throw new RegraDeNegocioException("Conta não pode ser encerrada pois ainda possui saldo!");
        }

        contas.remove(conta);
    }

    private Conta buscarContaPorNumero(Integer numero) {
        return contas
                .stream()
                .filter(c -> c.getNumero() == numero)
                .findFirst()
                .orElseThrow(() -> new RegraDeNegocioException("Não existe conta cadastrada com esse número!"));
    }
}

O problema está no método abrir, no seu SQL:

String sql = "INSERT INTO conta (numero, saldo, cliente nome, cliente cpf, cliente email) VALUES (? ,? ,? ,? ,?)";

Está faltando o underline nas colunas nome, cpf e email. O certo:

String sql = "INSERT INTO conta (numero, saldo, cliente_nome, cliente_cpf, cliente_email) VALUES (? ,? ,? ,? ,?)";