Подтвердить что ты не робот

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 на другом сервере приложений?
4b9b3361

Ответ 1

Поскольку вы используете Spring Boot, вы должны воспользоваться его возможностями инициализации базы данных. Нет необходимости развертывать собственную реализацию.

Все, что вам нужно сделать, это иметь файлы schema.sql и data.sql в корневом пути пути (скорее всего, под /resources). Spring Boot автоматически обнаружит их и запустит первый, чтобы создать базу данных, а вторую - заполнить ее.

Отметьте эту часть Spring Документация для загрузки

Если вам нужно выполнить инициализацию условно (возможно, только при выполнении интеграционных тестов), вы можете использовать Spring profiles. Что бы вы сделали в этом случае, это иметь файл свойств для тестового профиля, содержащий

spring.datasource.initialize=true

в то время как файл свойств для других профилей будет содержать

spring.datasource.initialize=false