Mybatis使用模糊查询预编译占位符以及%的故事

本文探讨了在MyBatis中实现模糊查询时遇到的问题及解决方案。通过对比不同字符串拼接方式,阐述如何避免SQL注入风险同时保持查询的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模糊查询的时候使用%表示模糊位置;正常sql没什么问题
但是一设计到字符串拼接就出问题了

<if test='country!=null'> AND '#{country}%')</if>

这里会提示传入了一个参数但是只找到0个占位符,因为‘ ’单引号直接把里面转换成了字符导致无法找到对应的占位符

后来改成了:

<if test='country!=null'> AND #{country}'%')</if>

这样虽然不报错,但是无论如何都搜不出数据来;

也可以使用:

<if test='country!=null'> AND '${country}%')</if>

勉强能用,但是会引发sql注入问题;

最终方案:
concat(str,str,str,......)

<if test='country!=null'> AND concat(#{country},'%')</if>

这样可以把多个字符拼接在一起,所以可以使用#{}占位而不引发sql注入问题;
问题就解决了;这样的方法也可以使用${}需要注意的是单引号要把占位部分也包裹起来;
不推荐:

<if test='country!=null'> AND concat('${country}','%')</if>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值