java 使用JOOQ动态批量插入SQL查询

j7dteeu8  于 2023-01-15  发布在  Java
关注(0)|答案(1)|浏览(620)

我使用JOOQ动态地构建SQL,因为我更喜欢使用好的旧JDBCTemplate来执行和维护自己的域对象,而不是使用JOOQ生成它们。INSERT INTO my_table(field1, field2, ..., field20) values(<VALUES>);
我想用动态的方式构造这个SQL语句,为了用这种方式构造一个select语句,我使用了SelectQuery和addOrderBy、addConditions、join等方法。
是否有任何方法可以将列名 (即field1、field2、...、field20) 添加到InsertQuery中?我希望执行以下操作:

InsertQuery<Record> insertQuery = ctx.insertQuery(table("my_table"));
insertQuery.addColumns("field1", "field2", ..., "field20");
for (List<Object> values : valuesList) {
    insertQuery.addValues(values);
}
getJdbcTemplate().batchUpdate(insertQuery.getSQL(), insertQuery.getValues(), batchSize);
mkshixfv

mkshixfv1#

您可以使用:

ctx.insertInto(table)
   .columns(columns)
   .valuesOfRows(valuesList.stream().collect(Rows.toRowList(...)))
   .execute();

注意,用jOOQ的术语来说,这不是一个批INSERT语句(多个单独的语句,单个JDBC往返),而是一个批量INSERT语句(单个单独的语句,具有多行),它对应于您所尝试的内容,如果您更喜欢Batch语句,那么只需创建一个如下所示的虚拟INSERT

ctx.insertInto(table)
   .columns(columns)
   .values(Collections.nCopies(n, null))
   .getSQL();

并提取它的SQL,因为您不打算使用jOOQ执行查询,所以不需要将所有绑定值传递给jOOQ,只需要传递给JdbcTemplate。

相关问题