Classe ContaDAO.java
, executando o delete com Transaction
:
public void deletar(Integer numeroDaConta) {
PreparedStatement ps = null;
String sql = "DELETE FROM conta WHERE numero = ?";
try {
// Iniciar transação
conn.setAutoCommit(false);
ps = conn.prepareStatement(sql);
ps.setInt(1, numeroDaConta);
ps.executeUpdate();
// Confirmar transação no banco de dados com commit
conn.commit();
} catch (SQLException e) {
// Reverter transação em caso de erro, chamando o rollback
try {
if (conn != null) {
conn.rollback();
}
} catch (SQLException ex) {
throw new RuntimeException("Erro ao reverter a transação", ex);
}
throw new RuntimeException("Erro ao deletar a conta", e);
} finally {
try {
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.setAutoCommit(true);
conn.close();
}
} catch (SQLException ex) {
throw new RuntimeException("Erro", ex);
}
}
}
Classe ContaService.java
:
//...
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!");
}
Connection conn = connection.recuperarConexao();
new ContaDAO(conn).deletar(numeroDaConta);
}
//...
Não é uma boa prática excluírmos os dados definitivamente do banco de dados, pois caso precise obter alguma informação, não teremos mais esses dados no banco. Desta forma, uma boa solução seria criarmos algo como Status
da conta, deixa ela como Encerrada
. Bloqueando qualquer ação na regra de negócio. Mas como o objetivo e treinarmos a realização do DELETE
, segue a solução. :)