[解決済み] Javaで複数のクエリを1つのステートメントで実行する
2022-10-28 20:07:52
質問
こんにちは私は、MySQL クエリ ブラウザで可能であっても、現在例外を提供しているので、JDBC を使用してこのようなものを実行することが可能かどうか疑問に思っていました。
"SELECT FROM * TABLE;INSERT INTO TABLE;"
SQLクエリ文字列を分割し、ステートメントを2回実行することで可能であることは理解していますが、このための1回のアプローチがあるのかどうか疑問に思っていました。
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);
どのように解決するのですか?
JDBCを使用してこのようなものを実行することが可能かどうか疑問に思っていました。
"SELECT FROM * TABLE;INSERT INTO TABLE;"
はい、可能です。私が知っている限りでは、2つの方法があります。それは
- データベース接続のプロパティを設定して、複数のクエリを許可する。 デフォルトではセミコロンで区切られます。
- 暗黙的にカーソルを返すストアド プロシージャを呼び出すことによって。
以下の例は、上記の2つの可能性を示しています。
例1 : ( 複数のクエリを許可する ):
接続リクエストを送信する際に、接続プロパティとして
allowMultiQueries=true
を追加する必要があります。これは、以下のような接続プロパティが既に存在する場合の追加です。
autoReConnect=true
などです。使用可能な値は
allowMultiQueries
プロパティは
true
,
false
,
yes
そして
no
. それ以外の値は、実行時に
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つまたは複数の
select
とDML
クエリを実行します。 -
javaから呼び出すには
CallableStatement
. -
複数の
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
関連
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
Java の switch case 文で必要な定数式の問題の解決法
-
Jsoup-Crawlingの動作
-
java -jarコマンドでパッケージを実行すると、無効または破損したjarfile xxxx.jarが表示される。
-
シェルコマンドやスクリプトのJavaコール
-
eclipse にリソースリーク:'in' が閉じない
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
Java基礎 - マッピングとQ/A
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。
-
swagger2 モデルが表示されない モデルが見つからない @ApiModel アノテーションが表示されない問題