编写多个SQL查询的最佳实践

时间:2014-09-02 05:08:18

标签: java mysql sql database

我有2 tables,它会同时更新。

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

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

提前感谢:)

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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更容易。