zoukankan      html  css  js  c++  java
  • mybatis模糊匹配问题

    在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进行测试

    Parameter index out of range (1 > number of parameters, which is 0).(参数索引超出范围)

    在mybatis里面写就是应该是 like '%${name} %' 而不是 '%#{name} %'
    ${name} 是不带单引号的,而#{name} 是带单引号的

    所以,当你用到 like '%#{name}%' 会报这种错误

    1.表达式: name like "%"#{name}"%"
    ==> Preparing: select * from bbs_brand WHERE name like "%"?"%"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>来进行循环遍历.


    来源: http://blog.csdn.net/u010398771/article/details/70768280

  • 相关阅读:
    关于Java中的hashCode和equals方法
    web学习--java applets
    web学习——异步支持AsyncSupported
    关于Session的另外一个例子
    Web学习之Session
    Servlet过滤器-日志记录
    什么是XML?
    企业级应用和互联网应用的异同
    J2EE Map
    个人所犯错误总汇
  • 原文地址:https://www.cnblogs.com/longyao/p/11719844.html
Copyright © 2011-2022 走看看