Spring Загрузочное приложение с файловой базой H2
Я пытаюсь настроить базу данных H2 при запуске загрузочного приложения spring. Я настроил базу данных в application.properties:
spring.datasource.url = jdbc:h2:file:~/testdb
spring.datasource.username = sa
spring.datasource.password = sa
spring.datasource.driverClassName = org.h2.Driver
Файл Application.java:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
CreateH2Database createH2Database = new CreateH2Database();
createH2Database.create();
}
}
CreateH2Database.java:
public class CreateH2Database {
private Logger log = Logger.getLogger(CreateH2Database.class);
@Autowired
protected JdbcTemplate jdbcTemplate;
public void create() {
log.info("Creating H2 Database");
createUsers();
}
private void createUsers() {
log.info("Creating users table");
jdbcTemplate.execute("create table if not exists users (id serial, first_name varchar(255), last_name varchar(255))");
String[] names = "John Woo;Jeff Dean;Josh Bloch;Josh Long".split(";");
for (String fullname : names) {
String[] name = fullname.split(" ");
log.info("Inserting user record for " + name[0] + " " + name[1] + "\n");
jdbcTemplate.update(
"INSERT INTO users(first_name,last_name) values(?,?)",
name[0], name[1]);
}
}
}
После запуска приложения он должен создать таблицу Users, если она еще не существует, и вставить пользователей в таблицу. Если таблица уже существует, я не хочу, чтобы она была изменена.
- Я получаю
NullPointerException
на jdbcTemplate.execute
. Как я могу ввести jdbcTemplate
? Весь пример, который я видел, требует создания источника данных вручную, а затем создается JdbcTemplate. Однако источник данных в этом примере, по-видимому, создается на основе значений application.properties.
- Это правильный подход к настройке базы данных (т.е. вызов
CreateH2Database
после запуска SpringApplication)? Будет ли этот подход работать, если я хочу запустить приложение как WAR на другом сервере приложений?
Ответы
Ответ 1
Поскольку вы используете Spring Boot, вы должны воспользоваться его возможностями инициализации базы данных. Нет необходимости развертывать собственную реализацию.
Все, что вам нужно сделать, это иметь файлы schema.sql
и data.sql
в корневом пути пути (скорее всего, под /resources
). Spring Boot автоматически обнаружит их и запустит первый, чтобы создать базу данных, а вторую - заполнить ее.
Отметьте эту часть Spring Документация для загрузки
Если вам нужно выполнить инициализацию условно (возможно, только при выполнении интеграционных тестов), вы можете использовать Spring profiles. Что бы вы сделали в этом случае, это иметь файл свойств для тестового профиля, содержащий
spring.datasource.initialize=true
в то время как файл свойств для других профилей будет содержать
spring.datasource.initialize=false