Я использую hsqldb для выполнения моих модульных тестов, которым нужен доступ к базе данных.
В настоящий момент, когда я хочу составить таблицу для определенного теста, у меня есть следующий код:
private void createTable() {
PreparedStatement ps;
try {
ps = getConnection().prepareStatement("CREATE TABLE T_DATE (ID NUMERIC PRIMARY KEY, DATEID TIMESTAMP)");
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
getConnection()
метод получает DataSource, определенный в a Spring
контекст:
Теперь, я хочу составить свою таблицу из сценария SQL (конечно, этот сценарий будет содержать больше чем одно создание таблицы):
CREATE TABLE T_DATE_FOO (ID NUMERIC PRIMARY KEY, DATEID TIMESTAMP);
CREATE TABLE T_DATE_BAR (ID NUMERIC PRIMARY KEY, DATEID TIMESTAMP);
...
Я видел в документации HSQLDB, что могу попросить, чтобы он запустил скрипт при запуске. Однако это не отвечает моим требованиям, поскольку я хочу запустить скрипт во времени выполнения.
Конечно, я могу считать файл сам, и для каждого SQL-оператора, я выполняю a ps.executeUpdate()
команда, но я не хочу использовать этот вид решения (кроме того, если нет никакого другого решения).
Какая-либо идея?
поскольку вы уже используете spring, вы можете использовать метод SimpleJdbcUtils.executeSQLScript, который выполняет SQL-скрипт, где операторы разделены точкой с запятой. этот класс находится в модуле spring-test (JAR).
Во-первых, я не знаю последствий этого. Я использовал его давным-давно, и он работал для меня. Класс SQLExec взят из ant.jar, возможно, вы можете заглянуть в исходники ant, чтобы создать свой собственный класс утилиты,
SQLExec sqlExec=new SQLExec();
sqlExec.setUserid("user");
sqlExec.setPassword("passowrd");
sqlExec.setUrl("jdbc:mysql://localhost:3306/dbname");
sqlExec.setDriver("com.mysql.jdbc.Driver");
sqlExec.setProject(new Project());
sqlExec.setSrc(new File("c:/test.sql"));
sqlExec.execute();
У меня была такая же проблема. Я закончил тем, что разбил текстовый файл на: и выполнение каждого оператора отдельно. Это было нормально, потому что у нас не было вставок, поэтому не было точек с запятой внутри операторов. В то время я не нашел простого способа запустить сценарий SQL