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性能调优+内存模型+虚拟机原理)   很不错的虚拟机视频教程.



原文地址:https://www.cnblogs.com/jpfss/p/8745505.html