動的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などを連結します。