需求:使用MyBatis進行開發時,在一個SQL語句中需要拼接list的大小。
大家都知道,當我們在MyBatis中寫SQL時,如果需要遍歷list,先對list進行非空判斷的時候,可以加下面這行:
<if test="null != list and list.size != 0">SQL</if>
但是如果想在SQL中取到list.size
的值,則比較麻煩。一般會想到如下:
<select id="getArticleIdByTags" parameterType="java.util.List" resultType="java.lang.Integer">
SELECT id
FROM table_name
where 1=1
<foreach collection="list" item="item" open="AND" separator="OR" close="GROUP BY id HAVING COUNT(*) >=">
field1 = #{item.a} AND field2 = #{item.b}
</foreach>
#{list.size}
</select>
但是你會發現報錯了,PersistenceException
、UnsupportOperationException
。
因為list.size用#{}是取不出來的,需要用${}
,把#
換成$
就可以了。
使用#{}
能夠有效防止SQL隱碼攻擊,但是也有它的缺點,它會把傳入的資料自動加上一個雙引號,所以如果要的是數字的話,就會比較尷尬。
而${}可以直接解析出原本的資料,所以需要數值比較的話,還是要加${}
。
轉載自https://www.jianshu.com/p/9d542c65c32c