使用groovy Sql批量插入?

Jar*_*red 7 groovy jdbc 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')")
}
Run Code Online (Sandbox Code Playgroud)

根据此链接http://jira.codehaus.org/browse/GROOVY-3504,无法直接从批处理中使用预准备语句.模拟这个的最佳方法是什么,所以我可以避免编写自己的代码以避免sql注入?

top*_*hef 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)
          }
}
Run Code Online (Sandbox Code Playgroud)

另请参阅我关于该主题的帖子:http://novyden.blogspot.com/2011/09/groovy-batch-prepared-statement-nice.html

  • 谢谢你的提示!为了让它适用于MySQL InnoDB,我必须在withBatch之前添加"sql.connection.autoCommit = false",并使用"sql.connection.commit()"来使它坚持下去. (2认同)

bti*_*nay 1

相关的还有https://issues.apache.org/jira/browse/GROOVY-4328

从上面的 JIRA 中:

...我们能(简单地)做的最好的事情就是将这样的 GString 转换为普通的 String。为此,我们可以比目前做的更多一些,通过解析字符串并尝试引用或转义“字符串”看起来的东西,而不是数字或日期看起来的东西,但这可能不是很优雅。通常我们会使用“?” 字符占位符和准备好的声明,要做的事情就少得多

关于模拟prepared statements,请参阅Java - 转义字符串以防止SQL注入

话虽这么说,您可以应用上面的启发式方法并装饰该withBatch方法