3

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

现在,在深入研究优秀JOOQ文档时,我发现我的用例介于使用 JOOQ 作为 SQL Builder使用 JOOQ 作为 SQL Builder 和代码生成之间,即我想:

  1. 创建普通 SQL 字符串,如使用 JOOQ 作为 SQL Builder部分中所示
  2. 而不是使用硬编码的DSL.fieldByName("BOOK","TITLE")结构,我更喜欢存储表的名称以及它的列名和类型,如使用 JOOQ 作为带有代码生成部分的 SQL Builder 中所示
  3. 我不喜欢使用代码生成(至少不是定期),而是TableImpl在需要新表时自己创建。

在手动挖掘时,我在Generated tables章节中发现了 table implementation 应该是什么样子。但是,TableImpl类以及Table接口应该使用记录类型进行参数化,对于TableField类也是如此。我相信这样做是为了在直接查询数据库和检索结果时更容易进行类型推断,尽管我可能弄错了。

所以我的问题是:

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

提前感谢您的帮助!

4

1 回答 1

3

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

要回答您的问题:

  1. 是的,有一些使用CustomTable. 您可能还会发现一些人在用户组上分享了类似的经历
  2. 是的,您可以使用Record. 您的最小自定义表类型将是:

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

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

于 2013-11-05T11:58:01.510 回答