使用groovy Sql批量插入?

时间:2010-05-17 12:09:31

标签: jdbc groovy batch-processing

如何在模拟预准备语句时使用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 个答案:

答案 0 :(得分:20)

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 :(得分:1)

同样相关的是http://jira.codehaus.org/browse/GROOVY-4328

来自上述JIRA:

  

......我们能做的最好的事情就是   将这样的GString转换为正常值   串。为此,我们可以做一点   比我们目前所做的更多   解析String并尝试引用或   逃避“字符串”看事情但不是   数字或日期看东西,但它   可能不是很优雅。通常我们   会用“?”字符   占位符和准备好的声明   并且会做更少的事情

在模拟准备好的陈述方面,请参阅Java - escape string to prevent SQL injection

话虽如此,您可以应用上面的启发式并装饰withBatch方法

答案 2 :(得分:1)

版本1.8.1支持它。您可以阅读Groovy 1.8.1 release notes了解详情。 请检查API Document寻求帮助。

答案 3 :(得分:0)

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#Databas