数日前、ある会社に筆記試験を受けに行ったのですが、質問の 1 つが「Mybatis の #{} と ${} の違いは何ですか?」というものでした。正直に言うと、私自身も mybatis についてあまり勉強していなかったので、最近のプロジェクトで mybatis を使用しましたが、複数のオブジェクト間の最も基本的な追加、削除、変更、およびクエリを実行するだけでした。相関関係はほとんど使用されません。 #{} はマッパー マッピング ファイルでのみ使用されますが、${} は JS およびフロントエンド JSP ページで使用されます。その後、オンラインで調べたところ、両者の間にはまだ大きな違いがあることがわかりました。ここで、皆さんの議論と学習を促進するために、私が見つけた情報を次のように要約します。
一般的に、この 2 つの違いは次の 6 つの点に要約できます:
(1)# 受信データを文字列として扱い、自動的に受信するデータの引用符に double を追加します。 。 例: #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 を使用しているときに、 の使用法にも遭遇しました。このシンボル内のステートメントは文字列としてではなく、ストアド プロシージャの実行などの SQL ステートメントとして直接処理されます。
例による説明:
動的SQLは、マッパーで定義されたパラメータがxmlに渡された後、クエリを実行する前に動的に解析します。 mybatis は、動的 SQL をサポートする 2 つの構文 #{} と ${} を提供します。
次のステートメントでは、name の値が zhangsan の場合、2 つのメソッドに違いはありません:
select * from user where name = #{name};
select * from user where name = ${name};
分析後の結果はすべて
select * from user where name = 'zhangsan';
ただし #{} と $ {} はプリコンパイルでは異なる方法で処理されます。 #{} 前処理中に、パラメータ部分は を置き換えるプレースホルダーに置き換えられ、次の SQL ステートメントになります:
select * from user where name = ?;
そして ${} は、動的に単純な文字列置換 になります。解析フェーズでは、SQL ステートメントが
select * from user where name = 'zhangsan';
に解析されます。 上記では、#{} のパラメータ置換が DBMS で発生しますが、${} は動的解析プロセス中に発生します。
それでは、使用中にどの方法を使用する必要がありますか?
答えは次のとおりです: 最初に #{} を使用します。 ${} は SQL インジェクションの問題を引き起こすためです。
次の例を見てください:
select * from ${tableName} where name = #{name}
この例では、テーブル名が
user; delete user; の場合、動的解析後の SQL は次のようになります。 -- 以下のステートメントはコメント アウトされており、ユーザーをクエリする元のステートメントは、すべてのユーザー情報をクエリし、ユーザー テーブルを削除するステートメントになります。これにより、データベースに重大な損傷が発生し、サーバーのダウンタイムが発生する可能性が高くなります。
ただし、テーブル名がパラメータとして渡される場合、使用できるのは ${} のみです。
以上がMybatis の #{} と ${} の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。