sql传参数异常,缺少参数传入以及传入参数为null解析报错解析

异常信息如下:

Caused by:java.sql.SOLException: the parameter index is out of range (the number of parameters is 3 >, which is 2

但是名称就是参数需要传入三个参数,却显示只有两个参数
具体sql如下:

Select id, loginacct, userpswd, username, email, createtime  from  t_user
   where loginacct  like '%#{queryText}%' limit  #{startIndex), #(pagesize)

第一眼望过去,一看sql,貌似是三个参数,应该没问题,但是依旧还是报错了,实际上上面只是存在两个参数的传入

'%#{queryText}%'   因为我将参数卸载了单引号当中,此时的queryText已经不再是?占位符作用,失去了我们当初传参数的初衷,导致解析并不是按照我们的想法来进行

 '%#{?}%'   sql语句中是不允许将问号放在引号当中,否则解析出来就是?进行查询。所以上面出错

如何将上面的参数作为问号占位符方式传入我们的sql中:

 '%'${queryText}'%'   以这样的效果对字符串进行拼接   这样就可以将其问号解析出来并且将其拼接一起,达到我们想要的效果

但是出来一个新的问题,可能存在参数为null值,咿呀,那么解析报错如下:

Your MySQL server version for the right  syntax to use near where loginacct  'like '%'null'%'  at line 3

这种情况下,null不可避免,但是又不想让sql语句报错,唯一的办法就是采用动态sql方式,当参数为null时,此时就没必要传入第三个参数,只有当第三个参数不为null值时,才开始传入第三个参数

具体方案如下:   动态sql

<where>
<if test=Test = "queryText / = null">
	loginacct  like '%'${queryText}'%'
</if>
<where>

问题已经解决但是又出现一个新的问题,那么就是我们都知道$与#的区别就是在于一个sql防注入,所以呢,上面的情况无法实现sql防注入,所以 方案进行pass

新的方案就是:

   Select id, loginacct, userpswd, username, email, createtime  from  t_user
       where loginacct  like concat('%',' #{queryText}','% ') limit  #{startIndex), #(pagesize)

concat函数在sql中就是属于拼接作用

完美解决上面sql拼接并且进行了防注入sql书写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值