このトピックでは、準備されたステートメントプロトコルとその準備されたステートメントのサポートについて説明します。 このトピックでは、Javaクライアントで準備されたステートメントプロトコルを有効にする方法についても説明します。
概要
分散型リレーショナルデータベースサービス (PolarDB-X 1.0) を使用すると、クライアント /サーバーのバイナリプロトコルを有効にして、サーバー側で準備されたステートメントを実行できます。 パラメーター値のプレースホルダーを持つ準備されたステートメントには、次の利点があります。
- ステートメントが実行されるたびにステートメント解析のオーバーヘッドを最小限に抑えました。 ほとんどの場合、データベースアプリケーションは、少数の変数値のみが異なる多数のほぼ同一のステートメントを処理します。 これらのほぼ同一のステートメントを効率的に実行するには、準備されたステートメントの変数値を変更するだけで済みます。
- SQLインジェクション攻撃に対する保護。
説明
- 準備されたステートメントプロトコルの基本情報
- プロトコルは次のコマンドをサポートします。
- プロトコルは、Javaおよび他のプログラミング言語をサポートする。
- MySQLのpreparedステートメントでサポートされているコマンドについては、「Preparedステートメント」をご参照ください。
- SELECT、UPDATE、DELETE、INSERTなど、すべてのSQL DMLステートメントを準備済みのステートメントとして使用できます。
- 非DML SQL文は、SHOW文やSET文などの準備済み文として使用することはできません。
- MySQL CLIで準備済みのステートメントとして次のステートメントを使用することはできません:
mysql> SET @ s = 'SELECT SQRT(POW(?,2) + POW(?,2)) as hypotenuse '; mysql> PREPARE stmt2から @ s; mysql> SET @ a = 6; mysql> SET @ b = 8; mysql> EXECUTE stmt2 USING @ a、@ b;
Javaクライアントで準備されたステートメントプロトコルを有効にする
- Javaクライアントで準備されたステートメントを実行する場合は、MySQLに接続するためのURLにuseServerPrepStmts=trueフィールドを強制的に追加します。 このフィールドを追加しない場合は、通常のクエリが実行されます。
- 例: jdbc:mysql:// xxxxxx:3306/xxxxxx? useServerPrepStmts=true
Javaの例:
Class.forName("com.mysql.jdbc.Driver");
接続接続=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, "corona-db");
preparedStatement.exe cuteUpdate();