使用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
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
感谢您的提示!为了让MySQL InnoDB能够正常工作,我必须在withBatch之前加上“sql.connection.autoCommit = false”,然后在“sql.connection.commit()”中加入以保持它。 – Andrew 2011-09-13 04:41:55
你将如何做这个多列? – AnujKu 2015-04-02 21:05:50