在mybatis中經常要寫到like 查詢,以前從來沒有遇到什么問題,突然遇到一個問題,找了好長時間沒找到,最后找到了,是關於#和$的使用的,總結如下:
name like 表達式 and falg=#{falg}
本次示例中共兩個條件,一個是name like 表達式, 還有flag相等,這個是使用#{}占位符,沒有任何問題,關鍵問題就是 表達式的書寫.下面來研究下表達式的書寫:
如果寫成'%#{name}%' ,就會報錯Parameter index out of range (2> number of parameters, which is 1). 這個錯誤,就是參數的問題,所以就查閱了一下資料,然后結合自己的實踐,得到總結如下:
本次使用 mysql 5.5.27和mybatis3.2.7進行測試
1.表達式: name like"%"#{name}"%"
==> Preparing: select * from bbs_brand WHERE namelike"%"?"%"and falg=? limit 0 , 10
==>Parameters: 蓮(String), 1(Integer)
能夠查詢出來,沒有問題,這是使用了占位符來占位,寫成SQL就是: name like "%"'蓮'"%"沒有問題
2.表達式: name like '%${name}%'
Preparing:select count(0) from (select * from bbs_brand WHERE name like'%蓮%' and falg=?) as total
Parameters: 1(Integer)
使用$進行字符串的拼接,直接把傳入的值,拼接上去了,沒有任何問題
3. 表達式: name likeconcat(concat('%',#{username}),'%')
==> Preparing: select count(0) from (select *from bbs_brand WHERE name like
concat(concat('%',?),'%') and falg=?) as total
==>Parameters: 蓮(String), 1(Integer)
這是使用了cancat進行字符串的連接,同時使用了#進行占位
轉換成SQL就是: name like CONCAT(CONCAT('%','蓮'),'%')
3. 表達式:name like CONCAT('%','${name}','%')
==> Preparing: select count(0) from (select *from bbs_brand WHERE name likeCONCAT('%','蓮','%') and falg=?) astotal
==>Parameters: 1(Integer)
對上面的表達式進行了簡化,更方便了
4. 表達式:name like '%'||#{name}||'%'
這個不能滿足要求,直接把數據庫中的所有數據查詢出來了,不符合我的要求,在mysql中||代表是or的意思
==> Preparing: select count(0) from (select *from bbs_brand WHERE name like'%'||?||'%' and falg=?) as total
==>Parameters: 蓮(String), 1(Integer)
關於$和#使用的第二個問題:
接口中方法:void deleteBrandByIds(@Param("ids")String ids);
xml中:<!-- brand delete -->
<delete id="deleteBrandByIds">
<!-- update bbs_brand set is_display=0 where id IN
(#{ids}) -->
update bbs_brand set is_display=0 where id IN
(${ids})
這里只能夠使用$ 進行字符串的拼接,而不是#.
當我們傳入的字符串是1,3,5,7的時候,用#只能刪除id為1的品牌,其他的就不能刪除了,這是因為,使用了#,就是一個占位符了,經過編譯后是
where id in(?) 加入字符串后是 where id in('1,3,5,7') 這種,在SQL中就只會刪除一個,我們來看SQL的執行效果
也是只是刪除一條記錄的,
所以如果想使用#,請在xml中使用動態的SQL,,傳遞的參數使用List<String>來進行循環遍歷.
https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.594c1deb4BA3kE&id=565031068322
深入理解Java虛擬機(jvm性能調優+內存模型+虛擬機原理) 很不錯的虛擬機視頻教程.