【问题标题】:How to execute multiple SQL statements from java如何从java执行多个SQL语句
【发布时间】:2012-06-11 08:43:10
【问题描述】:

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

String query="select * from tab1;insert into tab1 values(...);update tab1..;delete from tab1...;"
Statement st = con1.createStatement();
ResultSet rs = st.executeQuery(query); 

或多个选择查询。查询将是动态的。

但我无法做到这一点。运行以分号分隔的多个查询的方法是什么。

【问题讨论】:

  • 请澄清您的问题。您是在尝试处理多个 SELECT 结果集,还是处理多个 INSERTS 的批量更新。您会得到 3 个非常不同的答案,这表明问题不够具体。

标签: java jdbc


【解决方案1】:

您可以使用以下示例来实现此目的,使用 addBatch 和 executeBatch 命令同时执行多个 SQL 命令。

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

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

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

【讨论】:

  • 我不确定您是否回答了这个问题。您说的是 INSERT 语句被批处理,问题与多个 SELECT 语句有关,因此必须处理 ResultSets
  • @Brad 问题是I want to execute the multiple queries or job in one execute 所以我喜欢多个查询..
  • 也许是一个工作示例,但有点未格式化。我发现这个更有帮助:stackoverflow.com/questions/10797794/…
  • 完美的解释 - 工作愉快,我也在使用 Derby DB :)
  • @thonnor 很高兴它有帮助。
【解决方案2】:

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

多个结果集

但是,如果您调用的存储过程知道可以返回多个结果集,则类似这样的方法会起作用

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 填充语句,以便语句之间有空格。

【讨论】:

  • 原始问题是指非同质语句 - 所以这个答案比批处理执行的答案更正确。
猜你喜欢
  • 2014-04-04
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多