すべてのプロダクト
Search
ドキュメントセンター

PolarDB:プリペアドステートメント

最終更新日:Mar 29, 2026

PolarDB-X は、プリペアドステートメントを 2 つのモードでサポートしています。1 つは Java Database Connectivity (JDBC) やその他のドライバーを介したプログラムによるアクセス用のバイナリモード、もう 1 つは SQL レベルで使用するためのテキストモードです。どちらのモードでも、ステートメントを一度定義すれば、異なるパラメーター値で繰り返し実行できます。

プリペアドステートメントのメリット:

  • 解析オーバーヘッドの削減:データベースはステートメントを一度だけ解析します。その後の実行ではパラメーター値を代入するだけで、繰り返しの解析をスキップします。

  • SQL インジェクション対策:パラメーター値は SQL 構造とは別に送信されるため、インジェクション攻撃を防ぎます。

バイナリモード

バイナリモードは、クライアント/サーバーバイナリプロトコルを使用し、アプリケーション開発における標準的なアプローチです。JDBC やその他のプログラミング言語のドライバーをサポートしています。MySQL がサポートするプリペアドステートメントの詳細については、「Prepared statements」をご参照ください。

PolarDB-X は、以下のバイナリプロトコルコマンドをサポートしています:

サポートされるステートメントタイプ:

  • すべてのデータ操作言語 (DML) ステートメント:SELECT、UPDATE、DELETE、INSERT。

サポートされないステートメントタイプ:

  • SHOW や SET などの DML 以外のステートメントは、プリペアドステートメントとして使用できません。

Java クライアントでのプリペアドステートメントの使用

Java クライアントでバイナリモードを使用するには、JDBC 接続 URL に useServerPrepStmts=true を追加します。このパラメーターがない場合、ドライバーはデフォルトでプリペアドステートメントを通常のステートメントとして処理します。

接続 URL の例:

jdbc:mysql://xxxxxx:3306/xxxxxx?useServerPrepStmts=true

例:プリペアドステートメントを使用した行の挿入

Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(
    "jdbc:mysql://xxxxxx:3306/xxxxxx?useServerPrepStmts=true",
    "xxxxx",
    "xxxxx"
);

String sql = "insert into batch values(?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 0);
preparedStatement.setString(2, "polardb-x");
preparedStatement.executeUpdate();

テキストモード

テキストモードでは SQL 構文を使用します。SQL クライアントから直接プリペアドステートメントを管理するには、以下のステートメントを使用します。

PREPARE

プリペアドステートメントを定義し、名前を割り当てます:

PREPARE stmt_name FROM preparable_stmt;
  • stmt_name は大文字と小文字を区別しません。

  • preparable_stmt は単一の SQL ステートメントである必要があります。

EXECUTE

プリペアドステートメントを実行します。ステートメントに ? プレースホルダーが含まれている場合は、USING 句を使用して値を指定します:

EXECUTE stmt_name [USING @var_name [, @var_name] ...];

DEALLOCATE PREPARE

プリペアドステートメントを解放し、そのリソースを解放します:

DEALLOCATE PREPARE stmt_name;

mysql> PREPARE stmt2 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+

mysql> DEALLOCATE PREPARE stmt2;