mybatisとファジークエリの#{}と$ {}の違い

動的SQLはMyBatisの主要な機能の1つです。マッパーで定義されたパラメーターがxmlに渡された後、MyBatisはクエリの前にそれらを動的に解析します。MyBatisは、動的SQLをサポートする2つの構文、#{}と$ {}を提供します。

#{}と$ {}の違い

(1)#{}は事前コンパイル処理であり、動的分析は入力変数に二重引用符を追加します。$ {}は二重引用符なしの文字列置換です。

(2)MyBatisが#{}を処理する場合、SQLの#{}を?に置き換え、署名し、PreparedStatementのsetメソッドを使用して値を割り当てます。MyBatisが$ {}を処理する場合、$ {}を変数の値に置き換えます。

(3)#{}を使用すると、SQLインジェクションを効果的に防ぎ、システムのセキュリティを向上させることができます。

(4)Preparedstatementのプリコンパイルメカニズムを使用します。プリコンパイルとは、SQLステートメントを事前にプリコンパイルすることであり、その後に注入されたパラメーターはSQLコンパイルされません。プリコンパイルメカニズムは、SQLインジェクションを非常にうまく防ぐことができます。特別な場合には、#{}ではなく、$ {}のみを使用できます。例:並べ替えを使用する場合のORDER BY $ {id}、#{id}を使用する場合、ORDER BY "id"に解析されますが、これは明らかに間違った記述方法です。


<select id="selectUser" parameterType="int" resultType="user">
  SELECT id,name,password FROM user WHERE password = #{password}
</select>

受信パスワードが123456の場合、解析中にSELECT id、name、password FROM user WHERE password = "123456"(with double quotes)に解析されます

<select id="selectUser" parameterType="int" resultType="user">
  SELECT id,name,password FROM user WHERE password = ${password}
</select>

受信パスワードが123456の場合、解析時にSELECT id、name、password FROM user WHERE password = 123456(二重引用符なし)に解析されます

MySQLでmybatisを使用したファジークエリ

決して書かない

<select id="selectUser" parameterType="int" resultType="user">
  SELECT id,name,password FROM user WHERE name LIKE "%#{password}%" 
</select>

動的分析後にデータベースが取得するSQLはSELECT ID、名前、パスワードFROMユーザーWHERE名LIKE "%"小 "%"であるため、このようなSQLステートメントは間違いなく間違いありません。

これは正しい書き方です:

<select id="selectUser" parameterType="int" resultType="user">
  SELECT id,name,password FROM user WHERE name LIKE concat("%",${password},"%") 
</select>

入ってくる名前がある場合は、小さなダイナミック解像度はユーザからSELECT ID、名前、パスワードになった後、 「%LIKE名の小さな%」は、データベースの名前が含まれます少し情報をチェックしてください

連結関数

CONCAT(文字列1、文字列2、文字列3、…):文字列1、文字列2、文字列3などを連結します。

参照記事:https : //www.cnblogs.com/liaowenhui/p/12217959.html

おすすめ

転載: blog.csdn.net/qq1350975694/article/details/107758152