事前コンパイルの過程では、それは同じではありません。#{}の前処理パラメータは、部分的に以下のSQLステートメントに、プレースホルダーによって置き換えられますが:=ユーザー名SELECT * FROM;?
そして、$ {}の文字列を単純に交換され、ダイナミックな解決フェーズは、SQL文がに解析されます。ユーザーからの選択*どこ名=「zhangsan」;
したがって、好ましくは#{}を使用します。$ {}の問題SQLインジェクションの原因から!
$ {}を使用して変数としてソートフィールドによってテーブル、オーダー。
1、#{}
JDBCに解決は、プレースホルダでパラメータセクションを書(準備された文)パラメーター・マーカーを準備しましたか?代わりに。動的に解決します。
t_userから*を選択する場所名=?;
正当な文字列が渡されたとして渡された引数は、最終的には必須検査と保安検査のPreparedStatementメソッドを渡し、およびます。
2、$ {}
アリスに渡されたパラメータは、最終処理結果が次のようにしている場合は、この方法でのみ、変数の代入、動的SQLの構文解析段階になり、単純な文字列の置換を行います。
ユーザ名はアリスを '= t_userから選択*;
このような従来のプリコンパイルされたSQLステートメントが既に変数が含まれていない、$ {}は、したがって置換変数動的SQLのステージがステージを解析することが分かります。