我是Groovy (2.4.7)
的新手,这就是我想做的事情。基本上,目标是将数据从Excel加载到SQL Server。有两个列表,一个是密钥,另一个是值。如何调用这两个列表来运行批处理SQL语句?
这是我到目前为止所做的:
def k = [Field1,Field2,Field3,Field4,Field5]
def Value1 = 1
def Value2 = 2
def Value3 = 3
def Value4 = 4
def Value5 = 5
def v = [Value1,Value2,Value3,Value4,Value5]
def query = """\
INSERT INTO TableA
($k)
VALUES
($v)
"""
sql.withTransaction {
sql.withBatch(20) {stmt ->
stmt.addBatch(query)
}
}
通过这种方式,似乎Groovy会将整个列表视为一个大字符串。我可以将列表输出为字符串并删除单引号,但这似乎并不酷。我们可以参数化列表中的字段吗?
对于k列表,我是否需要为下面的所有字段设置单引号,因为它给了我错误:
def k = ['Field1','Field2','Field3','Field4','Field5']
我知道字段名称应该是字符串,但下面的方法是一次运行一个SQL查询。我觉得修改列表比搞乱查询更好。但如果我不这样做,请阻止我。
def query = """\ INSERT INTO TableA (Field1,Field2,Field3,Field4,Field5) VALUES (${Value1},${Value2},${Value3},${Value4},${Value5}) """ sql.execute(query)
我甚至可以将这两个列表添加到地图中(见下文)。这是运行批量查询的更好方法吗?我只是不知道如何在这个项目中使用地图。
def m = [k, v].transpose().collectEntries {it}
当然,我提出的方法可能并不理想,我也希望防止任何SQL注入。如果您能为我提供示例代码,我愿意接受任何最佳实践。再次感谢您的时间和帮助。
答案 0 :(得分:0)
好的,这是我已经想到的并且它有效。这也适用于动态字段。从我到目前为止所学到的,由于SQL注入,这可能不是一个好的答案,但这只是在内部使用authroized人。但欢迎任何人的意见来改进这种方法。
def sheet1 // Need to read in your Excel sheet
def sql = Sql.newInstance(// Your SQL connection config)
def tableName = "TableA"
def k = ['Field1','Field2','Field3','Field4','Field5']
// Code below is from http://stackoverflow.com/questions/20150880/insert-a-hashmap-into-any-database-table/20151521#20151521
StringBuilder query = new StringBuilder("INSERT INTO ").append(tableName).append(" (")
StringBuilder placeholders = new StringBuilder()
for (Iterator<String> iter = k.iterator(); iter.hasNext();) {
query.append(iter.next())
placeholders.append("?")
if (iter.hasNext()) {
query.append(",")
placeholders.append(",")
}
}
query.append(") VALUES (").append(placeholders).append(")")
sql.withTransaction {
sql.withBatch(20, query.toString()) {ps ->
sheet1.each {data ->
def Value1 = 1
def Value2 = 2
def Value3 = 3
def Value4 = 4
def Value5 = 5
def v = [Value1,Value2,Value3,Value4,Value5]
ps.addBatch(v)
}
}
}
sql.close()