2016-05-25 10 views
1
<javaClientGenerator type="XMLMAPPER" targetPackage="com.aaa.${module}.domain.mapper" targetProject="src/main/resources"> 
    <property name="enableSubPackages" value="true" /> 
</javaClientGenerator> 

Der var $ {module} könnte der Wert von domainObjectName in der Tabelle config sein.könnte ich mybaits Mapper dynamisch generieren?

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

Antwort

0

Ja, aber Sie müssen wahrscheinlich einen benutzerdefinierten javaClientGenerator erstellen. Ich glaube nicht, dass die Eigenschaft enableSubPackages so funktioniert. In Ihrer Konfigurationsdatei würden Sie haben:

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

Und dann würden Sie müssen den vorhandenen JavaMapperGenerator mit Ihrer eigenen Version zu Unterklasse. Etwas wie Option 1 oder 2 unten. Option 2 ist diejenige, die ich wahrscheinlich mit der unerwarteten Komplexität von Option 1 gehen würde.

Option 1- Was dies schwierig macht, ist der Mapper-Typ in einer privaten Variable gespeichert ist, so dass Sie ein ganz neue Schnittstelle Objekt der Werte über die ursprüngliche Kopieren erstellen haben:

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; 
    } 

} 

Option 2- Obwohl es ein wenig chaotisch ist, würde ich wahrscheinlich die ganzen getCompilationsUnits() -Methode von JavaMapperGenerator copy-paste und die einzige Zeile ändern, die den Typen setzt:

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())); 
     ... 
    } 

}