Spring4、MyBatis,带注解的多数据源
Spring 4, MyBatis, multiple data sources with annotations
我目前在一个 Spring 4 应用程序中,它使用 MyBatis 并且完全由注释驱动(不能根据体系结构要求更改)。我正在尝试使用一组完全独立的映射配置添加第二个数据源定义。
我遇到的问题是我无法让两个数据源很好地协同工作。
我创建了一个几乎相同的新文件 class 并向新文件添加了 @Qualifier
数据。
classes 的配置如下所示:
数据源 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
定义分开。这是我现在唯一的障碍。
请使用 DAOFactory 模式获取多个数据源(如 DS1 和 DS2)的连接,并使用 DAOUtil class 使用注释提供所需的配置
您可以使用ace-mybatis,它简化了配置。
加一颗豆子。
@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();
}
我目前在一个 Spring 4 应用程序中,它使用 MyBatis 并且完全由注释驱动(不能根据体系结构要求更改)。我正在尝试使用一组完全独立的映射配置添加第二个数据源定义。
我遇到的问题是我无法让两个数据源很好地协同工作。
我创建了一个几乎相同的新文件 class 并向新文件添加了 @Qualifier
数据。
classes 的配置如下所示:
数据源 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
定义分开。这是我现在唯一的障碍。
请使用 DAOFactory 模式获取多个数据源(如 DS1 和 DS2)的连接,并使用 DAOUtil class 使用注释提供所需的配置
您可以使用ace-mybatis,它简化了配置。
加一颗豆子。
@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();
}