Пакетная вставка с использованием Groovy Sql?

Как вы можете сделать пакетную вставку, используя Groovy Sql при моделировании подготовленных заявлений? Все примеры, которые я нашел, похожи на следующие и не используют подготовленные операторы.

withBatch  { stmt ->
stmt.addBatch("insert into table (field1,field2) values('value1','value2')")
stmt.addBatch("insert into table (field1,field2) values('value3','value4')")
}

По этой ссылке http://jira.codehaus.org/browse/GROOVY-3504 невозможно использовать подготовленные операторы непосредственно из пакета. Каков наилучший способ симулировать это, чтобы я мог избежать написания собственного кода, чтобы избежать внедрения SQL?

4 ответа

В Groovy 1.8.1 появилась поддержка готовых операторов с пакетной обработкой. Простой пример:

sql.withBatch(20, """update some_table 
                        set some_column = :newvalue 
                      where id = :key """) { ps ->                 
          mymap.each { k,v ->
              ps.addBatch(key:k, newvalue:v)
          }
}

Также смотрите мой пост по теме: http://novyden.blogspot.com/2011/09/groovy-batch-prepared-statement-nice.html

Поддерживается с версии 1.8.1. Вы можете прочитать примечания к выпуску Groovy 1.8.1 для деталей. Просьба проверить документ API для помощи.

Также связана http://jira.codehaus.org/browse/GROOVY-4328.

Из вышесказанного JIRA:

... лучшее, что мы могли бы (просто) сделать, это преобразовать такую ​​строку GString в обычную строку. Для этого мы могли бы сделать немного больше, чем в настоящее время, анализируя String и пытаясь заключать в кавычки или экранировать "выглядящие" строки, но не числа или числа, но не очень элегантно. Обычно мы будем использовать "?" заполнители символов и подготовленное заявление, и было бы гораздо меньше делать

С точки зрения симуляции подготовленных операторов, смотрите Java - escape-строку для предотвращения внедрения SQL

При этом, вы можете применить эвристику из вышеупомянутого и украсить withBatch метод

Owasp ESAPI. https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API

Единственная опция, когда подготовленные операторы и хранимые процедуры НЕ являются опцией, - вручную экранировать ввод пользователя.

ESAPI имеет рабочие, готовые к производству эталонные методы.

Codec ORACLE_CODEC = new OracleCodec();
 String query = "SELECT user_id FROM user_data WHERE user_name = '" + 
   ESAPI.encoder().encodeForSQL( ORACLE_CODEC, req.getParameter("userID")) + "' and user_password = '"
   + ESAPI.encoder().encodeForSQL( ORACLE_CODEC, req.getParameter("pwd")) +"'";

Источник: https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

Другие вопросы по тегам