如何从java执行多个SQL语句

如何从java执行多个SQL语句,java,jdbc,Java,Jdbc,我想在一次执行中执行多个查询或作业。 像这样的 例如: 或多个select查询。查询将是动态的 但是我不能这样做。运行多个以分号分隔的查询的方法是什么。您可以通过以下示例实现,使用addBatch和executeBatch命令同时执行多个SQL命令 批处理允许您将相关SQL语句分组到一个批中,并通过一次对数据库的调用提交它们 当您同时向数据库发送多个SQL语句时,可以减少通信开销,从而提高性能 JDBC驱动程序不需要支持此功能。您应该使用DatabaseMetaData.supportsBat

我想在一次执行中执行多个查询或作业。 像这样的 例如:

或多个select查询。查询将是动态的


但是我不能这样做。运行多个以分号分隔的查询的方法是什么。

您可以通过以下示例实现,使用addBatch和executeBatch命令同时执行多个SQL命令

批处理允许您将相关SQL语句分组到一个批中,并通过一次对数据库的调用提交它们

当您同时向数据库发送多个SQL语句时,可以减少通信开销,从而提高性能

  • JDBC驱动程序不需要支持此功能。您应该使用
    DatabaseMetaData.supportsBatchUpdates()
    方法来确定目标数据库是否支持批量更新处理。如果JDBC驱动程序支持此功能,则该方法返回true
  • 语句、PreparedStatement和CallableStatement的()方法用于将单个语句添加到批处理中。
    executeBatch()
    用于开始执行分组在一起的所有语句
  • ()返回一个整数数组,数组中的每个元素表示相应update语句的update计数
  • 正如您可以将语句添加到批处理中进行处理一样,您也可以使用()方法删除它们。此方法删除使用
    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());
   }
} 

请参阅

我不确定您是否希望在一个请求语句中发送两个SELECT语句,因为您可能无法同时访问两个
结果集
s。数据库可能只返回最后一个结果集

多个结果集

但是,如果调用一个存储过程,您知道它可以返回多个结果集,那么类似这样的方法就行了

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() );

这将取决于数据库支持的语法。在本例中,请注意添加的
空格
填充语句,以便语句之间有空格。

我不确定您是否回答了问题。您所说的INSERT语句是批处理的,这个问题与多个SELECT语句有关,因此必须处理ResultSets@Brad问题是,
我想在一个execute中执行多个查询或作业
,所以我需要多个查询。可能是一个工作示例,但有点未格式化。我发现这一条更有用:完美的解释-非常有用,我也在使用Derby DB:)@Thonn或者很高兴它有帮助。请澄清你的问题。您正在尝试处理多个选择结果集,还是处理多个插入的批更新。您将得到3个非常不同的答案,这表明一个问题不够具体。请查看此链接:原始问题指的是非齐次语句-因此此答案比指批量执行的答案更正确。
StringBuffer sql = new StringBuffer( "SET rowcount 100" );
sql.append( " SELECT * FROM tbl_books ..." );
sql.append( " SET rowcount 0" );

stmt = conn.prepareStatement( sql.toString() );