Проверьте, существует ли файл H2 db - PullRequest
0 голосов
/ 22 ноября 2018

Я использовал настоящую простую базу данных H2 для файла.У меня была такая настройка:

Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:"+dbFileName);
Statement stat = conn.createStatement();

, и при запуске приложения я просто делал бы:

File dbFile = new File("~/mydb.db");
if(!dbFile.exists()) {
   String sql = -create my table here, etc...
}

Но сейчас я пытаюсь сделать это в «правильном» Spring Bootпуть.Итак, у меня есть файл application.properties, который содержит это:

# H2
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.datasource.url=jdbc:h2:file:~/mydb.db
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver

И я пытаюсь использовать способ JdbcTemplate / Dao.Но мне нужно проверить, есть ли БД при запуске.Поэтому я хочу сделать свою предыдущую проверку в прослушивателе событий классов приложения для ApplicationReadyEvent.Но как мне получить ссылку на URL источника данных?У меня было свойство конфигурации ранее, и он был автоматически загружен, и я все еще мог это сделать, но это было бы в некоторых местах, и это было бы плохо.

Итак, каков эссеистический / правильный способ убедиться, что этот файл БД присутствует при запуске приложения.(и я хочу это способом JDBC, пожалуйста, без JPA)

1 Ответ

0 голосов
/ 22 ноября 2018

Вы можете использовать ApplicationListener , а затем проанализировать значение spring.datasource.url:

import java.io.File;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class MyApplicationListener implements ApplicationListener<ApplicationStartedEvent> {

    @Value("${spring.datasource.url}")
    private String databaseUrl;

    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        System.out.println("Application started");
        String path = databaseUrl.replace("jdbc:h2:file:", "");
        System.out.println(path);
        File dbFile = new File(path);
        if (!dbFile.exists()) {
            String sql = "etc";
        }
    }

}
...