项目场景:
项目中有个sql的功能是更新数据库对应的数据,sql根据入参动态变化
问题描述:
我在mapper.xml文件中写下了这样一段代码,设param为mybatis传入的参数
update payment_order
case a when 1 then set 某字段
when 2 then set 某字段 end
where 具体条件
运行时报错,如标题所示,sql injection violation, token set
原因分析:
原因已经挺清楚的了,这是druid的wall filter对传入的sql进行检测后抛出的异常,由异常中的token set我们可以知道,druid不允许在case语句体中有set语句,这样有sql注入的危险,不允许执行。
解决方案:
1. 可以将set字段的语句放在case语句体外面,
update payment_order set 某字段 =
case a when 1 then x值
when 2 then y值 end
where 具体条件
2. 改用mybatis提供的<choose>标签,将语句改为
update payment_order
<choose>
<when test = "a == 1">
set 某字段 = x
<when/>
<when test = "a == 2">
set 某字段 = y
<when/>
<choose/>
where 具体条件