Java 使用JOOQ只存储表/列名和类型,而不考虑记录类型

Java 使用JOOQ只存储表/列名和类型,而不考虑记录类型,java,jooq,Java,Jooq,我目前正在评估JOOQ,因为我相信我开始重新发明轮子,它看起来非常接近JOOQ:) 现在,在深入研究伟大的JOOQ文档时,我发现我的用例介于和之间,即我想: 创建简单的SQL字符串,如第1部分所示 与使用硬编码的DSL.fieldByName(“BOOK”、“TITLE”)结构不同,我更喜欢将表名与其列名和类型一起存储,就像部分中所示 我不喜欢使用代码生成(至少不定期),而是在需要新表时自己创建TableImpl 在翻阅手册时,我在第章中发现了表实现应该是什么样子。然而,类和接口都应该用记录类型

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

现在,在深入研究伟大的
JOOQ
文档时,我发现我的用例介于和之间,即我想:

  • 创建简单的SQL字符串,如第1部分所示
  • 与使用硬编码的
    DSL.fieldByName(“BOOK”、“TITLE”)
    结构不同,我更喜欢将表名与其列名和类型一起存储,就像部分中所示
  • 我不喜欢使用代码生成(至少不定期),而是在需要新表时自己创建
    TableImpl
  • 在翻阅手册时,我在第章中发现了表实现应该是什么样子。然而,类和接口都应该用记录类型参数化,类也是如此。我相信这样做是为了在直接查询数据库和检索结果时更容易进行类型推断,尽管我可能弄错了

    因此,我的问题是:

  • 手册中是否有关于如何创建和实现的指南?或者我可以简单地为我的数据库模式生成它们一次,并使用生成的代码作为指导
  • 如何在实现的类中优雅地“丢弃”记录类型参数?首先,我考虑使用
    java.lang.Void
    类作为类型参数,但后来我注意到只允许的子类。。。原因是我根本不需要记录类型,因为我计划在类似这样的情况下使用由
    JOOQ
    SQL查询生成的数据,所以映射由我自己完成

  • 提前感谢您的帮助

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

    回答您的问题:

  • 是的,有一些关于使用的例子。你也可以在网上找到一些人
  • 是的,您可以使用
    录制
    。您的最小自定义表类型将是:

    class X extends TableImpl<Record> {
        public X() {
            super("x");
        }
    }
    
    X类扩展了TableImpl{
    公共X(){
    超级(“x”);
    }
    }
    
    请注意,您将使用jOOQ的内部API(
    TableImpl
    ),该API不受官方支持。虽然我确信它会工作,但将来可能会中断,例如超级构造函数签名可能会更改


  • 在我回答之前:你为什么要避免代码生成,而最终,你想使用类似于jOOQ的代码生成器生成的人工制品?这更像是品味的问题:)通常在代码生成之后,我会检查所有生成的代码,以确保一切顺利,并知道生成了什么以及在哪里生成,所以我经常觉得自己编写代码可以让我更好地控制正在发生的事情,并让我更好地理解我正在使用的框架。但正如我所说,这更像是个人偏好,而不是理性的争论:)非常感谢你的回答——它澄清了很多!在研究了
    CustomTable
    CustomField
    应该如何实现之后,我发现,是的,我可能会在将来使用代码生成:),尽管我计划将数据库架构创建脚本转移到
    Java/JOOQ
    (如果它得到支持,否则我将不得不自己编写),因为在我看来,这更安全。因此,此时我可能需要自己创建
    /
    字段
    实例。