我有一些旧数据库,其中的表和列名称如下:
XYZEMP:
可以映射为人类可读的
员工
当我使用标准 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"
}
...
}
您认为有更明智的方法吗? 在我的方法的情况下 - 如何区分“定义”对象是表还是列(或任何其他对象)以及对于列它属于哪个表?
您认为有更明智的方法吗?
这对我来说看起来很合理。另一种方法是使用配置性“匹配器策略”,您可以直接以 Maven/Gradle/独立 XML 格式配置这些映射。我认为这种方法看起来比你的更冗长和重复。
如何区分“定义”对象是表还是列(或任何其他对象)以及列属于哪个表?
只需检查是否为
definition instanceof TableDefinition
或 definition instanceof ColumnDefinition
,然后使用它们的 API 来查找表/列关系。