mybatis做like模糊查詢


 

1.  參數中直接加入%%

  param.setUsername("%CD%");
      param.setPassword("%11%");

	<select  id="selectPersons" resultType="person" parameterType="person">
		select id,sex,age,username,password from person where true 
			<if test="username!=null"> AND username LIKE #{username}</if>
			<if test="password!=null">AND password LIKE #{password}</if>
&lt;/select&gt;</pre>

2.  bind標簽

<select id="selectPersons" resultType="person" parameterType="person">
  <bind name="pattern" value="'%' + _parameter.username + '%'" />
  select id,sex,age,username,password 
  from person
  where username LIKE #{pattern}
</select>

 

 

3. CONCAT

where username LIKE concat(concat('%',#{username}),'%')

 

                                            關於mybatis中llike模糊查詢中#和$的使用                    </a>
            </span>
        </h1>
    </div>
    <div class="article_manage clearfix">
    <div class="article_l">
    <span class="link_categories">
    標簽:
                        <a href="http://so.csdn.net/so/search/s.do?q=mybatis&amp;t=blog" target="_blank">mybatis</a>
                <a href="http://so.csdn.net/so/search/s.do?q=#&amp;t=blog" target="_blank">#</a>
                    </span>
</div>
    <div class="article_r">
    <span class="link_postdate">2017年04月25日 22:55:58</span>
    <span class="link_view" title="閱讀次數">14627人閱讀</span>
    <span class="link_comments" title="評論次數"> <a href="javascript:void(0);" class="btn-pinglun">評論</a>(2)</span>
    <span class="link_collect csdn-tracking-statistics" data-pid="blog" data-mod="popu_171">
        <a href="javascript:void(0);" onclick="javascript:collectArticle('關於mybatis中llike模糊查詢中#和$的使用','70768280');return false;" title="收藏" target="_blank">收藏</a>
    </span>
            <span class="link_report">
        <a href="javascript:void(0);" onclick="javascript:report(70768280, 2);return false;" title="舉報">舉報</a>
    </span>
                </div>

在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性能調優+內存模型+虛擬機原理)   很不錯的虛擬機視頻教程.




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM