检查是否存在H2数据库文件

时间:2018-11-22 06:59:24

标签: java spring spring-boot h2 spring-jdbc

我一直在文件上使用真正简单的H2 DB。我的设置如下:

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的Application类事件侦听器中进行上一个检查。但是,如何获得对数据源URL的引用?我以前是一个配置属性,并已自动加载,但我仍然可以做到这一点,但是它会摆放到位,这很糟糕。

那么确保应用程序启动时此DB文件在那里的散文学家/正确方法是什么? (而且我想以JDBC的方式使用,请不要使用JPA)

1 个答案:

答案 0 :(得分:3)

您可以使用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";
        }
    }

}