2014-09-02 55 views
0

我有2 tables,它将同时更新。编写多个SQL查询的最佳做法

作为一个示例employee table and a department table具有多对多的关系,所以当新员工添加到表中时,他的部门将被插入到第三级表中。现在我首先将部分员工详细信息插入到员工表中,然后获取该员工ID,然后将其与他的部门详细信息相结合,然后将其插入员工部门表中。

为此,我目前使用3个独立的SQL查询。如果在最后一个查询(employee-department)中发生错误或无法获取上次插入的员工,我需要回滚第一个插入(员工)。我可以用我当前的查询(delete on failure as another query)来实现这个目标,或者如果我使用存储过程来完成整个任务,它会更加干净。

在此先感谢:)

+0

你到目前为止做了什么? – diEcho 2014-09-02 05:09:31

+0

我已经完成了3个不同的查询插入部分。现在正在研究验证这些插入 – Sajirupee 2014-09-02 05:10:22

+0

阅读有关交易。例如。您可以编写一个方法并将其标记为@Transactional(如果您使用Spring)来一起执行所有查询。 – StanislavL 2014-09-02 06:09:06

回答

0

您是否直接从JSP使用JDBC?我希望不会......在任何情况下,Spring JDBC都有一些JDBC的好帮手。你想要使用JdbcTemplate和DataSourceTransactionManager。

下面是一个简单的例子(不要指望它来编译,只是为了让你去...)

DataSource dataSource = getDataSourceFromSomewhere(); 
DataSourceTransactionManager tm = new DataSourceTransactionManager(dataSource); 
JdbcTemplate jdbc = new JdbcTemplate(dataSource); 
TransactionStatus tx = tm.getTransaction(new DefaultTransactionDefinition()); 

int update1 = jdbc.update("insert into employee..."); 
int employeeId = jdbc.queryForInt(select id from employee..."); 
int update2 = jdbc.update("insert into employee_department..."); 

if (employeeId > 0 && update2 > 0) 
    tm.commit(tx); 
else 
    tm.rollback(tx); 

如果你不想使用Spring(或不能),平旧的JDBC可以做同样的事情:

Connection conn = getConnectionFromSomewhere() 
... do a bunch of work ... 
if (work was successful) 
    conn.commit(); 
else 
    conn.rollback(); 

虽然我认为使用Spring JDBC库比普通的旧JDBC更容易。

+0

没有经验,谢谢你的回答。我为这个应用程序使用普通的JDBC,并且从你的答案和@StanislavL评论中找到了解决方案。 – Sajirupee 2014-09-02 06:28:02

+0

优秀!听到那个消息很开心。 – 2014-09-02 07:37:20

0

使用PDO交易

PDO::beginTransaction() - 启动事务
PDO::commit() - 提交事务
PDO::rollBack() - 回滚事务

$dbh->beginTransaction(); 

/* Change the database schema and data */ 
//...your all queries 
/* Recognize mistake and roll back changes */ 
$dbh->rollBack(); 
+0

对不起,我以前没有添加java标记。我可以用'Java'来做到这一点吗?我有一个'JSP'的Web应用程序。 – Sajirupee 2014-09-02 05:14:49

+0

您必须编写完整的规范。我对JSP – diEcho 2014-09-02 05:17:22