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