gpt4 book ai didi

java - 在java代码中的myBatis配置中添加xml映射器,路径与接口(interface)不同

转载 作者:太空宇宙 更新时间:2023-11-04 09:19:23 25 4
gpt4 key购买 nike

我使用 Java 代码中定义的环境和数据源在 Java 代码中初始化了 SqlSessionFactory,如下所示:

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 文件移动到同一个包,如接口(interface)示例 ( REFERENCE ):

config/com/example/mappers/XXXAttemptMapper.xml

但我需要的是与其他项目保持一致,并将xml文件放在以下路径中:

config/myBatis/myDb/XXXAttemptMapper.xml

如何在上述位置添加 xml 文件的路径?

最佳答案

mybatis 中并没有提供开箱即用的功能。 Mapper接口(interface)和Mapper xml文件的实际关系是hardcodedMapperAnnotationBuilder类:

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 .

最后一步是使用 Configuration 中的映射器注册表实现。无法在外部设置它,因此您需要继承 Configuration并使用您的映射器注册表:

class MyConfiguration extends Configuration {
public MyConfiguration{Environment environment) {
super(environment);
this.mapperRegistry = new MyMapperRegister(this);
}

在此之后您可以使用 MyConfiguration与使用 Configuration 的方式相同配置mybatis,它将从MyMapperAnnotationBuilder.loadXmlResourceFromCustomPlace中实现的逻辑定义的位置加载xml映射器.

关于java - 在java代码中的myBatis配置中添加xml映射器,路径与接口(interface)不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58522647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com