Добавьте xml mapper в конфигурацию myBatis в коде Java с путем, отличным от интерфейса - PullRequest
1 голос
/ 23 октября 2019

Я инициализировал свой SqlSessionFactory в коде Java, используя среду и источник данных, определенные в коде Java, как показано ниже:

TransactionFactory trxFactory = new JdbcTransactionFactory();
Environment env = new Environment("development", trxFactory, dataSource);
Configuration config = new Configuration(env);
config.setJdbcTypeForNull(JdbcType.NULL);
TypeAliasRegistry aliases = config.getTypeAliasRegistry();
aliases.registerAlias("XXXAttempt", XXXAttemptDao.class);
config.addMapper(XXXAttemptMapper.class);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);

Моя проблема заключается в том, что мне нужно добавить мои сопоставители xml здесь, но я не смог:Я пытался использовать:

config.addMappers("config/mybatis/xxx/*.xml");

и

config.addMappers("config/mybatis/xxx/*.xml");

без удачи. обратите внимание, что config.addMapper принимает только класс java

Единственный работающий способ - переместить xml-файл в тот же пакет, как в примере интерфейса ( REFERENCE ):

config/com/example/mappers/XXXAttemptMapper.xml

но что мне нужно, это согласоваться с другими проектами и поместить XML-файл по указанному ниже пути:

config/myBatis/myDb/XXXAttemptMapper.xml

как добавить путь к моему XML-файлу в указанном выше расположении?

1 Ответ

0 голосов
/ 23 октября 2019

Это не предусмотрено из коробки в 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.

...