当前位置: 首页 > 知识库问答 >
问题:

Groovy -使用映射或列表的批量查询

谯翔
2023-03-14

我对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)
    }
}

> < li>

通过这样做,似乎Groovy会将整个列表视为一个大字符串。我可以将列表输出为字符串,并删除单引号,但这似乎并不酷。我们能参数化列表中的字段吗?

对于k列表,我是否需要对所有字段使用单引号,如下所示,因为它给了我错误:

< code>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)

我甚至可以将这两个列表添加到地图中(见下文)。这会是运行批处理查询的更好方法吗?我只是不知道如何在这个项目中使用地图。

< code>def m = [k,v]。转置()。收集条目{it}

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

共有1个答案

秦飞航
2023-03-14

好的,这是我想出的,它起作用了。这也适用于动态字段。据我所知,到目前为止,由于SQL注入,这可能不是一个好的答案,但这只是在授权人内部使用。但是欢迎任何人的意见来改进这个方法。

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()
 类似资料:
  • 我有一个实体,看起来像这样: 输入数据是一个

  • 的默认行为 mapper() 在映射的 Table 到映射的对象属性中,每个属性都根据列本身的名称命名(特别是 key 属性 Column )这种行为可以通过几种方式进行修改。 从属性名称清楚地命名列 默认情况下,映射与 Column 与映射属性的相同-具体来说,它与 Column.key 属性对 Column ,默认与 Column.name . 指定给映射到的python属性的名称 Colum

  • 我如何在下面的场景中使用Mapstruct进行bean映射。 现在我想把sourceId映射到targetId,courseName映射到subjectName,studentName映射到memberName(list到list)。

  • 问题内容: 映射双向列表时,我不了解Hibernate的行为。Hibernate生成的SQL语句对我来说并不是最佳的。有人可以启发我吗? 情况如下:我有一对多的父子关系。我将此关系与双向列表映射。 根据《Hibernate注释参考指南》(第7章:与索引集合的双向关联),映射应如下所示: 但是在这种情况下,Hibernate在保留一个孩子的父母时会产生三个SQL语句: 第三条语句似乎是多余的,因为并

  • 问题内容: 如何在Hibernate中映射整数列表? 像这样: 问题答案: 使用@ElementCollection映射。参阅文件

  • 问题内容: 我正在使用Hibernate 3.3和PostgreSQL 8.x,并希望使用Hibernate批注来映射不是主键的自动增量列。 只要该列是由数据库而不是由Hibernate自动递增的,则在Postgres中使用SERIAL类型或序列映射该列都没有关系。我尝试了以下映射,但它们始终生成空的orderId。 我将不胜感激。 谢谢 问题答案: 以下映射应该可以正常工作: 但是请注意,刷新会