ホームページ  >  記事  >  Java  >  Mabitisにおける#と$記号の違いと使い方を詳しく解説

Mabitisにおける#と$記号の違いと使い方を詳しく解説

黄舟
黄舟オリジナル
2017-03-08 11:01:471733ブラウズ

この記事では、主に Mabitis の # 記号と $ 記号の違いを紹介します。必要な方は参照してください

1. はじめに

Mybatis は、頻繁に SQL クエリを実行するために Mapper.xml の設定を使用します。動的パスパラメータが必要です。たとえば、名前に基づいてユーザーをフィルタリングする必要がある場合、SQL は次のようになります:

select * from user where name = "Jack";

上記の SQL では、名前の後のパラメータ「Jack」が動的に可変であることを望みます。つまり、さまざまな時点で、さまざまな条件に従ってユーザーの名前を照会します。 Mapper.xml ファイルで次の SQL を使用してパラメータ名を動的に渡します:

select * from user where name = #{name};

または:

select * from user where name = ${name};

2. $ と #

1. 違い:

動的 SQL は、mybatis の強力な機能の 1 つであり、mybatis が他の ORM フレームワークよりも優れている重要な理由です。 mybatis は SQL ステートメントをプリコンパイルする前に、SQL を動的に解析して BoundSql オブジェクトに解析し、そこで動的 SQL も処理されます。動的 SQL 解析フェーズでは、#{ } と ${ } は異なる動作をします。

#{ }: JDBC 準備済みステートメントのパラメーター マーカーとして解析されます。

たとえば、Mapper の次の SQL ステートメントです。

${ } は単なる文字列の置換であり、変数の置換は動的 SQL 解析段階で実行されます。

例えば、Mapperの以下のSQLは変数を含まず、完全に定数データです。

要約すると、${ } 変数の置換ステージは動的 SQL 解析ステージにあり、#{ } 変数の置換ステージは DBMS にあります。

3. 使用法

1. #{ } が使用できる場合はどこでも #{ } を使用します

まず第一に、これはパフォーマンスを考慮したものであり、同じプリコンパイル済み SQL を再利用できます。次に、プリコンパイル前に ${ } が変数に置き換えられているため、SQL インジェクションの問題が発生します。たとえば、次の SQL:

select * from user where name = #{name};

パラメータ tableName が user; delete user; -- の場合、SQL 動的解析段階の後、プリコンパイル前の SQL は次のようになります。 2. テーブル名を変数として使用する場合は、${ }を使用する必要があります

これは、テーブル名が文字列であり、SQL プレースホルダーを使用して文字列を置き換える場合、一重引用符 '' が含まれるためです。 SQL 構文エラーが発生します。例:

select * from user where name = ?;

プリコンパイルされた SQL は次のようになります:

select * from user where name = ${name};

渡すパラメータが tableName = "user" 、 name = "Jack" であると仮定します。プレースホルダー 変数置換後の SQL ステートメントは次のようになります:

select * from user where name = "Jack";

上記の SQL ステートメントには構文エラーがあります。一重引用符 '' を使用してテーブル名を追加することはできません (バックティック `` は使用できることに注意してください)。

4. SQL プリコンパイル

1. 定義:

SQL プリコンパイルとは、SQL ステートメントとパラメーターを DBMS に送信する前に、データベース ドライバーが SQL ステートメントをコンパイルすることを意味します。 DBMS が SQL を実行するため、再コンパイルする必要はありません。

2. プリコンパイルが必要な理由

JDBC はオブジェクト PreparedStatement を使用してプリコンパイルされたステートメントを抽象化し、プリコンパイルを使用します。プリコンパイル フェーズでは、SQL の実行を最適化できます。ほとんどの場合、プリコンパイルされた SQL は直接実行できます。SQL が複雑になればなるほど、コンパイルの複雑さも大きくなります。プリペアドステートメントオブジェクトは再利用できます。 SQL のプリコンパイル後に生成された PreparedStatement オブジェクトをキャッシュし、次回同じ SQL に対してこのキャッシュされた PreparedState オブジェクトを直接使用できます。デフォルトでは、mybatis はすべての SQL をプリコンパイルします。

以上がMabitisにおける#と$記号の違いと使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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