Jdbc java或groovy将映射插入数据库

Jdbc java或groovy将映射插入数据库,jdbc,groovy,Jdbc,Groovy,我有这样的代码 def myMap = [key1 : val1, key2 : val2] sql.executeInsert("Insert into tableName(key1, key2) Values(?, ?)", myMap) 我想创建一个方法,该方法将对我传入的任何映射执行此操作。与中一样,它应该能够创建具有键到值的正确映射的insert语句,并且最重要的是sql注入安全。但是我能找到的所有插入的例子要么不是注射安全的,要么是硬编码到特定的值 例如,下面是一个以非注射安全方

我有这样的代码

def myMap = [key1 : val1, key2 : val2]

sql.executeInsert("Insert into tableName(key1, key2) Values(?, ?)", myMap)
我想创建一个方法,该方法将对我传入的任何映射执行此操作。与中一样,它应该能够创建具有键到值的正确映射的insert语句,并且最重要的是sql注入安全。但是我能找到的所有插入的例子要么不是注射安全的,要么是硬编码到特定的值


例如,下面是一个以非注射安全方式进行操作的示例,

您应该能够执行以下操作:

import groovy.sql.*

def myMap = [key1 : 'val1', key2 : 'val2']

def generateSql(Map map) {
    Closure<String> keys = { -> map.keySet().collect { Sql.expand(it) }.join(', ') }
    Closure<String> values = { -> map.keySet().collect { ":${it}" }.join(', ') }
    "insert into tablename(${keys()}) values(${values()})"
}

sql.executeInsert(generateSql(myMap), myMap)

这可能有帮助:。一旦知道了键,就可以构造语句并绑定参数您不能在JDBC中绑定列标识符,只能绑定列值。列ID也是作为用户输入的吗,或者为什么不能将它们连接到查询字符串?@MickMnemonic列ID是从外部输入的,我不想只连接它们,因为这不是sql注入安全的。例如,如果其中一个值中有一个撇号,我的代码可能会中断。事实上,这就是我从发布的链接运行代码时发生的情况。此解决方案如何清理sql的可能重复?请参阅命名参数和顺序参数,这很有意思,这很好地解释了sql.expand,它最初令人困惑。谢谢扩展器对我不起作用,所以我把它拿出来,它仍然有效。到目前为止,它正在处理我对它的所有恶意攻击。