我正在开发一个已经实现了多个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);
}
}