java-H2 DB:如何检查表模式是否以编程方式初始化?

我有一个数据库架构,该架构创建多个表并用数据填充它们.我想检查在应用启动过程中数据库是否包含相应的表.我可以检查db文件是否存在,但是如果它不存在,H2将创建db.因此,我认为唯一的方法是检查表是否存在.

这是我初始化数据库的代码:

Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:database/svc", "sa", "");

Statement st = conn.createStatement();
st.execute("CREATE TABLE IF NOT EXISTS table1 (id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, name VARCHAR(100), record INT, record_date DATE, UNIQUE(name))");
st.execute("CREATE TABLE IF NOT EXISTS table2 (id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, name VARCHAR(100), record INT, record_date DATE, UNIQUE(name))");
st.execute("CREATE TABLE IF NOT EXISTS daily_record_stat (id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, date DATE, table1_id INT, table1_record INT, table2_id INT," +
            " table2_record INT, total_record INT);");
st.execute("ALTER TABLE daily_record_stat ADD FOREIGN KEY (table1_id) REFERENCES table1(id);");
st.execute("ALTER TABLE daily_record_stat ADD FOREIGN KEY (table2_id) REFERENCES table2(id);");
st.execute("INSERT INTO table1 VALUES(1, 'non_existed_stub', 0, NULL)");
st.execute("INSERT INTO table2 VALUES(1, 'non_existed_stub', 0, NULL)");

conn.close();

如您所见,在使用IF NOT EXISTS语句创建之前,我检查表是否存在.但是后来我遇到了ALTER和INSERT的问题-这些命令不允许使用IF.

我尝试执行以下操作:

Connection conn = DriverManager.getConnection("jdbc:h2:database/svc", "sa", "");
ResultSet meta = conn.getMetaData().getTables(null, null, "table1", null);
if(meta.next()) {
    //do something
}

但是meta.next()是错误的.

那么如何检查表模式是否已初始化?还是应该以其他方式完成?

解决方法:

不确定通过编程方式进行检查是否意味着要购买,您可以尝试使用DatabaseMetaData.getTables().该调用将返回ResultSet,您必须以编程方式对其进行检查.您可以在相应的结果部分here中查看此ResultSet中返回的字段.元数据本身可以通过conn.getMetaData()获得.

以下代码应返回名称以“ TABLE”开头的所有表:

ResultSet meta = conn.getMetaData().getTables(null, null, "TABLE%", new String[]{"TABLE"});
while (meta.next()) {
     System.out.println(meta.getString(3));
}

请注意,您必须以大写形式指定表名称模式.传递所需的表类型也很不错,尽管它是可选的.

上一篇:java-在Spring Boot中的同一pom.xml中管理H2和Postgres


下一篇:一个空的结果集上的Spring Data JPA聚合函数