转自https://blog.csdn.net/u010398771/article/details/70768280mysql
在mybatis中常常要写到like 查询,之前历来没有遇到什么问题,忽然遇到一个问题,找了好长时间没找到,最后找到了,是关于#和$的使用的,总结以下:sql
name like 表达式 and falg=#{falg}数据库
本次示例中共两个条件,一个是name like 表达式, 还有flag相等,这个是使用#{}占位符,没有任何问题,关键问题就是 表达式的书写.下面来研究下表达式的书写:mybatis
若是写成'%#{name}%' ,就会报错Parameter index out of range (2> number of parameters, which is 1). 这个错误,就是参数的问题,因此就查阅了一下资料,而后结合本身的实践,获得总结以下:jvm
本次使用 mysql 5.5.27和mybatis3.2.7进行测试性能
1.表达式: name like"%"#{name}"%"测试
==> Preparing: select * from bbs_brand WHERE namelike"%"?"%"and falg=? limit 0 , 10.net
==>Parameters: 莲(String), 1(Integer)视频
可以查询出来,没有问题,这是使用了占位符来占位,写成SQL就是: name like "%"'莲'"%"没有问题xml
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)
关于$和#使用的第二个问题:
<delete id="deleteBrandByIds">
<!-- update bbs_brand set is_display=0 where id IN (#{ids}) -->
也是只是删除一条记录的,
因此若是想使用#,请在xml中使用动态的SQL,,传递的参数使用List<String>来进行循环遍历.
https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-18045781879.2.33c5236bZlPDUM&id=569353717228深刻理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理) 很不错的虚拟机视频教程.