在java中在单个语句中执行多个查询

新手上路,请多包涵

嗨,我想知道是否可以使用 JDBC 执行类似的操作,因为它目前提供了一个异常,即使它可以在 MySQL 查询浏览器中执行。

 "SELECT FROM * TABLE;INSERT INTO TABLE;"

虽然我确实意识到可以拆分 SQL 查询字符串并执行两次语句,但我想知道是否有一次性的方法。

     String url = "jdbc:mysql://localhost:3306/";
    String dbName = "databaseinjection";
    String driver = "com.mysql.jdbc.Driver";
    String sqlUsername = "root";
    String sqlPassword = "abc";

    Class.forName(driver).newInstance();

    connection = DriverManager.getConnection(url+dbName, sqlUsername, sqlPassword);

原文由 MilindaD 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 893
2 个回答

我想知道是否可以使用 JDBC 执行类似的操作。

 "SELECT FROM * TABLE;INSERT INTO TABLE;"

对的,这是可能的。据我所知,有两种方法。他们是

  1. 通过设置数据库连接属性来允许多个查询,默认用分号隔开。
  2. 通过调用隐式返回游标的存储过程。

以下示例演示了上述两种可能性。

示例 1 :(允许多个查询):

发送连接请求时,您需要将连接属性 allowMultiQueries=true 附加到数据库 url。 This is additional connection property to those if already exists some, like autoReConnect=true , etc.. Acceptable values for allowMultiQueries property are true , false , yesno 。任何其他值在运行时都会被 SQLException 拒绝。

 String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";

除非通过了这样的指令,否则会抛出 SQLException

您必须使用 execute( String sql ) 或其其他变体来获取查询执行的结果。

 boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );

要遍历和处理结果,您需要以下步骤:

 READING_QUERY_RESULTS: // label
    while ( hasMoreResultSets || stmt.getUpdateCount() != -1 ) {
        if ( hasMoreResultSets ) {
            Resultset rs = stmt.getResultSet();
            // handle your rs here
        } // if has rs
        else { // if ddl/dml/...
            int queryResult = stmt.getUpdateCount();
            if ( queryResult == -1 ) { // no more queries processed
                break READING_QUERY_RESULTS;
            } // no more queries processed
            // handle success, failure, generated keys, etc here
        } // if ddl/dml/...

        // check to continue in the loop
        hasMoreResultSets = stmt.getMoreResults();
    } // while results

示例 2 :要遵循的步骤:

  1. 使用一个或多个 selectDML 查询创建一个过程。
  2. 使用 CallableStatement 从 java 调用它。
  3. 您可以捕获在过程中执行的多个 ResultSet s。

无法捕获 DML 结果但可以发出另一个 select

找出表中的行是如何受到影响的。

_样品表和程序_:

 mysql> create table tbl_mq( i int not null auto_increment, name varchar(10), primary key (i) );
Query OK, 0 rows affected (0.16 sec)

mysql> delimiter //
mysql> create procedure multi_query()
    -> begin
    ->  select count(*) as name_count from tbl_mq;
    ->  insert into tbl_mq( names ) values ( 'ravi' );
    ->  select last_insert_id();
    ->  select * from tbl_mq;
    -> end;
    -> //
Query OK, 0 rows affected (0.02 sec)
mysql> delimiter ;
mysql> call multi_query();
+------------+
| name_count |
+------------+
|          0 |
+------------+
1 row in set (0.00 sec)

+------------------+
| last_insert_id() |
+------------------+
|                3 |
+------------------+
1 row in set (0.00 sec)

+---+------+
| i | name |
+---+------+
| 1 | ravi |
+---+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

_从 Java 调用过程_:

 CallableStatement cstmt = con.prepareCall( "call multi_query()" );
boolean hasMoreResultSets = cstmt.execute();
READING_QUERY_RESULTS:
    while ( hasMoreResultSets ) {
        Resultset rs = stmt.getResultSet();
        // handle your rs here
    } // while has more rs

原文由 Ravinder Reddy 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用批量更新,但查询必须是操作(即插入、更新和删除)查询

Statement s = c.createStatement();
String s1 = "update emp set name='abc' where salary=984";
String s2 = "insert into emp values ('Osama',1420)";
s.addBatch(s1);
s.addBatch(s2);
s.executeBatch();

原文由 Himanshu Mohta 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题