Я хочу сгенерировать многорядную вставку sql в Redshift. Согласно документации, это эффективный способ сделать это: https://docs.aws.amazon.com/redshift/latest/dg/c_best-practices-multi-row-inserts.html
insert into category_stage values
(default, default, default, default),
(20, default, 'Country', default),
(21, 'Concerts', 'Rock', default);
Я занимаюсь разработкой в Kotlin и использую jdb c.
Сейчас я делаю оператор create и вручную генерирую строки значения, создавая StringBuilder и добавляя их. Я делаю что-то похожее на это:
private fun mapToSQl(categoryStage: CategoryState): String {
val stringBuilder = StringBuilder("(")
stringBuilder.append(categoryStage.id)
stringBuilder.append(",")
stringBuilder.append("'" + categoryStage.category + "'")
stringBuilder.append(",")
stringBuilder.append("'" + categoryStage.style + "'")
stringBuilder.append(",")
stringBuilder.append("'" + categoryStage.place + "'")
stringBuilder.append(");")
}
private fun generateSql(stages: CategoryStage): String {
return stages.map {
mapToSQl(it)
}.joinToString{
prefix = "insert into category_stage values",
postfix = ";",
separator = ","
}
}
Я знаю, что мой код уязвим для инъекции SQL, но я не смог сгенерировать этот запрос с PrepareStatement.
Вот код, который я использую:
val dataSource = jdbcTemplate.dataSource
val connection = dataSource?.connection
val createStatement = connection!!.createStatement()
bulkInsert = generateSql(stages)
createStatement.addBatch(bulkInsert)
createStatement.executeBatch()
Буду признателен за любую помощь.