java - JOOQ 多个配置文件

标签 java mysql jooq

最近我开始使用 jooq 作为我的 java 项目的数据库层。这是我的组织,我们的应用程序数据库有不同的数据库名称(即 DevOps 管道)。

请考虑以下信息:

  • 假设我的应用名称是 MY_APPLICATION
  • 假设MY_APPLICATION使用数据库MY_DB(这是基于MySQL的,里面有一些表)。

让我们考虑以下用于部署 MY_APPLICATION 的信息:

  • 每当我们在开发配置文件中部署时,我们原来的 MY_DB 将变为 DEV_MY_DB(只需更改数据库名称,表相同)。
  • 每当我们在阶段配置文件中进行部署时,我们原来的 MY_DB 都会变成 STG_MY_DB。
  • 每当我们在生产配置文件中进行部署时,我们原来的 MY_DB 都会变成 PROD_MY_DB。

我想在构建时从 JOOQ 实现 MY_DB 代码生成(通过 Jenkin 构建作业)。如果我在开发配置文件上构建MY_APPLICATION,JOOQ应该为模式名称DEV_MY_DB生成数据库类。对于阶段和产品也是如此。

这是我正在使用的 JOOQ 代码生成实用程序。

  public static void init(String p_catalog_name, String p_schema_name, String p_db_username,
  String p_db_password, String p_db_url) {

Target l_target = new Target();
l_target.setDirectory("IdeaProjects/paas/css/src/main/java");
l_target.setPackageName("com.myorg.paas.css.db.entity");
Configuration configuration =
    new Configuration()
        .withJdbc(
            new Jdbc()
                .withDriver("com.mysql.cj.jdbc.Driver")
                .withUrl(p_db_url)
                .withUser(p_db_username)
                .withPassword(p_db_password)
        )
        .withGenerator(
            new Generator()
                .withDatabase(
                    new Database()
                        .withName("org.jooq.meta.mysql.MySQLDatabase")
                        .withIncludes(".*")
                        .withExcludes("")
                        //.withInputCatalog(p_catalog_name)
                        .withInputSchema(p_schema_name)
                        .withForcedTypes(
                            new ForcedType()
                                .withUserType("java.time.LocalDateTime")
                                .withConverter(
                                    "com.paas.css.startup.jooq.TimestampToLocalDateTime")
                                .withExpression(
                                    "created_at | updated_at | start_date "
                                        + "| end_date | start_time | end_time | "
                                        + "next_trigger_start_at | next_trigger_end_at")
                                .withTypes(".*"),
                            new ForcedType()
                                .withUserType("com.paas.css.utils.DefaultMap")
                                .withConverter(
                                    "com.paas.css.startup.jooq.ObjectToJsonMapConverter")
                                .withExpression(
                                    "running_days | transaction_details |  "
                                        + "| reward_details | triggers  | life ")
                                .withTypes(".*")))
                .withTarget(l_target));

try {
  GenerationTool.generate(configuration);
} catch (Exception ex) {
  System.out.println();
  ex.printStackTrace();
}

}

有人可以帮我存档吗?

最佳答案

您可以通过三种方式实现这种类型的 Multi-Tenancy :

为每个环境生成代码

您可以为每个环境重新生成架构。这样,您的 jOOQ 代码将始终引用它当前运行的环境。这可能有点脆弱,因为您将测试与要交付生产的代码不同的代码

删除代码生成器中的架构信息

您可以使用 code generation schema mapping feature 告诉代码生成器不要在生成的代码中生成任何架构信息。 :

.withInputSchema(p_schema_name)
.withOutputSchemaToDefault(true) // That's it

生成的代码现在将生成不合格的表名称。此方法假设您在访问正确数据库的每个环境上使用不同的 JDBC 连接/URL。

在运行时映射架构信息

通过使用runtime schema mapping feature ,您可以在运行时为每个环境翻译所有生成的代码的架构名称。

生成的代码现在将生成具有映射模式限定的限定表名称。

关于java - JOOQ 多个配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55144163/

相关文章:

java - 这个简单工厂是否违反了开闭原则?

java - 将 MySQL 连接到 Java 客户端/服务器应用程序

java - 将自定义 `DataType` 添加到 postgres-enum-typed `Binding` 时,Field 的 `TableField` 发生意外变化

mysql - 如何在 jOOQ 的同一张表上写 LEFT OUTER JOIN?

java - JSR 363 的 UCUM 单位格式

java - 如何对二维数组进行排序?

java - 来自 Java API 的 Elasticsearch 2.0 script_score

mysql - SQL - 如何进行条件插入

MySQL:如果在日期之后达到特定值,则获取所有行

java - JOOQ在executeInsert()之后,需要知道自动生成的ID