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;