【違い】
-
#{ } はプリコンパイル処理、${ } は文字列置換
-
Mybatis が #{ } を処理するとき、SQL の #{ } のプレースホルダーを使用してパラメーターを置き換え、PreparedStatement の set メソッドを呼び出して値を割り当てます。
-
Mybatis が処理中の場合は{ } を入れることです。、 {}を変数の値に置き換えることです。
-
#{ } を使用すると、SQL インジェクションを効果的に防止し、システム セキュリティを向上させることができます。
【使用シーン】
- 一般に、SQL インジェクションを回避できるため、#{} が推奨されます。動的テーブル名と動的フィールド名にパラメーターを渡す必要がある場合は、${} を使用する必要があります。
- 比如:select * from ${tableName} where id > #{id};
【SQLインジェクション問題】
たとえば、 ${} を使用して問題を挿入する場合:
select * from ${tableName};
パラメータ t_user;delete from t_user が渡された場合、プリコンパイル済み SQL は次のようになり、システムが使用できなくなります。
select * from t_user;delete from t_user
【インジェクション反対声明】
concat 関数を使用します。
なselect * from t_user where name like concat('%', #{name}, '%')