#java #list #rest #clause
#java #Список #отдых #оговорка
Вопрос:
У меня есть приведенный ниже список
ArrayList<String> list1=new ArrayList<String>();
list1.add("abc");
list1.add("bdc");
list1.add("acr");
list1.add("bde");
Я хотел использовать этот список в запросе выбора, как показано ниже
select * from emp where emp_name in ('abc','bdc','acr','bde')
Я использую шаблон spring boot rest и попробовал использовать ArrayList paramsList =new ArrayList(), но это не удалось. Есть ли простой способ сделать это вместо преобразования в строку с помощью итерации?
Комментарии:
1. Предупреждение: код подвержен атакам SQL-инъекций и синтаксическим ошибкам SQL. Не создавайте SQL, используя конкатенацию строк с текстовыми значениями неопределенного происхождения. Используйте маркеры a
PrepareStatement
и parameter.
Ответ №1:
Вы можете объединить строки в списке, чтобы получить то, что вы хотите:
String values = list1.stream().map(str -> String.format("'%s'", str)).collect(Collectors.joining(","));
И создайте запрос следующим образом:
"select * from emp where emp_name in (" values ")";
Однако, как указал @Andreas, этот подход подвержен атакам SQL-инъекций и синтаксическим ошибкам (если значения в списке содержат зарезервированные ключевые слова SQL или специальные символы). Следовательно, вы должны использовать подготовленные операторы вместо объединения строк, подобных этому.
Комментарии:
1. Предупреждение: код подвержен атакам SQL-инъекций и синтаксическим ошибкам SQL.
2. Правильно. Вот почему я упомянул об использовании
prepared statements
вместо этого.3. Да, но вы не сказали, почему или насколько опасно этого не делать.