Вставить в таблицу1 (выбрать столбцы из таблицы2), используя ibatis, не распознавая значение параметра - PullRequest
0 голосов
/ 15 мая 2019

Я использую вставку в запрос SELECT MySQL, но в операторе выбора я передаю параметр (карту) из Java.Этот запрос написан с использованием фреймворка iBatis.Запрос не распознает переданное значение в операторе выбора.

Я попытался изменить #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-значного длинного идентификатора.В схеме table1 id имеет тип данных bigint (20).

Я хочу, чтобы любой параметр (id), который я передаю в запрос, был вставлен в таблицу.

Теперь проблемаявляется то, что он не распознает значение #id#.Поскольку ограничение столбца id не является нулевым, оно выдает "MySQLIntegrityConstraintViolationException: Column 'id' cannot be null" after running the above statement.

Что мне следует попробовать вместо # id #, чтобы оно заработало?Или это может быть какая-то другая проблема?

1 Ответ

1 голос
/ 15 мая 2019

В 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 находится внутри вашего приложения и НИКОГДА не извлекается из веб-страницы или другого внешнего пользовательского интерфейса или приложения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...