我正在使用Java(JDBC)为SQL语句执行创建命令行实用程序。脚本被定义为具有许多查询的文本文件。每个查询由查询分隔符(“;”)分隔。输出路由到stdout。
SELECT * FROM table1;
UPDATE table1 SET field1='' WHERE field2='';
SELECT * FROM table1;
INSERT INTO table1 VALUES(...)
SELECT * FROM table1;
由于JDBC可以批量执行语句,只有当它们不返回ResultSet时,我还需要另一种方法。
截至目前,我将使用查询读取脚本文件,通过分隔符拆分它们,并分析每个查询,无论是“SELECT”查询,还是“INSERT”,“UPDATE”,“DELETE”查询。之后,我会在它自己的语句中执行每个查询。返回的东西被写入stdout,执行操作数据库的查询。当然,我会保留文件中查询的顺序。
我的问题是:如果文件中的一个查询错误,我就无法回滚,因为每个查询都是单独执行的。我怎么能处理这个问题?
答案 0 :(得分:1)
对于数据库连接,只需调用connection.setAutoCommit(false)然后执行语句并在完成后调用connection.commit(),如果遇到错误则调用connection.rollback()。
答案 1 :(得分:0)
这是向批处理添加查询的代码。
Statement stmt = conn.createStatement();
conn.setAutoCommit(false);
String SQL = "INSERT INTO table1 VALUES(...)";
stmt.addBatch(SQL);
String SQL = "INSERT INTO Employees (id, first, last, age) " +
"VALUES(201,'Raj', 'Kumar', 35)";
stmt.addBatch(SQL);
String SQL = "UPDATE Employees SET age = 35 " +
"WHERE id = 100";
stmt.addBatch(SQL);
int[] count = stmt.executeBatch();
//显式提交语句以应用更改
conn.commit();
试试这个......