關於mybatis中llike模糊查詢中#和$的使用

在mybatis中常常要寫到like 查詢,之前歷來沒有遇到什麼問題,忽然遇到一個問題,找了好長時間沒找到,最後找到了,是關於#和$的使用的,總結以下:mysql

name like  表達式    and    falg=#{falg}sql

本次示例中共兩個條件,一個是name  like  表達式, 還有flag相等,這個是使用#{}佔位符,沒有任何問題,關鍵問題就是 表達式的書寫.下面來研究下表達式的書寫:數據庫

若是寫成'%#{name}%' ,就會報錯Parameter index out of range (2> number of parameters, which is 1). 這個錯誤,就是參數的問題,因此就查閱了一下資料,而後結合本身的實踐,獲得總結以下:mybatis

本次使用 mysql 5.5.27和mybatis3.2.7進行測試測試

 

1.表達式: name like"%"#{name}"%"xml

==>  Preparing: select * from bbs_brand WHERE namelike"%"?"%"and falg=? limit 0 , 10接口

==>Parameters: 蓮(String), 1(Integer)字符串

可以查詢出來,沒有問題,這是使用了佔位符來佔位,寫成SQL就是: name like "%"'蓮'"%"沒有問題it

 

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>來進行循環遍歷.

相關文章
相關標籤/搜索