【发布时间】:2019-11-11 01:05:00
【问题描述】:
我目前正在开发一个希望完全独立的 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 文件来设置我的架构,如下所示:
create table guilds(
id BIGINT NOT NULL,
prefix VARCHAR(3) NOT NULL,
PRIMARY KEY(id)
);
然后我可以运行 Gradle 任务来生成一个空的 H2 数据库,其中所有表都已设置好并准备就绪。 Gradle 甚至让我指定这个任务在构建之前运行。在这种情况下,我还可以使用 jOOQ 代码生成,这使得很多事情变得更容易。不过,这一切都发生在编译时,据我所知,我必须将应用程序与一个空的数据库文件打包在一起。当然,这并不能满足我最初想要的单罐愿望。
是否有一种干净、“传统”的方式来做到这一点,或者是以这种方式构建应用程序,而不是在涉及数据库时任何人都会做的事情?
【问题讨论】:
标签: java persistence h2 jooq flyway