适合不同环境的 Jooq

Posted

技术标签:

【中文标题】适合不同环境的 Jooq【英文标题】:Jooq for different enviornment 【发布时间】:2019-06-27 09:57:33 【问题描述】:

我在我的应用程序中使用 Jooq 和 mysql。我们的发布管道遵循 dev -> stage -> prod 。

每个 env 都有相同的架构,但问题是,它们可能有以下变量:

    它们可能有不同的数据库名称(dev_db、stage_db、prod_db) 他们可能有不同的数据库 URL 和凭据

目前,我得到了以下代码。

public static void init() 

    Target l_target =   new Target();
    System.out.println("My directory is::"+l_target.getPackageName());
    l_target.setDirectory("src/main/java");
    l_target.setPackageName("com.my.paas.css.entity");
    Configuration configuration = new Configuration()
            .withJdbc(new Jdbc()
                    .withDriver("com.mysql.jdbc.Driver")
                    .withUrl("jdbc:mysql://localhost:3306/paas")
                    .withUser("root"))
            .withGenerator(new Generator()
                    .withDatabase(new Database()
                            .withName("org.jooq.meta.mysql.MySQLDatabase")
                            .withIncludes(".*")
                            .withExcludes("")
                            .withInputSchema("paas"))
                    .withTarget(l_target));

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

我想了解,如何让代码生成适应环境?

【问题讨论】:

【参考方案1】:

程序化配置

您已经在使用程序化代码生成配置,因此对您的配置元素进行调整应该是微不足道的。例如,为了为给定的数据库连接选择正确的 JDBC URL,您将使用局部变量或方法,而不是对 URL 进行硬编码:

// Instead of
.withUrl("jdbc:mysql://localhost:3306/paas")

// write...
.withUrl(jdbcUrl())

并根据环境实现jdbcUrl()

映射架构

您可能想要研究的另一个功能集是架构映射功能,您可以应用它:

during code generation at runtime

注意,签入生成的代码并从中构建库并不罕见,而不是在每个环境中重新生成代码。

【讨论】:

代码生成过程中如何生成?我们有一个构建过程的 Jenkins 工作。我们没有来自 Jenkins 服务器的数据库访问权限(实际上是在哪里进行代码生成)? @SandeepPandey:你介意问一个新问题吗?您的新问题与此问题无关。

以上是关于适合不同环境的 Jooq的主要内容,如果未能解决你的问题,请参考以下文章

jOOQ 是不是使用不同的连接来执行不同的查询?

使用来自两个不同数据库的两个表使用 JOOQ 构建左连接查询

JOOQ:在通用界面中对来自不同表的列进行逻辑分组

如何配置 pom.xml 以将 jooq 类生成到两个不同的包中?

如果基于一个字段的所有行在另一个字段上具有不同的值,则 JOOQ 查询返回一个布尔值

多个存储库上的 JOOQ @Transactional