我想在一次执行中执行多个查询或作业。 像这样的东西 例如:
String query = """
SELECT * FROM tab1;
INSERT INTO tab1 VALUES( … );
UPDATE tab1 … ;
DELETE FROM tab1 … ;
""" ;
Statement st = con1.createStatement();
ResultSet rs = st.executeQuery(query);
或者多个 SELECT 查询。查询将是动态的。
但我无法做到这一点。运行多个以分号分隔的查询的方法是什么?
您可以通过以下示例实现使用addBatch和executeBatch命令同时执行多个SQL命令。
批处理允许您将相关的 SQL 语句分组为一批,并通过一次调用数据库将它们提交。 参考
当您一次向数据库发送多个 SQL 语句时,可以减少通信开销,从而提高性能。
DatabaseMetaData.supportsBatchUpdates()
方法来确定目标数据库是否支持批量更新处理。如果您的 JDBC 驱动程序支持此功能,该方法将返回 true。executeBatch()
用于开始执行组合在一起的所有语句。addBatch()
方法添加的所有语句。但是,您不能有选择地选择删除哪条语句。示例:
import java.sql.*;
public class jdbcConn {
public static void main(String[] args) throws Exception{
Class.forName("org.apache.derby.jdbc.ClientDriver");
Connection con = DriverManager.getConnection
("jdbc:derby://localhost:1527/testDb","name","pass");
Statement stmt = con.createStatement
(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
String insertEmp1 = "insert into emp values
(10,'jay','trainee')";
String insertEmp2 = "insert into emp values
(11,'jayes','trainee')";
String insertEmp3 = "insert into emp values
(12,'shail','trainee')";
con.setAutoCommit(false);
stmt.addBatch(insertEmp1);//inserting Query in stmt
stmt.addBatch(insertEmp2);
stmt.addBatch(insertEmp3);
ResultSet rs = stmt.executeQuery("select * from emp");
rs.last();
System.out.println("rows before batch execution= "
+ rs.getRow());
stmt.executeBatch();
con.commit();
System.out.println("Batch executed");
rs = stmt.executeQuery("select * from emp");
rs.last();
System.out.println("rows after batch execution= "
+ rs.getRow());
}
}
参考http://www.tutorialspoint.com/javaexamples/jdbc_executebatch.htm
我不确定您是否要在一个请求语句中发送两个 SELECT 语句,因为您可能无法访问这两个
ResultSet
。数据库可能只返回最后的结果集。
多个结果集
但是,如果您正在调用一个您知道可以返回多个结果集的存储过程,则类似这样的操作会起作用
CallableStatement stmt = con.prepareCall(...);
try {
...
boolean results = stmt.execute();
while (results) {
ResultSet rs = stmt.getResultSet();
try {
while (rs.next()) {
// read the data
}
} finally {
try { rs.close(); } catch (Throwable ignore) {}
}
// are there anymore result sets?
results = stmt.getMoreResults();
}
} finally {
try { stmt.close(); } catch (Throwable ignore) {}
}
多条SQL语句
如果您正在谈论多个 SQL 语句并且只有一个 SELECT,那么您的数据库应该能够支持 SQL 的一个
String
。例如我在 Sybase 上使用过类似的东西
StringBuffer sql = new StringBuffer( "SET rowcount 100" );
sql.append( " SELECT * FROM tbl_books ..." );
sql.append( " SET rowcount 0" );
stmt = conn.prepareStatement( sql.toString() );
这取决于您的数据库支持的语法。在此示例中,请注意附加的
spaces
填充语句,以便语句之间有空白。