带有H2文件数据库的Spring Boot应用程序

时间:2014-07-07 05:44:31

标签: java spring spring-boot

我正在尝试在Spring启动应用程序启动时设置H2数据库。我在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表(如果它尚不存在),并将用户插入表中。如果表已经存在,我不希望它被修改。

  1. 我在NullPointerException上获得jdbcTemplate.execute。如何注入jdbcTemplate?我见过的所有示例都需要手动创建数据源,然后创建JdbcTemplate。但是,此示例中的数据源似乎是基于application.properties值创建的。
  2. 这是设置数据库的正确方法(即在启动SpringApplication后调用CreateH2Database)吗?如果我想在另一个应用程序服务器上将应用程序作为WAR运行,这种方法会起作用吗?

1 个答案:

答案 0 :(得分:48)

由于您使用的是Spring Boot,因此您应该利用它的数据库初始化功能。没有必要推出自己的实现。

您所要做的就是在类路径的根目录中拥有文件schema.sqldata.sql(最有可能在/resources下)。 Spring Boot会自动检测这些并运行第一个以创建数据库,第二个用于填充数据库。

查看Spring引导文档的this部分

如果需要有条件地执行初始化(可能仅在运行集成测试时),您可以利用Spring profiles。在这种情况下,您要做的是让测试配置文件的属性文件包含

spring.datasource.initialize=true

而其他配置文件的属性文件将包含

spring.datasource.initialize=false