java - Spring 4、MyBatis、带注解的多数据源

标签 java spring mybatis spring-annotations

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

我遇到的问题是我无法让两个数据源很好地协同工作。

我创建了一个几乎相同的新类,并将 @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: Invalid bound statement (not found)

如果我注释掉 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;
}

但是,这导致我出现此错误:

No qualifying bean of type [com.myproject.package1.mapper.MyMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

当我只调试一个 @Bean 时,工厂就会被调用。

更新2

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

最佳答案

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

添加一个 Bean。

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

然后用 @AceMapper 标记您的映射器接口(interface)并指定 sqlSessionFactory

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

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

关于java - Spring 4、MyBatis、带注解的多数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35066607/

相关文章:

java - 如何使用mybatis实现递归映射?

java - 在 ANTLR v4 中定义 double 类型的规则

java - 根据 JasperReports 中的条件更改文本字段数据颜色(前景色)

Spring Batch - 无法解析的日期

java - json 中的语言特定字符

java - 从JPA到MyBatis : Composite Key?

java - 如何避免 Java 中意外关闭 SQL 连接?

java - 相互传递多个对象

java - 使用 Hibernate 的后备数据库

grails - grails mybatis-plugin验证位置