Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Commit e Rollback

Onde nesse caso com o DAO, ficaria o Commit e o Rollback por padrão, no DAO, ou na implementação?

2 respostas

Fiz no meu projeto pessoal desse jeito com o qual estou me baseando no curso. Está certo?

package br.com.financas.pessoal.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.financas.pessoal.model.Ativo;
import br.com.fincancas.pessoal.ConnectionFactory;

public class AtivoDAO {

    private Connection connection;

    public AtivoDAO() throws SQLException {
        this.connection = new ConnectionFactory().recuperaConexao();
        this.connection.setAutoCommit(false);
    }

    public void commit() throws SQLException {
        try {
            this.connection.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void rollback() throws SQLException {
        try {
            this.connection.rollback();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void close() {
        try {
            this.connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void adiciona(Ativo ativo) throws SQLException {

        String sql = "INSERT INTO ativos (nome,tipo_ativo,descricao) VALUES(? ,? ,?)";

        try (PreparedStatement pstm = connection.prepareStatement(sql)) {

            pstm.setString(1, ativo.getNome());
            pstm.setString(2, ativo.getTipoAtivo());
            pstm.setString(3, ativo.getDescricao());

            pstm.execute();
        }

    }

    public List<Ativo> lista() throws SQLException{

        List<Ativo> ativos = new ArrayList<Ativo>();

        String sql = "SELECT nome FROM ativos";

        try (PreparedStatement stm = connection.prepareStatement(sql)) {
            stm.execute();
            try (ResultSet rst = stm.getResultSet()) {
                while (rst.next()) {
                    Ativo ativo = new Ativo(rst.getString(1));

                    ativos.add(ativo);
                }
            }
        }
        return ativos;
    }

}
package br.com.financas.pessoal.teste;

import java.sql.SQLException;
import java.util.List;

import br.com.financas.pessoal.dao.AtivoDAO;
import br.com.financas.pessoal.model.Ativo;

public class TestaInsercaoComAtivo {

    public static void main(String[] args) throws SQLException {

        Ativo ativo = new Ativo("BBDC4", "Negócios", "Bradesco");

        AtivoDAO ativoDAO = new AtivoDAO();

        try {
            ativoDAO.adiciona(ativo);

            List<Ativo> listaDeAtivos = ativoDAO.lista();

            ativoDAO.commit();

            listaDeAtivos.stream().forEach(lda -> System.out.println(lda));

        } catch (Exception e) {
            e.printStackTrace();
            ativoDAO.rollback();

        } finally {
            ativoDAO.close();
        }

    }

}
solução!

Gustavo, bota tarde. Seria mais interessante estar na DAO, caso contrário, você joga uma responsabilidade para classe de teste que não é dela, sabe? Como a DAO é justamente para essas interações com o banco de dados, faz mais sentido estar lá. =)