如何使用多个DAO控制提交/回滚操作

时间:2014-04-03 14:59:36

标签: java dao

我正在开发一个已经实现了多个DAO的Java项目。由于在几个表中插入,我必须控制事务。我正在阅读有关DAOManager的内容,但我并不了解如何实现它。

此外,我尝试在之间共享相同的连接,但它确实起作用。如果出现错误,我想回滚该事务。第一个插件甚至在第二个插件上提交所有数据失败。

这是我用来插入数据的代码。

        Connection con = null;
    try {

        con = new ConexaoBD().getConnection();

        con.setAutoCommit(false);
        EnderecoDAO endereco = new EnderecoDAO(con);
        endereco.incluir(aluno.getEndereco());

        AlunoDAO alunodao = new AlunoDAO(con);
        alunodao.incluir(aluno);

        con.commit();
    } catch (SQLException e){
        try {
            con.rollback();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
}

}

   public class ConexaoBD {

  public Connection getConnection() {
       try{ 
          Class.forName("com.mysql.jdbc.Driver");
          return DriverManager.getConnection("jdbc:mysql://localhost:3311  /escola","root","root");

         }
    catch (SQLException | ClassNotFoundException e){
         e.printStackTrace();
         return null;
    }
}

}

public class EnderecoDAO {
    private Connection con;
private PreparedStatement pstm;
private ResultSet rs;

    public EnderecoDAO(Connection con) {
        this.con = con;
    }


public boolean incluir(Endereco endereco) throws SQLException{
    //comando sql enviada para o banco
    String sql = "insert into tabEndereco (logradouro, complemento,bairro,cidade,estado,ponto_referencia) values (?,?,?,?,?,?) ";
    try {
        //prepara um comando com prepareStatement a partir de uma conex‹o
        pstm = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

        //passa os parametros unindo cada caracter especial(?) com o seu indice de 
        //aparecimento na sql
        pstm.setString(1, endereco.getLogradouro());
                    pstm.setString(2, endereco.getComplemento());
        pstm.setString(3, endereco.getBairro());
                    pstm.setString(4, endereco.getCidade());
                    pstm.setString(5, endereco.getEstado());
                    pstm.setString(6, endereco.getPonto_de_referencia());
        pstm.executeUpdate();
                    ResultSet rs = pstm.getGeneratedKeys();
                    if(rs.next())  {
                        endereco.setId_endereco(rs.getInt(1));
                        return true;
                    }
                    else
                        return false;
    } catch (SQLException e) {
        //System.out.println("Erro ao incluir endereco " + e.getMessage()); 
        //return false;
                    throw new SQLException(e);
    }
}


public class AlunoDAO {
    private Connection con = null;
private PreparedStatement pstm;
private ResultSet rs;

    public AlunoDAO(Connection con) {
        this.con = con;
    }


public boolean incluir(Aluno aluno) throws SQLException{
    //comando sql enviada para o banco
    String sql = "insert into tabAluno ( ra_aluno,nome,telefone1,telefone2,"
                    + "telefone3,sexo,data_nascimento,cartao_cidadao,naturalidade,"
                    + "nacionalidade,cor,religiao,quantidades_pessoas_na_residencia,"
                    + "nomes_familiares,unidade_de_ensino_anterior,"
                    + "nome_qtda_idade_de_irmaos,id_endereco,id_mae,id_pai,id_turma) "
                    + "values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
    try {
        //prepara um comando com prepareStatement a partir de uma conex‹o
        pstm = con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);

        //passa os parametros unindo cada caracter especial(?) com o seu indice de 
        //aparecimento na sql
        pstm.setInt(1, aluno.getRa());
                    pstm.setString(2, aluno.getNome());
        pstm.setInt(3, aluno.getTelefone1());
                    pstm.setInt(4, aluno.getTelefone2());
                    pstm.setInt(5, aluno.getTelefone3());
                    pstm.setString(6, aluno.getSexo());
                    pstm.setDate(7, aluno.getDatanascimento());                        
                    pstm.setInt(8, aluno.getCartao_cidadao());
                    pstm.setString(9, aluno.getNaturalidade());
                    pstm.setString(10, aluno.getNacionalidade());
                    pstm.setString(11, aluno.getCor());
                    pstm.setString(12, aluno.getReligiao());
                    pstm.setString(13, aluno.getQtda_pessoas_residencia());
                    pstm.setString(14, aluno.getNomes_familiares());
                    pstm.setString(15, aluno.getUnidade_ensino_anterior());
                    pstm.setString(16, aluno.getNome_qtda_idade_irmaos());                        

                    pstm.setInt(17,aluno.getEndereco().getId_endereco());
                    pstm.setInt(18,aluno.getPai().getId_pai());
                    pstm.setInt(19, aluno.getMae().getId_mae());
                    pstm.setInt(20,aluno.getTurma().getId_turma());



        //aqui est‡ executando o comando e retornando a quantidade de registros afetados 
        int result = pstm.executeUpdate();

        //true se afetou um ou mais registros
        return result > 0;
    } catch (SQLException e) {
        System.out.println("Erro ao incluir aluno " + e.getMessage()); 
        throw  new RuntimeException(e);
    }
}

0 个答案:

没有答案