ホームページ  >  記事  >  データベース  >  Mybatis の #{} と ${} の違いは何ですか?

Mybatis の #{} と ${} の違いは何ですか?

PHP中文网
PHP中文网オリジナル
2017-06-20 14:09:568531ブラウズ

数日前、ある会社に筆記試験を受けに行ったのですが、質問の 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 は次のようになります。 -- 以下のステートメントはコメント アウトされており、ユーザーをクエリする元のステートメントは、すべてのユーザー情報をクエリし、ユーザー テーブルを削除するステートメントになります。これにより、データベースに重大な損傷が発生し、サーバーのダウンタイムが発生する可能性が高くなります。

ただし、テーブル名がパラメータとして渡される場合、使用できるのは ${} のみです。
これは、この使用法における SQL インジェクションの問題にも注意することを思い出させます。

以上がMybatis の #{} と ${} の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。