Могу ли я генерировать 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()));
...
}
}