mybatisはどうしてくれぐれもwhere 1=1を使わないでください。

1978 ワード

1.ソリューション
以下はmybatisの検索文ですが、今回は「state=「ACTIVE」を動的条件に設定したら、何が起こるかを確認してみます。

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG
  WHERE
  <if test="state != null">
    state = #{state}
  </if>
  <if test="title != null">
    AND title like #{title}
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>
</select>
もし一致する条件がなかったらどうなりますか?最終的にこのSQLはこうなります。

SELECT * FROM BLOG
WHERE
これはクエリに失敗します。もしマッチしたのが第二の条件だったらどうなりますか?このSQLはこうなります。

SELECT * FROM BLOG
WHERE
AND title like ‘someTitle'
このクエリも失敗します。この問題は簡単に条件要素で解決できない。この問題はこのように解決しにくいので、解決した人はこのような問題にぶつかりたくないです。
MyBatisは簡単でほとんどのシーンに適合する解決方法があります。他のシーンでは、必要に応じてカスタマイズすることができます。これは簡単な変更が必要です。

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG
  <where>
    <if test="state != null">
         state = #{state}
    </if>
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>
 where要素は、サブ要素が何かを返す場合にのみ、「WHERE」というサブフレーズを挿入します。また、子文の先頭が「AND」または「OR」であれば、where要素もそれらを除去します。
2.なぜ1=1が使えないですか?
1.表のデータインデックスが失効する恐れがあります。
2.ゴミの条件は、追加する必要がありません。
3.公式文書の住所
mybatis公式サイトのアドレス
ここで、mybatisはなぜwhere 1=1の文章を使わないでくださいかについて紹介します。mybatis where 1=1の内容は以前の文章を検索してください。または次の関連記事を引き続きご覧ください。これからもよろしくお願いします。