在单个语句中用Java执行多个查询

在单个语句中用Java执行多个查询,第1张

在单个语句中用Java执行多个查询

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

"SELECt FROM * TABLE;INSERT INTO TABLE;"

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

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

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

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

发送连接请求时,您需要将连接属性附加

allowMultiQueries=true
到数据库URL。这是额外的连接属性,如果那些已经存在的一些,比如
autoReConnect=true
,对等。可接受的值
allowMultiQueries
属性是
true
false
yes
,和
no
。其他任何值在运行时都会被拒绝
SQLException

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

除非通过了此类指令,否则

SQLException
将引发an 。

您必须使用

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. 创建一个或多个过程
    select
    ,并进行
    DML
    查询。
  2. 使用从Java调用它
    CallableStatement
  3. 您可以捕获
    ResultSet
    在过程中执行的多个。
    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


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/4904491.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存