我是实施JDBC的新手。我正在构建一个注册页面,我需要在其中将行插入多个表中。
对于每个表,我使用DAO,在一个服务类中,我调用所有DAO的插入方法。在每个DAO插入方法中,我使用数据源创建新连接并执行。
现在,如果在插入时发生任何错误,我想回滚所有插入语句。
我知道有
connection.setAutoCommit(false)
现在,我如何创建一次连接并在其他DAO中重复使用它。所以,我可以使用保存点和回滚机制
除了发送连接作为参数之外还有其他方法。
我怎么能实现这个目标?
以下是服务页面的示例代码:
Sucessfull = firstDAO.save(firstDAOObj);
if(Sucessfull){
Sucessfull = secondDAO.save(secondDAOObj);
}
if(Sucessfull){
Sucessfull = thirdDAO.save(thirdDAOObj);
}
答案 0 :(得分:0)
我认为这会对你有帮助
try{
//Assume a valid connection object conn
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
String SQL = "INSERT INTO Employees " +
"VALUES (106, 20, 'Rita', 'Tez')";
stmt.executeUpdate(SQL);
//Submit a malformed SQL statement that breaks
String SQL = "INSERTED IN Employees " +
"VALUES (107, 22, 'Sita', 'Singh')";
stmt.executeUpdate(SQL);
// If there is no error.
conn.commit();
}catch(SQLException se){
// If there is any error.
conn.rollback();
}
答案 1 :(得分:0)
我不确定你为什么每个表都使用DAO(我假设你的所有表都在同一个数据库中)。我可能会使用一个DAO。我也不会为每个呼叫使用单独的连接。这是我用于此类事情的通用模板:
我把它放在我DAO的顶部:
private DataSource myDs= new JndiDataSourceLookup().getDataSource("<string name of your datasource>");
private DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(myDs);
private SimpleJdbcTemplate sjt = new SimpleJdbcTemplate(myDs);
然后再向下我在一个方法中有这样的东西,我传入包含我想要插入的数据的对象。这个DAO方法将由您的服务层类调用:
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
// put all of your inserts in here using the SimpleJdbcTemplate
// that was declared above
transactionManager.commit(status);
} catch(Throwable t) {
try {
transactionManager.rollback(status);
} catch (Throwable t2) {
log.error("Error rolling back transaction", t2);
}
throw new DataAccessException(t);
}
使用Spring还有其他方法可以进行交易,其中一种方法包括注释,但可能会有点复杂。我建议您考虑将来的应用程序。