【问题标题】:Spring Boot application with H2 file database带有 H2 文件数据库的 Spring Boot 应用程序
【发布时间】:2014-08-27 12:43:05
【问题描述】:

我正在尝试在 Spring Boot 应用程序启动时设置 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]);
            }
        }
    }

一旦应用程序启动,它应该创建用户表(如果它不存在),并将用户插入到表中。如果表已经存在,我不希望它被修改。

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

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

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

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

    查看 this Spring Boot 文档的一部分

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

    spring.datasource.initialize=true

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

    spring.datasource.initialize=false

    【讨论】:

    • 感谢您的回复。我尝试添加 schema.sqldata.sql 文件。但是,这将在每次启动应用程序时从data.sql 加载数据。如果尚未填充数据以添加它,我需要触发它。有没有办法在启动时指定类似的条件?
    • 如果我有单元测试和集成测试并且想要同时运行这两个测试怎么办?目前我可以运行几个集成测试,但是当我添加一个单元测试时它失败并告诉我表已经存在。
    • @tobi 很高兴看到您的案例到底是什么样子。您能否创建一个包含所有相关详细信息的新问题并在此处发布链接?谢谢
    猜你喜欢
    • 2016-07-25
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2023-03-24
    • 2020-11-07
    • 2017-09-01
    相关资源
    最近更新 更多