异常信息如下:
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书写