(Как) я могу использовать "LIKE" в SQL запросах с MyBatis безопасно и без зависимости от БД?

В MyBatis, вы отмечаете места, где параметры должны быть вставлены в ваш SQL следующим образом:

SELECT * FROM Person WHERE id = #{id}

Этот синтаксис активирует правильное экранирование и т.д., чтобы избежать, среди прочего, атак SQL-инъекций. Если у вас есть доверенный ввод и вы хотите пропустить экранирование, вы можете вставить параметры дословно:

SELECT * FROM {tableName} WHERE id = #{id}

Теперь я хочу выполнить поиск по LIKE на небезопасном вводе, поэтому я хочу сделать следующее:

SELECT * FROM Person WHERE name LIKE #{beginningOfName} || '%'

К сожалению, однако, важные DB-серверы не поддерживают синтаксис || для конкатенации:

MSSQL - нарушает стандарт, используя оператор '+' вместо '||'.

...

MySQL - Нарушает стандарт, переопределяя || в OR.

Итак, я могу сделать либо

SELECT * FROM Person WHERE name LIKE CONCAT(#{beginningOfName}, '%')

и ограничиться, в данном случае, MySQL, либо

SELECT * FROM Person WHERE name LIKE '{beginningOfName}%'

и мне придется санировать ввод самостоятельно.

Есть ли более элегантное решение?

15
задан Hanno Fietz 20 September 2011 в 20:19
поделиться