H2数据库,有没有办法重新加载过去的数据?

H2 database, is there any way to reload past data?

有没有办法在服务器宕机后重新加载过去的数据?

我认为我必须将数据保存为文件类型,所以我输入 url 添加了 ':file:' 并且我可以找到一个数据库文件 (databasename.mv.db)。但是每次我重新连接时,文件都被覆盖了。如果有人知道如何处理,请告诉我。

我喜欢在初始开发阶段执行此操作/将测试数据加载到应用程序中的方法是将数据存储在 CSV 文件中,然后在 spring-boot 应用程序启动时将其加载到 H2 中使用如下所示的 ContextRefreshedEvent:

@Component
public class RootVerbLoader implements ApplicationListener<ContextRefreshedEvent> {

private static final int SOURCE_LANGUAGE = 1;
private static final int TARGET_LANGUAGE = 2;
private RootVerbRepository repo;

@Autowired
public void setRepo(RootVerbRepository repo) {
    this.repo = repo;
}

@Override
public void onApplicationEvent(ContextRefreshedEvent arg0) {

    loadDataFromCSV("classpath:hanasu.csv", "to speak", "はなす");
    loadDataFromCSV("classpath:iku.csv", "to go", "いく");
    loadDataFromCSV("classpath:iu.csv", "to say", "いう");
    loadDataFromCSV("classpath:kaku.csv", "to write", "かく");
    loadDataFromCSV("classpath:kasegu.csv", "to earn", "かせぐ");
    loadDataFromCSV("classpath:kuru.csv", "to come", "くる");
    loadDataFromCSV("classpath:matsu.csv", "to wait", "まつ");
    loadDataFromCSV("classpath:miru.csv", "to look", "みる");
    loadDataFromCSV("classpath:naru.csv", "to become", "なる");
    loadDataFromCSV("classpath:nomu.csv", "to drink", "のむ");
    loadDataFromCSV("classpath:shinu.csv", "to die", "しぬ");
    loadDataFromCSV("classpath:suru.csv", "to do", "する");
    loadDataFromCSV("classpath:yobu.csv", "to call", "よぶ");
}

private void loadDataFromCSV(String filename, String source, String target) {

    Set<TranslationPair> conjugations = new HashSet<>();

    try {

        ResultSet rs = new Csv().read(filename, null, null);
        int i = 1;
        while (rs.next()) {
            conjugations.add(
                new TranslationPair(
                    rs.getString(SOURCE_LANGUAGE),
                    rs.getString(TARGET_LANGUAGE),
                    i
                )
            );
            i++;
        }

        rs.close();

    } catch(SQLException se) {
        se.printStackTrace();
    }

    repo.save(new RootVerb(source, target, conjugations));
}

}

将数据写出到 CSV 文件的代码也非常简单:

SimpleResultSet rs = new SimpleResultSet();
rs.addColumn("NAME", Types.VARCHAR, 255, 0);
rs.addColumn("EMAIL", Types.VARCHAR, 255, 0);
rs.addRow("Bob Meier", "bob.meier@abcde.abc");
rs.addRow("John Jones", "john.jones@abcde.abc");
new Csv().write("data/test.csv", rs, null);

我发现这提供了一种非常快速的方法来原型化数据结构/table 模式,而无需编写任何 sql 脚本或做很多工作。上手真快。