从纯Java生成jOOQ类

der*_*ink 5 java ddl code-generation database-schema jooq

有没有办法从纯Java代码生成jOOQ类?如果没有,最接近的替代方案是什么?理想情况下,我想在gradle构建中执行此操作.

我找到了这个答案,链接到这篇博文.这篇文章的精髓是这样的:

  1. 从JPA模型开始
  2. 将其转换为DDL脚本(.sql文件中充满了CREATE语句)
  3. 创建一个新的HSQLDB文件,并通过在其上运行该DDL脚本来填充表.将生成的数据库保存到磁盘.
  4. 从磁盘加载该DB并在其上运行jOOQ代码生成
  5. 使用生成的生成的jOOQ类.

关于这种方法有三件事让我困扰:

  • 那篇博文在Maven(&Ant)中完成了所有工作.我想使用Gradle,但我可以解决这个问题.
  • 我必须从JPA开始.我更喜欢从我的架构的纯jOOQ定义开始.jOOQ是否有模式定义DSL/API?
  • 作为最终产品,不需要中间步骤(DDL脚本和HSQLDB创建).相反,他们只需要将JPA模型转换为jOOQ理解为输入的东西.应该有一个更整洁(仅限Java)的方式,即使jOOQ没有自己的架构定义API.有吗?

gga*_*zor 4

Jooq 需要预先创建一些表。您可以使用 Flyway(并且您也应该使用它的迁移)。

拥有所有表后,您可以使用此代码片段让 Jooq 为您的表生成源文件:

import org.jooq.util.GenerationTool;
import org.jooq.util.jaxb.*;

Configuration configuration = new Configuration()
    .withJdbc(new Jdbc()
        .withDriver("org.postgresql.Driver")
        .withUrl("jdbc:postgresql://localhost/your_database")
        .withUser("username")
        .withPassword("password"))
    .withGenerator(new Generator()
        .withName("org.jooq.util.DefaultGenerator")
        .withDatabase(new Database()
                .withName("org.jooq.util.postgres.PostgresDatabase")
                .withIncludes(".*")
                .withSchemata(new Schema().withInputSchema("your_schema"))
        )
        .withTarget(new Target()
            .withPackageName("jooq.generate")
            .withDirectory("src/main/java")));
try {
  GenerationTool.generate(configuration);
} catch (Exception e) {
  e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

这将.javasrc/main/java path. 使用您的数据库设置等配置片段。

这大致就是我们在工作项目中做事的方式。Jooq 与Flyway配合得非常好。你可以查看Jooq关于代码生成的文档。

有一个我们不使用的 Maven 插件,因为我们有一个多租户设置,需要对数据库迁移和代码生成进行一些运行时配置。

我想一旦你在某个类的静态 main 方法中准备好了 Jooq 生成,你就可以从 gradle 任务运行它。我只能向您指出 Jooq 的关于从 gradle 运行它的文档

编辑:好奇地查看文档和我自己生成的代码后,我发现您可以扩展RecordTableImpl<Record>类来生成手动创建的模式类。

您可以在此处看到有关Record和类的重要部分的小示例片段Table

无论如何,请考虑到 Jooq(和 Flyway)并不希望您避免 SQL,而是拥抱它。正常的做事方式是

  1. 您使用 SQL 脚本创建数据库对象
  2. 您使用 Jooq 生成器来生成模式类
  3. 您可以将它们与 Jooq 的 DSL 上下文一起使用。