我目前正在评估 JOOQ
,因为我相信我开始重新发明轮子,它看起来非常接近 JOOQ
的一部分 :)
现在,在挖掘出色的 JOOQ
文档时,我发现我的用例位于 Using JOOQ as SQL Builder 和 Using JOOQ as SQL Builder with Code generation 之间,即我想:
- 创建纯 SQL 字符串,如 Using JOOQ as SQL Builder 部分所示
- 与其使用硬编码的
DSL.fieldByName("BOOK","TITLE")
结构,我更喜欢存储表名及其列名和类型,如 Using JOOQ as SQL Builder with Code generation 部分所示 - 我不喜欢使用代码生成(至少不是定期使用),而是在需要新表时自己创建
TableImpl
。
在深入研究手册时,我在第 Generated tables 章中找到了表格实现的样子。但是,TableImpl 类以及 Table 接口(interface)应该使用记录类型进行参数化,TableField 类也是如此。我相信这样做是为了在直接查询数据库和检索结果时更容易进行类型推断,尽管我可能错了。
所以我的问题是:
- 手册中是否有关于如何创建 Table 和 TableField 实现的指南?或者我可以简单地为我的数据库架构生成一次它们并将生成的代码用作指南?
- 如何优雅地“丢弃”已实现类中的记录类型参数?首先,我考虑过使用
java.lang.Void
类作为类型参数,但后来我注意到只允许使用 Record 的子类......原因是我根本不需要记录类型,因为我计划在类似 Spring JdbcTemplate 的地方使用由JOOQ
生成的 SQL 查询,因此映射由我自己完成。
在此先感谢您的帮助!
最佳答案
鉴于您的用例,我不确定您为什么要推出自己的 Table
和 TableField
实现,而不是使用 jOOQ 生成的实现。正如您自己所说,您不必 每次数据库架构更改时都重新生成该代码。许多用户只是偶尔生成模式,然后将生成的工件置于版本控制之下。这将帮助您跟踪新添加的更改。
回答您的问题:
- 是的,关于
CustomTable
的使用有一些例子.您可能还会发现一些人sharing similar experiences在 user group 上 是的,您可以只使用
Record
。您的最小自定义表类型将是:class X extends TableImpl<Record> { public X() { super("x"); } }
请注意,您将使用 jOOQ 的内部 API (
TableImpl
),它不受官方支持。虽然我很肯定它会起作用,但它可能会在未来崩溃,例如因为 super 构造函数签名可能会改变。
关于java - 使用 JOOQ 仅存储表/列名称和类型而不考虑记录类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19731027/