Spring 4,MyBatis,带注释的多个数据源

时间:2016-01-28 16:20:37

标签: java spring mybatis spring-annotations

我目前处于使用MyBatis的Spring 4应用程序中,并且完全是注释驱动的(不能根据架构要求进行更改)。我正在尝试使用完全独立的映射配置集添加第二个数据源定义。

我遇到的问题是我无法将两个数据源完美地结合在一起。

我创建了一个新的,几乎相同的类,并将@Qualifier数据添加到新文件中。

类的配置如下所示:

数据来源1

@Configuration
@MapperScan (basePackages = "com.myproject.package1", annotationClass = Mapper.class)
public class DataSource1 {

  @Bean
  @Qualifier ("DS1")
  public DataSource getDataSource() {
    /* configuration loaded */
  }

  @Bean
  @Qualifier ("DS1")
  public SqlSessionFactory getSqlSessionFactory() {
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(getDataSource());
    /* mapper resources added */
    return bean.getObject();
  }
}

数据源2

@Configuration
@MapperScan (basePackages = "com.myproject.package2", annotationClass = Mapper.class)
public class DataSource2 {

  @Bean
  @Qualifier ("DS2")
  public DataSource getDataSource() {
    /* configuration loaded */
  }

  @Bean
  @Qualifier ("DS2")
  public SqlSessionFactory getSqlSessionFactory() {
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(getDataSource());
    /* mapper resources added */
    return bean.getObject();
  }
}

当这次运行时,我会收到如下的异常消息:

  

org.apache.ibatis.binding.BindingException:绑定语句无效(未找到)

如果我在DS2中注释掉数据,DS1再次正常工作。我尝试在另一个bean中添加映射器扫描配置数据,并将SqlSessionFactoryBean的名称设置为传入但不起作用。

建议?

更新

我查看this post并更新以使用以下内容。

@Bean (name = "the_factory_1")
public SqlSessionFactory getSqlSessionFactory() { /* same code */ }

@Bean
public MapperScannerConfigurer getMapperScannerConfigurer() {
  MapperScannerConfigurer configurer = new MapperScannerConfigurer();
  configurer.setBasePackage("com.myproject.package1");
  configurer.setAnnotationClass(Mapper.class);
  configurer.setSqlSessionFactoryBeanName("the_factory_1");
  return configurer;
}

但是,这导致我犯了这个错误:

  

找不到[com.myproject.package1.mapper.MyMapper]类型的限定bean用于依赖:预期至少有1个bean可以作为此依赖项的autowire候选者。依赖注释:{}

当我调试时,只调用一个@Bean来调用工厂。

更新2

如果我将所有内容都移到一个文件中,一切都很好。但是,这并不理想,因为我希望将DataSource定义分开。这是我现在唯一的障碍。

2 个答案:

答案 0 :(得分:1)

请使用DAOFactory模式获取DS1和DS2等多个数据源的连接,并使用DAOUtil类使用注释提供所需的配置

答案 1 :(得分:1)

您可以使用ace-mybatis,它可以简化配置。

添加一个bean。

@Bean
public static AceMapperScannerConfigurer mapperScannerConfigurer() {
    return AceMapperScannerConfigurer.builder()
            .basePackage("com.myproject.package1")
            .build();
}

然后使用@AceMapper标记映射器接口并指定sqlSessionFactory

@AceMapper(sqlSessionFactoryBeanName = "firstSqlSessionFactory")
public interface UserMapper {
 Stream<User> selectUsers();
}

@AceMapper(sqlSessionFactoryBeanName = "secondSqlSessionFactory")
public interface ClientMapper {
 Stream<Client> selectClients();
}