Groovy - 使用地图或列表进行批量查询

时间:2016-11-08 15:22:17

标签: groovy

我是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)
    }
}
  1. 通过这种方式,似乎Groovy会将整个列表视为一个大字符串。我可以将列表输出为字符串并删除单引号,但这似乎并不酷。我们可以参数化列表中的字段吗?

  2. 对于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)
    
  3. 我甚至可以将这两个列表添加到地图中(见下文)。这是运行批量查询的更好方法吗?我只是不知道如何在这个项目中使用地图。

    def m = [k, v].transpose().collectEntries {it}

  4. 当然,我提出的方法可能并不理想,我也希望防止任何SQL注入。如果您能为我提供示例代码,我愿意接受任何最佳实践。再次感谢您的时间和帮助。

1 个答案:

答案 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()