Java 在运行时从头开始设置数据库

Java 在运行时从头开始设置数据库,java,persistence,h2,jooq,flyway,Java,Persistence,H2,Jooq,Flyway,我目前正在开发一个Java数据库应用程序,我希望它是完全自包含的(即单个.jar文件和一个配置文件,没有其他内容)。这是一个非常小的项目,我没有像商业代码库那样的奇特的构建管道和额外的应用程序数据,因此需要一个简单的单jar解决方案 实现这一目标的一部分包括在应用程序中嵌入H2,并在运行时设置数据库。然而,我不确定如何在这个用例中应用我想要的模式。让我们以这个表为例 +-------------+------------+----------+---------+ | Column name |

我目前正在开发一个Java数据库应用程序,我希望它是完全自包含的(即单个.jar文件和一个配置文件,没有其他内容)。这是一个非常小的项目,我没有像商业代码库那样的奇特的构建管道和额外的应用程序数据,因此需要一个简单的单jar解决方案

实现这一目标的一部分包括在应用程序中嵌入H2,并在运行时设置数据库。然而,我不确定如何在这个用例中应用我想要的模式。让我们以这个表为例

+-------------+------------+----------+---------+
| Column name | Data type  | Nullable | Default |
+-------------+------------+----------+---------+
| id          | BIGINT     | FALSE    | -       |
| prefix      | VARCHAR(3) | FALSE    | 'g!'    |
+-------------+------------+----------+---------+
到目前为止,这里是我的两个解决方案

使用jOOQ以编程方式布局表:

try (DSLContext ctx = DSL.using(dataSource, SQLDialect.MYSQL)) {
    ctx.createTableIfNotExists("guilds")
        .column("id", SQLDataType.BIGINT.nullable(false))
        .column("prefix", SQLDataType.VARCHAR(3).nullable(false).defaultValue("g!"))
        .constraint(constraint("PK_GUILDS").primaryKey(field("id")))
        .execute();
}
当然,在这个用例中,我不能使用jOOQ的代码生成,因为没有什么可以生成类。这是可行的,并且完全是编程的,但是它非常丑陋,并且用静态导入阻塞了类。扩展它以添加更多的表和/或列是一件痛苦的事情,这会使代码更不可读

我试过的另一件事是Flyway,它非常简单,没有那么可怕。我只需要一个小的
.sql
文件来设置我的模式,如下所示:

创建表公会(
id BIGINT不为空,
前缀VARCHAR(3)不为空,
主键(id)
);
然后我可以运行一个Gradle任务来生成一个空的H2数据库,其中所有的表都已经设置好并准备就绪。Gradle甚至允许我在构建之前指定要运行的任务。在这种情况下,我还可以使用jOOQ代码生成,这使很多事情变得更简单。但这一切都发生在编译时,据我所知,我必须用一个空数据库文件打包应用程序。当然,这并不能满足我最初想要的单个罐子的愿望


有没有一种干净的、传统的方法可以做到这一点,或者说,以这种方式构建应用程序并不是任何人在涉及数据库时都会做的事情?

您应该使用Spring–Data,让它为您完成工作。在应用程序属性中设置数据源。您可以创建实体(带注释的类)和存储库。一旦完成并假装正在使用hibernate,就可以在应用程序属性中放置一个属性,如
“hibernate.hbm2ddl.auto”,“create drop”
。这将自动为您创建并删除数据库。不需要额外的代码。还有更多类似这样的配置选项。您可以在手册中找到它们。

从jOOQ的角度来看,我们强烈建议您选择,或类似的产品。这样做的原因是,当您的项目增长时,您将非常乐意选择一条完全控制模式演变的路径,而不是让第三方产品为您管理模式演变,并且jOOQ集成可以轻松地工作


您以前尝试过的jOOQ DDL API当然也可以工作,例如,当您将此API与Flyway或类似API一起使用时。即使有多个模块作为输入,您仍然可以生成一个jar作为输出。例如,您可以使用来生成这个罐子。这个特定的构建约束不应该成为您决定如何管理数据库模式的驱动因素。

我肯定将Spring作为解决方案。这一切都是在运行时发生的吗?是的,当您的spring应用程序启动时,您可以看到神奇的事情发生;)这适用于快速设置,但这种方法如何帮助数据库模式在高效后发展?我想说,这会导致更为复杂的问题……你可以禁用
create
drop