[英]How to execute multiple SQL statements from java
我想一次執行多個查詢或作業。 像這樣的東西:
String query="select * from tab1;insert into tab1 values(...);update tab1..;delete from tab1...;"
Statement st = con1.createStatement();
ResultSet rs = st.executeQuery(query);
或多個選擇查詢。查詢將是動態的。
但是我無法做到這一點,以半冒號分隔的多個查詢的運行方式是什么?
您可以使用以下示例來實現這一點,該示例使用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
,以便在各步之間有空白。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.