使用groovy Sql进行批量插入?

使用groovy Sql进行批量插入?

问题描述:

如何在模拟预处理语句时使用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注入?

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

从上面的JIRA:

...我们可能(只是)做的最好的是 转换这样一个GString的正常 字符串。为此,我们可以做一点点 位比我们目前做更多 解析字符串和尝试报价或 转义“字符串”看东西,但不是 号码或日期看东西,但它 可能不会很优雅。通常我们 会使用“?”性格 占位符和一个准备好的声明 和将有更不要

在模拟预处理语句方面,见Java - escape string to prevent SQL injection

话虽这么说,你可以从上面的应用启发式和装饰withBatch方法

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

+2

感谢您的提示!为了让MySQL InnoDB能够正常工作,我必须在withBatch之前加上“sql.connection.autoCommit = false”,然后在“sql.connection.commit()”中加入以保持它。 – Andrew 2011-09-13 04:41:55

+0

你将如何做这个多列? – AnujKu 2015-04-02 21:05:50

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

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