【问题标题】:Batch insert using groovy Sql?使用groovy Sql批量插入?
【发布时间】:2011-02-20 09:19:39
【问题描述】:

如何在模拟准备好的语句时使用 groovy Sql 进行批量插入?我找到的所有示例都与以下类似,并且不使用准备好的语句。

withBatch  { stmt ->
stmt.addBatch("insert into table (field1,field2) values('value1','value2')")
stmt.addBatch("insert into table (field1,field2) values('value3','value4')")
}

根据此链接https://issues.apache.org/jira/browse/GROOVY-3504,无法直接从批处理中使用准备好的语句。模拟这种情况的最佳方法是什么,这样我就可以避免编写自己的代码来避免 sql 注入?

【问题讨论】:

    标签: jdbc groovy batch-processing


    【解决方案1】:

    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

    【讨论】:

    • 感谢您的提示!为了让它适用于 MySQL InnoDB,我必须在 withBatch 之前添加“sql.connection.autoCommit = false”,并添加“sql.connection.commit()”以使其生效。
    • 你将如何处理多个列?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      同样相关的是https://issues.apache.org/jira/browse/GROOVY-4328

      从上面的JIRA:

      ...我们能(简单地)做的最好的事情就是 将这样的 GString 转换为普通的 细绳。为此我们可以做一点 比我们现在做的多一点 解析字符串并尝试引用或 逃避“字符串”看起来的东西,但不是 数字或日期看起来的东西,但它 可能不是很优雅。通常我们 会使用“?”特点 占位符和准备好的语句 并且要做的事情要少得多

      模拟prepared statements方面,见Java - escape string to prevent SQL injection

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

      【讨论】:

        【解决方案4】:

        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

        【讨论】:

          猜你喜欢
          • 2011-06-17
          • 1970-01-01
          • 1970-01-01
          • 2010-09-24
          • 2016-01-31
          • 2013-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多