Параметры SQL-запроса в Java
Склеивать пользовательский текст в SQL небезопасно.
Объект PreparedStatement держит шаблон с
местами "?", куда позже кладут значения
типизированными методами setString,
setInt и другими.
Шаблон готовят один раз на соединении, затем
заполняют параметры по номеру, начиная с 1:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
public class Main {
public static void main(String[] args) throws Exception {
try (Connection connection = DriverManager.getConnection("jdbc:sqlite:slots.db")) {
try (Statement statement = connection.createStatement()) {
statement.execute("""
CREATE TABLE IF NOT EXISTS slots (
id INTEGER PRIMARY KEY,
code TEXT NOT NULL,
capacity INTEGER NOT NULL
)
""");
}
PreparedStatement insert = connection.prepareStatement(
"INSERT INTO slots (code, capacity) VALUES (?, ?)"
);
insert.setString(1, "A1");
insert.setInt(2, 12);
System.out.println(insert.executeUpdate());
}
}
}
}
Тот же шаблон можно выполнить с другими аргументами:
достаточно снова вызвать set... и
executeUpdate или executeQuery:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
public class Main {
public static void main(String[] args) throws Exception {
try (Connection connection = DriverManager.getConnection("jdbc:sqlite:slots.db")) {
PreparedStatement 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-текста.