この記事では、主に 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 サイトの他の関連記事を参照してください。