使用ibatis插入表1(从表2中选择列),不识别参数值

时间:2019-05-15 17:21:25

标签: java mysql ibatis

我在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#使其工作吗?还是可能还有其他问题?

1 个答案:

答案 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参数的值来自应用程序内部,并且永远不要从网页或其他外部用户界面或应用程序中获取