Могу ли я генерировать mybaits Mapper динамически?

<javaClientGenerator type="XMLMAPPER" targetPackage="com.aaa.${module}.domain.mapper"  targetProject="src/main/resources">
  <property name="enableSubPackages" value="true" />
</javaClientGenerator>

переменная ${module} может быть значением domainObjectName в конфигурации таблицы.

    <table schema="test" tableName="account" domainObjectName="Account" >
      <property name="useActualColumnNames" value="true"/>
    </table>

1 ответ

Да, но вам, скорее всего, нужно создать пользовательский javaClientGenerator. Я не думаю, что свойство enableSubPackages работает именно так. В вашем конфигурационном файле вы бы имели:

<javaClientGenerator type="com.mydomain.MyJavaMapperGenerator" targetPackage="com.aaa.${module}.domain.mapper"  targetProject="src/main/java">
</javaClientGenerator>

И тогда вам нужно будет создать подкласс существующего JavaMapperGenerator с вашей собственной версией. Что-то вроде варианта 1 или 2 ниже. Вариант 2 - это тот, который я, вероятно, выбрал бы, учитывая неожиданную сложность варианта 1.

Вариант 1. Что делает это трудным, так это то, что тип картографа хранится в закрытой переменной, поэтому вам нужно создать совершенно новый объект интерфейса, копирующий значения из оригинала:

public class MyJavaMapperGenerator extends JavaMapperGenerator {

    @Override
    public List<CompilationUnit> getCompilationUnits() {
        List<CompilationUnit> compliationUnits = super.getCompilationUnits();
        List<CompilationUnit> newCompliationUnits = new ArrayList<>();
        Interface mapper = (Interface)compliationUnits.get(0);
        String mapperType = mapper.getType().getFullyQualifiedName();
        Interface newMapper = new Interface(mapperType.replace("${module}",
            introspectedTable.getFullyQualifiedTable().getDomainObjectName().toLowerCase()));

        newMapper.getJavaDocLines().addAll(mapper.getJavaDocLines());
        newMapper.setVisibility(mapper.getVisibility());
        newMapper.setStatic(mapper.isStatic());
        newMapper.setFinal(mapper.isFinal());
        newMapper.getAnnotations().addAll(mapper.getAnnotations());

        newMapper.addImportedTypes(mapper.getImportedTypes());
        newMapper.getStaticImports().addAll(mapper.getStaticImports());
        newMapper.getSuperInterfaceTypes().addAll(mapper.getSuperInterfaceTypes());
        newMapper.getMethods().addAll(mapper.getMethods());
        newMapper.getFileCommentLines().addAll(mapper.getFileCommentLines());

        newCompliationUnits.add(newMapper);

        return newCompliationUnits;
    }

}

Вариант 2 - Хотя это немного грязно, я, вероятно, скопировал бы и вставил весь метод getCompilationsUnits() из JavaMapperGenerator и изменил бы одну строку, которая устанавливает тип:

public class MyJavaMapperGenerator extends JavaMapperGenerator {

    @Override
    public List<CompilationUnit> getCompilationUnits() {
        ...
        //FullyQualifiedJavaType type = new FullyQualifiedJavaType(
        //        introspectedTable.getMyBatis3JavaMapperType());
        FullyQualifiedJavaType type = new FullyQualifiedJavaType(
                introspectedTable.getMyBatis3JavaMapperType().replace("${module}",
                introspectedTable.getFullyQualifiedTable().getDomainObjectName()
                                 .toLowerCase()));
        ...
    }

}
Другие вопросы по тегам