我在select mysql查询中使用插入,但是在select语句中,我从Java传递了一个参数(映射)。该查询是使用iBatis框架编写的。查询无法识别select语句中传递的值。
我尝试将#id#
更改为
#{id}
,$id$
,#{id}
和${id}
,但没有成功。
查询如下:
<insert id="someId" parameterClass="map" >
insert into table1(id, column1, column2)
(
select #id#, A.column1, A.column2
from table2 A left outer join table3 B on A.column = B.column
where <condition>
order by column1, column2
)
</insert>
我已将请求参数作为13位长ID发送。 在table1模式中,id的数据类型为bigint(20)。
我希望将传递给查询的任何参数(id)插入表中。
现在的问题是它无法识别#id#
的值。
由于id列约束不为null,因此抛出"MySQLIntegrityConstraintViolationException: Column 'id' cannot be null" after running the above statement.
我应该尝试代替#id#使其工作吗?还是可能还有其他问题?
答案 0 :(得分:1)
在MyBatis中,#{param}
参数是一个“安全”参数,只能替换标量值。为了安全起见,它不能用于向您的SQL语句添加任何免费内容,因此您可以忽略SQL注入问题。即使您尝试可以想到的更令人讨厌的参数值,也仍然可以安全使用,并且晚上可以睡个好觉。
现在,如果您想在SQL中插入任意内容(以生成某种动态SQL)并冒着无法入睡的夜晚,MyBatis为您提供了${param}
参数(您是否发现了区别?)。这些字符串参数直接插入到SQL语句中。使用这种策略,您的查询应如下所示:
<insert id="someId" parameterClass="map" >
insert into table1(id, column1, column2)
(
select ${id}, A.column1, A.column2
from table2 A left outer join table3 B on A.column = B.column
where <condition>
order by column1, column2
)
</insert>
现在,请注意,如果管理不当,此策略很容易受到SQL注入的攻击。确保id
参数的值来自应用程序内部,并且永远不要从网页或其他外部用户界面或应用程序中获取。