jdbc - addbatch - ¿Inserción de lote usando Sql maravilloso?
groovy sql (4)
Groovy 1.8.1 introdujo el soporte para declaraciones preparadas con procesamiento por lotes. Ejemplo simple:
sql.withBatch(20, """update some_table
set some_column = :newvalue
where id = :key """) { ps ->
mymap.each { k,v ->
ps.addBatch(key:k, newvalue:v)
}
}
También vea mi publicación sobre el tema: http://novyden.blogspot.com/2011/09/groovy-batch-prepared-statement-nice.html
¿Cómo se puede hacer un inserto por lotes usando Sql maravilloso mientras se simulan las declaraciones preparadas? Todos los ejemplos que he encontrado son similares a los siguientes y no utilizan declaraciones preparadas.
withBatch { stmt ->
stmt.addBatch("insert into table (field1,field2) values(''value1'',''value2'')")
stmt.addBatch("insert into table (field1,field2) values(''value3'',''value4'')")
}
De acuerdo con este enlace http://jira.codehaus.org/browse/GROOVY-3504, no hay forma de usar declaraciones preparadas directamente desde un lote. ¿Cuál es la mejor manera de simular esto para evitar tener que escribir mi propio código para evitar la inyección de sql?
Owasp ESAPI. https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API
Su única opción cuando las declaraciones preparadas y los procesos almacenados NO son una opción, es escaparse manualmente de la entrada del usuario.
ESAPI tiene métodos de referencia listos para la producción y de producción.
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")) +"''";
Fuente: https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet#Databas
Es compatible desde la versión 1.8.1. Puede leer las notas de la versión de Groovy 1.8.1 para más detalles. Pls verifique el documento API para obtener ayuda.
También relacionado es http://jira.codehaus.org/browse/GROOVY-4328 .
De la JIRA anterior:
... lo mejor que podemos (simplemente) hacer es convertir un GString a un String normal. Para eso, podríamos hacer un poco más de lo que hacemos actualmente al analizar el String e intentar citar o escapar de las "cuerdas" buscando cosas, pero no el número o la fecha buscando cosas, pero puede que no sea muy elegante. Normalmente, usaríamos el "?" marcadores de posición de caracteres y una declaración preparada y tendrían mucho menos que hacer
En términos de simulación de declaraciones preparadas, vea Java - cadena de escape para evitar la inyección SQL
Dicho esto, podría aplicar una heurística de los anteriores y decorar el método withBatch