如何使用 jooq 生成器将表和列名称映射为人类可读的?

问题描述 投票:0回答:1

我有一些旧数据库,其中的表和列名称如下:

XYZEMP:

  • XYZCMP
  • XYZUSR
  • XYZNME

可以映射为人类可读的

员工

  • 公司
  • 用户名
  • 姓名

当我使用标准 JOOQ 代码生成时,它会使用 XYZCMP 列以及相应的 getter 和 setter 创建表对象 XYXEMP、XyzempRecord 等。 有没有什么方法可以将映射传递给生成器,以便它生成表对象 Employee、EmployeeRecord 和人类可读的列名称?

我的想法是使用自定义生成器策略

public class AsInDatabaseStrategy extends DefaultGeneratorStrategy {
    @Override
    public String getJavaClassName(Definition definition, Mode mode) {
        Map<String, String> tableNamesMapping = readTableNames();
        if (mode == Mode.DEFAULT){ //for table class
             String readableName = tableNamesMapping.get(definition.getOutputName());
             if (readableName == null){
               throw new IllegalStateException("Table " + definition.getOutputName() + " lacks mapping");
             }
             return readableName;
        } else if (mode == Mode.RECORD) { // for record
            // similar logic for record
            return readableName + "Record";
        }
        return super.getJavaClassName(definition, mode);
    }
    @Override
    public String getJavaIdentifier(Definition definition) {
    // somehow similar code for table and and column
    }
    @Override
    public String getJavaSetterName(Definition definition, Mode mode) {
        // somehow similar code for table and and column
    }
    @Override
    public String getJavaGetterName(Definition definition, Mode mode) {
        // somehow similar code for table and and column
    }
    private Map<String, String> readTableNames(){
    //read names mapping from file
    }
    private Map<String, Map<String, String>> readColumnNames(){
    //read names mapping from file
    }
}

映射文件可以用于表格:

{
"XYZEMP" : "EMPLOYEE",
...
}

对于列

{
"XYZEMP" : {
"XYZCMP" : "COMPANY",
"XYZUSR: : "USERNAME",
"XYZNME" : "NAME"
}
...
}

您认为有更明智的方法吗? 在我的方法的情况下 - 如何区分“定义”对象是表还是列(或任何其他对象)以及对于列它属于哪个表?

java jooq jooq-codegen
1个回答
0
投票

您认为有更明智的方法吗?

这对我来说看起来很合理。另一种方法是使用配置性“匹配器策略”,您可以直接以 Maven/Gradle/独立 XML 格式配置这些映射。我认为这种方法看起来比你的更冗长和重复。

如何区分“定义”对象是表还是列(或任何其他对象)以及列属于哪个表?

只需检查是否为

definition instanceof TableDefinition
definition instanceof ColumnDefinition
,然后使用它们的 API 来查找表/列关系。

© www.soinside.com 2019 - 2024. All rights reserved.