Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编写多个SQL查询的最佳实践_Java_Mysql_Sql_Database - Fatal编程技术网

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

Java 编写多个SQL查询的最佳实践,java,mysql,sql,database,Java,Mysql,Sql,Database,我有2个表,它们将同时更新 例如,具有多对多关系的员工表和部门表,因此当新员工添加到表中时,其部门将插入到第三级表中。现在,我首先将员工详细信息的一部分插入到employee表中,然后获取该员工ID,然后将其与他的部门详细信息相结合,然后将其插入到employee departments表中 为此,我目前使用3个单独的SQL查询。如果上次查询(员工部门)中出现错误或无法获取上次插入的员工,我需要回滚第一次插入(员工)。我可以用我当前的查询(作为另一个查询在失败时删除)来实现这一点吗?或者如果我使

我有
2个表
,它们将同时更新

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

为此,我目前使用3个单独的SQL查询。如果上次查询
(员工部门)
中出现错误或无法获取上次插入的员工,我需要回滚第一次插入(员工)。我可以用我当前的查询
(作为另一个查询在失败时删除)
来实现这一点吗?或者如果我使用存储过程来完成整个过程,它会更干净吗


提前感谢:)

使用PDO交易

-启动交易
-提交事务
-回滚事务


您是否直接从JSP使用JDBC?我希望不是。。。无论如何,SpringJDBC为JDBC提供了一些很好的帮助。您需要使用JdbcTemplate和DataSourceTransactionManager

下面是一个简单的示例(不要期望它能够编译,只是为了让您继续……)

如果您不想使用Spring(或者不能),那么简单的老JDBC也可以做同样的事情:

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

我认为使用Spring JDBC库比使用普通的老JDBC要容易得多。

到目前为止您做了什么?我已经用3个不同的查询插入了部分。现在,我们正在研究如何验证这些insertsRead关于事务的内容。例如,您可以编写一个方法并将其标记为@Transactional(如果您使用Spring),以便一起执行所有查询。谢谢@StanislavL。很抱歉,我以前没有添加java标记。我可以用
Java
来做这件事吗?我有一个
JSP
web应用程序。你必须写出你的完整规范。我没有JSP方面的经验。谢谢你的回答。我正在为这个应用程序使用普通JDBC,我从您的答案和@StanislavL注释中找到了一个解决方案。非常好!很高兴听到这个消息。
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);
Connection conn = getConnectionFromSomewhere()
... do a bunch of work ...
if (work was successful)
    conn.commit();
else
    conn.rollback();