最近 mybatis を使用していますが、以前は ibatis を使用していましたが、一般的には似ていますが、それでも多くの問題に遭遇しました。
たとえば、#{} と $ の使用の違いです。 {} パラメータを渡すには、
use # 受信パラメータは、SQL ステートメントの解析時に「」が追加されます。たとえば、select * from table where name = #{name}、受信名は Xiao Li、その後、最終的に出力されるのは
select * from table where name = 'Xiao Li' です。これは文字列として解析されるため、$ と比較した利点は明らかですよね? #{} にパラメータを渡すと SQL インジェクションを防ぐことができます。渡すパラメーターが一重引用符である場合、${} を使用すると、このメソッドはエラーを報告します
別のシナリオとしては、列による並べ替えなどの動的な並べ替えを行う場合は、${} を使用する必要があります。このとき、#{} を使用すると、出力される内容は
select * from table order by 'name' となり、役に立ちません
現時点では、# を使用できる場合は使用しないでください。 mybatis の $、
# と $ の違い
1. # 受信データを文字列として扱い、自動的に受信するデータに二重引用符を追加します。例: #user_id# で並べ替えます。渡された値が 111 の場合、SQL に解析されたときの値は「111」で並べられます。渡された値が ID の場合、解析された SQL は「id」で並べられます。
6. 通常、# を使用できる場合は、$ を使用しないでください。
order を使用する場合は注意が必要です。 MyBatis をソートするときに、動的パラメーターによって #
文字列置換
の代わりに $ を使用します。 デフォルトでは、#{} 形式の構文を使用すると、MyBatis は準備されたステートメントのプロパティを作成し、それに対して安全な値 (? など) を設定します。これは安全で高速であり、推奨される方法ですが、変更されていない文字列を SQL ステートメントに直接挿入したい場合もあります。たとえば、ORDER BY と同様に、次のように使用できます:
ORDER BY ${columnName}
ここでは、MyBatis は文字列を変更したりエスケープしたりしません。
重要: ユーザーからの出力を受け入れて、それをステートメント内で不変の文字列として提供することは安全ではありません。これは潜在的な SQL インジェクション攻撃につながるため、ユーザーがこれらのフィールドに入力できるようにすべきではありません。通常は、エスケープして自分でフィールドを確認する必要があります。
Mybatis の $ と # の違いの簡単なまとめ
少し前に、ある人が面接に来て、マネージャーがこの質問をしました。私はそれについてあまり知らなかったので、Baidu に行きました。研究をするために。
実際、違いは非常に簡単です。例を見てみましょう。 SQL 文を作成します - 例: select * from user_role where user_code = "100";
この文では、 select * from ${tableName} where user_code = #{userCode} のように記述する必要があります
、$ 記号は SQL に直接綴られた場合、# 文字は文字列の形式で SQL に結合されます。
Mybatis の #{} パラメーターと ${} パラメーターの違い、および # と $ の違いの概要に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。