Параметры SQL-запроса в Kotlin
Склеивать пользовательский текст в SQL небезопасно.
Объект PreparedStatement держит шаблон с
местами "?", куда позже кладут значения
типизированными методами setString,
setInt и другими.
Шаблон готовят один раз на соединении, затем
заполняют параметры по номеру, начиная с 1:
import java.sql.DriverManager
fun main() {
DriverManager.getConnection("jdbc:sqlite:slots.db")
.use { connection ->
connection.createStatement().use { statement ->
statement.execute(
"""
CREATE TABLE IF NOT EXISTS slots (
id INTEGER PRIMARY KEY,
code TEXT NOT NULL,
capacity INTEGER NOT NULL
)
"""
)
}
val insert = connection.prepareStatement(
"INSERT INTO slots (code, capacity) VALUES (?, ?)"
)
insert.setString(1, "A1")
insert.setInt(2, 12)
println(insert.executeUpdate())
}
}
Тот же шаблон можно выполнить с другими аргументами:
достаточно снова вызвать set... и
executeUpdate или executeQuery:
import java.sql.DriverManager
fun main() {
DriverManager.getConnection("jdbc:sqlite:slots.db")
.use { connection ->
val insert = connection.prepareStatement(
"INSERT INTO slots (code, capacity) VALUES (?, ?)"
)
insert.setString(1, "B2")
insert.setInt(2, 8)
insert.executeUpdate()
insert.setString(1, "C3")
insert.setInt(2, 20)
insert.executeUpdate()
}
}
Создайте таблицу crates в dock.db
и добавьте строку с меткой "K9" и весом
15 через шаблон с двумя "?".
Добавьте ещё одну строку с меткой "L1"
и весом 22 тем же шаблоном без
пересборки SQL-текста.