mybatisの$と#の違いは何ですか?なんで?

1. MybatisのMapper.xmlステートメントでSQLステートメントにparameterTypeを渡す方法は2つあります。#{}と$ {}
この方法でSQLインジェクションを防ぐことができるため、多くの場合#{}を使用します。このようにして、SQLステートメントは事前にコンパイルされ、#{}の途中のパラメーターを文字列にエスケープします。
例:
select * from table where name =#{zhangSan}
プリコンパイル、パラメーターマーカーに動的に解析されます?:
select * from table where name =?
動的解決中に$ {}を使用すると、パラメーター文字が渡されます文字列
select * from table where name = $ {zhangSan} 
動的解析、パラメーター文字列は
select * from table where name = 'zhangSan'に渡され ます
要約:
#{}この値はコンパイルされたSQLステートメントの値であり、値は#{}:動的分析->プリコンパイル->実行
$ {}これは値であり、SQLステートメントをコンパイルするには$ {}:動的分析->コンパイル->実行
#着信パラメーターはSQLで文字列として(文字列として)表示され、二重引用符が自動的に着信するデータに追加されます。
$着信パラメーターは、SqLの着信値として直接表示されます
$ {}変数置換フェーズは動的SQL解析フェーズにあり、#{}変数置換はDBMSにあります。
 

2.#はSQLインジェクション(ステートメントのスプライシング)のリスクを防止できますが、$はSQLインジェクションを防止できません。

3. $メソッドは通常、テーブル名などのデータベースオブジェクトを転送するために使用されます。

4.ほとんどの場合、#が依然として頻繁に使用されます。通常、#を使用できる場合は、$を使用しないでください。ただし、たとえば、$を使用する必要がある場合があります。たとえば、MyBatisを並べ替えるときに動的パラメーターによる順序を使用する場合は、#ではなく$を使用する必要があります。

おすすめ

転載: www.cnblogs.com/cdlyy/p/12749199.html