1. 程式人生 > >mybatis中llike模糊查詢中#和$的使用

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

在mybatis中經常要寫到like 查詢,關於#和$的使用的。總結如下:

name like 表示式 and falg=#{falg}

四種衍生:

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

2. 表示式: name like '%${name}%'

3. 表示式: name like concat(concat('%',#{username}),'%')

4. 表示式:name like '%'||#{name}||'%'

本次示例中共兩個條件,一個是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 like concat(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 like CONCAT('%','蓮','%') 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)

原文連結:http://www.2cto.com/database/201704/633355.html