私は最近MyBatisを使用しました。私は以前にイバティスを使用したことがあります。全体的に、それは似ていますが、私はまだ多くの問題に遭遇しました。もう一度録音します。
たとえば、#{}と$ {}パラメーター送信の使用の違い、
#を使用してパラメーターを渡すと、SQLステートメントの解析が「」を追加します。たとえば、select * from name =#{name}、渡された名前はxiao liです。
[name = 'xiao li']から[テーブルから]を選択します。文字列として解析されます。これは明らかに$よりも優れています。 #{}パラメーターの通過により、SQL注入を防ぐことができます。渡すパラメーターが単一の引用符である場合、$ {}を使用する場合、このメソッドはエラーを報告します。
別のシナリオは、列ごとの順序などの動的なソートを実行したい場合は、#{}を使用する場合、印刷されたものは$ {}を使用してください。
「名前」でテーブル注文から *を選択してください、これは役に立たない、
現在、#を使用できる場合は、$を使用しないでください。
MyBatisの#と$の違い
1。#すべての着信データを文字列として扱い、自動化するデータに二重引用符を追加します。たとえば、#user_id#で注文、渡された値が111の場合、sqlにパージするときの値は「111」で注文します。渡された値がIDである場合、SQLに解析された値は「ID」によって順序です。
2。$渡されたデータを直接表示し、SQLで生成します。たとえば、$ user_id $で注文します。渡された値が111の場合、sqlに解析されたときの値はuser_idによって順序です。渡された値がIDである場合、SQLに解析された値はIDで順序です。
3.#メソッドは、SQL注入を大幅に防ぐことができます。
4. $メソッドはSQL注入を防ぐことはできません。
5。$メソッドは、一般に、テーブル名を渡すなど、データベースオブジェクトを渡すために使用されます。
6.一般的に、#を使用できる場合は、$を使用しないでください。
MyBatisをソートするときに動的パラメーターで注文を使用する場合、#の代わりに$を使用することに注意を払う必要があります。
文字列置換
デフォルトでは、#{}形式の構文を使用すると、MyBatisが前処理されたステートメントプロパティを作成し、背景(?など)として安全な値を設定します。これは安全で迅速であり、SQLステートメントに直接変更されない文字列を挿入するだけです。たとえば、注文のように、次のように使用できます。
$ {columnName}で注文
ここで、MyBatisは文字列を変更または脱出しません。
重要:ユーザーからのコンテンツ出力を受け入れて、ステートメントの変更されていない文字列に提供することは安全ではありません。これにより、潜在的なSQLインジェクション攻撃につながる可能性があるため、ユーザーがこれらのフィールドに入ることを許可したり、通常はエスケープして自分でチェックすることを許可しないでください。
MyBatisの$と#の違いの簡単な要約
少し前に、誰かがインタビューのために私たちの会社に来ました。私たちのマネージャーはこの質問をしました。少しだけ理解していたので、バイドゥに行きました。
実際、違いは非常に単純です。あなたはそれを例で理解するでしょう。文を書くsql-for例:select * from user_role Where user_code = "100";
この文では、select * from $ {tablename} where user_code =#{usercode}として書く必要があります。
したがって、$文字はSQLに直接綴られますが、#文字は文字列の形でSQLで綴られます。