【问题标题】:Using JOOQ just to store table/column names and types with no regard to Record types仅使用 JOOQ 存储表/列名称和类型,而不考虑记录类型
【发布时间】:2013-11-12 21:44:06
【问题描述】:

我目前正在评估JOOQ,因为我相信我开始重新发明轮子,它看起来非常接近JOOQ 的一部分:)

现在,在挖掘出色的 JOOQ 文档时,我发现我的用例介于 Using JOOQ as SQL BuilderUsing JOOQ as SQL Builder with Code generation 之间,即我想:

  1. 创建纯 SQL 字符串,如 Using JOOQ as SQL Builder 部分所示
  2. 而不是使用硬编码的DSL.fieldByName("BOOK","TITLE") 构造,我更喜欢存储表的名称以及它的列名和类型,就像它在Using JOOQ as SQL Builder with Code generation 部分中显示的那样
  3. 我不喜欢使用代码生成(至少不是定期),而是在需要新表时自己创建TableImpl

在阅读手册时,我在章节Generated tables 中发现了表格实现的样子。但是,TableImpl 类和 Table 接口应该使用记录类型进行参数化,TableField 类也是如此。我相信这样做是为了在直接查询数据库和检索结果时更容易进行类型推断,尽管我可能弄错了。

所以我的问题是:

  1. 手册中是否有关于如何创建TableTableField 实现的指南?或者我可以简单地为我的数据库架构生成一次并使用生成的代码作为指导?
  2. 如何在实现的类中优雅地“丢弃”记录类型参数?首先,我考虑使用java.lang.Void类作为类型参数,但后来我注意到只允许Record的子类......原因是我根本不需要记录类型,因为我打算使用@生成的987654339@Spring JdbcTemplate 之类的 SQL 查询,所以映射由我自己完成。

提前感谢您的帮助!

【问题讨论】:

  • 在我回答之前:为什么要避免代码生成,最终,您想使用类似于 jOOQ 的代码生成器生成的人工制品?
  • 这更像是品味问题 :) 通常在代码生成之后,我无论如何都会检查所有生成的代码,以确保一切顺利并知道生成了什么以及在哪里生成,所以我经常觉得编码它我自己让我对正在发生的事情有了更多的控制,让我对我正在使用的框架有了更多的理解。但正如我所说,这更像是个人喜好而不是理性的争论:)

标签: java jooq


【解决方案1】:

鉴于您的用例,我不确定您为什么要推出自己的 TableTableField 实现,而不是使用 jOOQ 生成的实现。正如您自己所说,您不必在每次数据库架构更改时重新生成该代码。许多用户只是偶尔生成一次模式,然后将生成的工件置于版本控制之下。这将帮助您跟踪新添加的更改。

回答您的问题:

  1. 是的,有一些使用CustomTable 的例子。您还可以在user group 上找到一些人sharing similar experiences
  2. 是的,您可以使用Record。您的最小自定义表类型将是:

    class X extends TableImpl<Record> {
        public X() {
            super("x");
        }
    }
    

    请注意,您将使用 jOOQ 的 internal API (TableImpl),该 API 不受官方支持。虽然我很肯定它会起作用,但它可能会在未来中断,例如因为超级构造函数签名可能会改变。

【讨论】:

  • 非常感谢您的回复 - 它澄清了很多!在查看了应该如何实现 CustomTableCustomField 之后,我发现是的,我可能会使用代码生成 :) 虽然我计划将来将数据库模式创建脚本转移到 Java / JOOQ(如果支持,否则将不得不自己编写),因为 IMO 更安全。所以那时我可能需要自己创建 Table / Field 实例。
猜你喜欢
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多