我需要连接到多个数据库以查询和合并数据,然后再将其返回给用户。有没有办法使用MyBatis和cdi?我调查了使用DatabaseIdProvider并使用multiple environment configurations的情况,但是看起来它们不适用于这种情况。使用多个环境配置,我可以创建不同的sql会话工厂,但是在这种情况下,映射器的cdi将如何工作?我想尽可能多地使用cdi。 MyBatis Guice可以帮助您吗?我已经看过一个similar问题,但是在这种情况下(我需要在同一服务调用中查询多个数据库),我无法确定Guice是否会有所帮助。

最佳答案

环境配置定义数据源和事务管理器。
然后,连接到多个数据库至少需要尽可能多的SqlSessionFactory:

Reader reader = Resources.getResourceAsReader(classpathConfigFilename);
new SqlSessionFactoryBuilder().build(reader, environment, properties);


每个环境一个

如果目的是合并数据,我猜两个数据模型都稍有不同(然后是查询,映射器,typeHandler ...),那么最好从不同的mybatis-config文件创建SqlSessionFactory并使用它们的默认环境:

new SqlSessionFactoryBuilder().build(reader, properties);


怎么不解决问题呢?
如果您编辑问题以提供有关上下文,示例和尝试过的内容的更多信息,则可能会提供更准确的答案。

吉斯:当然可以使用,但并非必须达到此成就。

编辑:

使用Mybatis-CDI

这是产生SqlSession工厂的方法(它们必须为@Named):

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;
import javax.inject.Named;

public class SqlSessionFactoryWrapper {

    private static final String  BI_CONFIG  = "mybatis-config.xml";

    private SqlSessionFactory getFactory(final String config, final String env) throws IOException {
        final Reader reader = Resources.getResourceAsReader(config);
        final Properties properties = new Properties();
        properties.load(Resources.getResourceAsReader("some.properties"));

        return new SqlSessionFactoryBuilder().build(reader, env, properties);
    }

    @Produces
    @ApplicationScoped
    @Named("A")
    public SqlSessionFactory getFactoryA() throws IOException {
        return this.getBiFactory(CONFIG, "A");
    }

    @Produces
    @ApplicationScoped
    @Named("B")
    public SqlSessionFactory getFactoryB() throws IOException {
        return this.getFactory(CONFIG, "B");
    }
}


以及如何注入:

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.inject.Named;


    @Inject
    @Named("A")
    protected SqlSession          sessionA;

    @Inject
    @Named("B")
    protected SqlSession          sessionB;


或者直接从环境B的SqlSession注入映射器:

import org.mybatis.cdi.Mapper;

    @Inject
    @Named("B")
    @Mapper
    protected MyMapper mapper;


这在我在jBoss中运行的应用程序中有效,但是这里没有jBoss特有的内容。

阅读documentation for transaction management,这很清楚。
我建议使用

@Transactional(executorType = ExecutorType.REUSE)


专门用于批量操作,仅准备一次语句。

编辑2:

片段中的mybatis.cdi注释对于我当时使用的1.0.0.beta3版本有效。在进一步的Beta中,它们略有发展,因此,最终版本(仅使用一个月)就不需要进行任何改动。

09-13 12:45