Java:
PreparedStatement stmt = myConnection.prepareStatement("CALL myStoredRoutine(?, ?, ?)");
stmt.setString(1, a);
stmt.setString(2, b);
stmt.setString(3, c);
stmt.executeQuery();
保存されたルーチンがMySQLにある場合、フィルタリングされていない文字列がコードに何かを挿入することは可能ですか?
Java:
PreparedStatement stmt = myConnection.prepareStatement("CALL myStoredRoutine(?, ?, ?)");
stmt.setString(1, a);
stmt.setString(2, b);
stmt.setString(3, c);
stmt.executeQuery();
保存されたルーチンがMySQLにある場合、フィルタリングされていない文字列がコードに何かを挿入することは可能ですか?
いいえ、PreparedStatement
から保護するために構築されたようにSQL Injection
。
ストアドプロシージャを呼び出しているようですので、を使用することをお勧めしますCallableStatement
。
String SQL = "{CALL myStoredRoutine(?, ?, ?)}";
CallableStatement cstmt = myConnection.prepareCall(SQL);
PreparedStatementのインスタンスには、すでにコンパイルされているSQLステートメントが含まれています。これが「準備された」ステートメントを作成するものです
PreparedStatementオブジェクトはプリコンパイルされているため、Statementオブジェクトよりも高速に実行できます。
プリペアドステートメントは、SQLクエリを実行するために使用されます
CallableStatementオブジェクトは、すべてのRDBMSに対して標準的な方法でストアドプロシージャを呼び出す方法を提供します。ストアドプロシージャはデータベースに保存されます。ストアドプロシージャの呼び出しは、CallableStatementオブジェクトに含まれているものです。
いいえ、できません。文字列は、プリペアドステートメントによってフィルタリングされます。それが彼らのポイントの1つです。
いいえ。パラメータバインディングの目的は、パラメータがパラメータとして解析されることです。それはパフォーマンスにも良いです。
パラメータ化されたクエリを使用する場合、引数は解析され、必要に応じてエスケープ文字で変換されるため、不可能です。これは、パラメーター化されたクエリ/プリペアドステートメントを使用する利点です。