JOOQ:如何向生成的记录添加接口 Class
JOOQ: how do I add an interface to a generated Record Class
我正在使用 JOOQ 3.6.4 和 Java 8 从模式生成一组 JOOQ 记录。
一些 table 是结构相似的参考数据,假设它们有 ID、CODE 和 VALUE 列(它们可能有其他列,但它们都至少有这些列)。
在我的代码中,不是由 JOOQ 生成的,我有一个接口 "ReferenceData",它定义了与 JOOQ 为这三列生成的代码相匹配的访问器。我想告诉 JOOQ 在它生成的 Record 对象中添加一个 "implements ReferenceData"
子句(JOOQ 已经生成的代码将自动实现接口)。
我不是要求 JOOQ 自动找出接口,我可以列出每个 table 应该在 XML 配置中实现的接口。
问题 1:有什么方法可以配置 JOOQ 来生成 implements 子句而无需编写自定义生成器class?
如果我必须编写自定义生成器 class - 我仍然想要定义什么 table 记录实现什么接口要在 XML 配置中。
问题 2:是否有在 XML 中定义自定义数据的示例,该数据向下传递到自定义生成器 class?
这可以使用
来完成
- Generator strategies
- Matcher strategies(内置的,基于 XML 的生成器策略)
生成器策略
使用生成器策略,您将实现以下代码:
public class MyStrategy extends DefaultGeneratorStrategy {
@Override
public List<String> getJavaClassImplements(Definition definition, Mode mode) {
if (mode == Mode.RECORD && definition.getQualifiedName().matches("some regex")) {
return Arrays.asList(MyCustomInterface.class.getName());
}
}
}
然后可以将以上内容挂接到您的代码生成器配置中:
<generator>
<strategy>
<name>com.example.MyStrategy</name>
</strategy>
</generator>
匹配器策略
使用匹配器策略,你基本上会写:
<generator>
<strategy>
<matchers>
<tables>
<table>
<expression>A_REGEX_MATCHING_ALL_RELEVANT_TABLES</expression>
<recordImplements>com.example.MyCustomInterface</recordImplements>
</table>
</tables>
</matchers>
</strategy>
</generator>
如您所见,对于像您这样的简单用例,匹配器策略比生成器策略更容易配置。
我正在使用 JOOQ 3.6.4 和 Java 8 从模式生成一组 JOOQ 记录。
一些 table 是结构相似的参考数据,假设它们有 ID、CODE 和 VALUE 列(它们可能有其他列,但它们都至少有这些列)。
在我的代码中,不是由 JOOQ 生成的,我有一个接口 "ReferenceData",它定义了与 JOOQ 为这三列生成的代码相匹配的访问器。我想告诉 JOOQ 在它生成的 Record 对象中添加一个 "implements ReferenceData"
子句(JOOQ 已经生成的代码将自动实现接口)。
我不是要求 JOOQ 自动找出接口,我可以列出每个 table 应该在 XML 配置中实现的接口。
问题 1:有什么方法可以配置 JOOQ 来生成 implements 子句而无需编写自定义生成器class?
如果我必须编写自定义生成器 class - 我仍然想要定义什么 table 记录实现什么接口要在 XML 配置中。
问题 2:是否有在 XML 中定义自定义数据的示例,该数据向下传递到自定义生成器 class?
这可以使用
来完成- Generator strategies
- Matcher strategies(内置的,基于 XML 的生成器策略)
生成器策略
使用生成器策略,您将实现以下代码:
public class MyStrategy extends DefaultGeneratorStrategy {
@Override
public List<String> getJavaClassImplements(Definition definition, Mode mode) {
if (mode == Mode.RECORD && definition.getQualifiedName().matches("some regex")) {
return Arrays.asList(MyCustomInterface.class.getName());
}
}
}
然后可以将以上内容挂接到您的代码生成器配置中:
<generator>
<strategy>
<name>com.example.MyStrategy</name>
</strategy>
</generator>
匹配器策略
使用匹配器策略,你基本上会写:
<generator>
<strategy>
<matchers>
<tables>
<table>
<expression>A_REGEX_MATCHING_ALL_RELEVANT_TABLES</expression>
<recordImplements>com.example.MyCustomInterface</recordImplements>
</table>
</tables>
</matchers>
</strategy>
</generator>
如您所见,对于像您这样的简单用例,匹配器策略比生成器策略更容易配置。