Это не предусмотрено из коробки в mybatis. Фактическое отношение между интерфейсом mapper и файлом mapper xml составляет в жестком коде в MapperAnnotationBuilder
классе:
String xmlResource = type.getName().replace('.', '/') + ".xml";
И нет встроенного способа переопределить это. Чтобы изменить это, вам нужно реализовать свой собственный эквивалент MapperAnnotationBuilder
(вы можете унаследовать большую часть его функциональных возможностей, но потребуется изменить метод parse
, чтобы изменить, вызовите метод, который заменит loadXmlResource
):
class MyMapperAnnotationBuilder extends MapperAnnotationBuilder {
public void parse() {
String resource = type.toString();
if (!configuration.isResourceLoaded(resource)) {
loadXmlResourceFromCustomPlace();
// ... continue as MapperAnnotationBuilder.parse method
}
}
void private loadXmlResourceFromCustomPlace() {
// this should be similar to MapperAnnotationBuilder.loadXmlResource
// but load resource from some other place
}
}
Теперь вам нужно использовать MyMapperAnnotationBuilder
в вашей собственной реализации класса, аналогичного org.apache.ibatis.binding.MapperRegistry
(скажем, вы называете его MyMapperRegister
). Вам нужно наследовать от него и переопределить метод addMapper(Class<T> type)
, чтобы использовать MyMapperAnnotationBuilder
.
И последний шаг - использовать реализацию реестра mapper в Configuration
. Невозможно установить его внешне, поэтому вам нужно будет наследовать от Configuration
и использовать свой реестр mapper:
class MyConfiguration extends Configuration {
public MyConfiguration{Environment environment) {
super(environment);
this.mapperRegistry = new MyMapperRegister(this);
}
После этого вы используете MyConfiguration
так же, как вы используете Configuration
для настройкиmybatis и он будет загружать сопоставители xml из места, определенного логикой, реализованной в MyMapperAnnotationBuilder.loadXmlResourceFromCustomPlace
.