我一直在将MyBatis与Spring结合使用,并且对于单个数据库来说,它一直运行得很好。尝试添加另一个数据库时遇到了困难(请参阅Github上的可复制示例)。
我正在使用Spring Java配置(即不是XML)。我看过的大多数示例都显示了如何使用XML实现此目的。
我有两个像这样的数据配置类(A和B):
@Configuration @MapperScan("io.woolford.database.mapper") public class DataConfigDatabaseA { @Bean(name="dataSourceA") public DataSource dataSourceA() throws SQLException { SimpleDriverDataSource dataSource = new SimpleDriverDataSource(); dataSource.setDriver(new com.mysql.jdbc.Driver()); dataSource.setUrl("jdbc:mysql://" + dbHostA + "/" + dbDatabaseA); dataSource.setUsername(dbUserA); dataSource.setPassword(dbPasswordA); return dataSource; } @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSourceA()); return sessionFactory.getObject(); } }
两个映射器,以及一个自动连接映射器的服务:
@Service public class DbService { @Autowired private DbMapperA dbMapperA; @Autowired private DbMapperB dbMapperB; public List<Record> getDabaseARecords(){ return dbMapperA.getDatabaseARecords(); } public List<Record> getDabaseBRecords(){ return dbMapperB.getDatabaseBRecords(); } }
该应用程序无法启动:
Error creating bean with name 'dataSourceInitializer': Invocation of init method failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: dataSourceB,dataSourceA
我已经读到可以使用@Qualifier注释消除自动装配的歧义,尽管我不确定在哪里添加它。
@Qualifier
你能看到我哪里出问题了吗?
最后,我们将每个映射器放在其自己的文件夹中:
src/main/java/io/woolford/database/mapper/a/DbMapperA.java src/main/java/io/woolford/database/mapper/c/DbMapperB.java
然后DataConfig,我们创建了两个类,每个数据库一个。该@MapperScan批注解决了expected single matching bean but found 2问题。
DataConfig
@MapperScan
expected single matching bean but found 2
@Configuration @MapperScan(value = {"io.woolford.database.mapper.a"}, sqlSessionFactoryRef="sqlSessionFactoryA") public class DataConfigDatabaseA {
必须将@Primary注释添加到以下DataConfig类之一中的bean :
@Primary
@Bean(name="dataSourceA") @Primary public DataSource dataSourceA() throws SQLException { ... } @Bean(name="sqlSessionFactoryA") @Primary public SqlSessionFactory sqlSessionFactoryA() throws Exception { ... }
{DataSourceAutoConfiguration.class})`按照@eduardlofitskyi和@GeminiKeith的建议进行操作,但这会产生一些进一步的错误。
如果有用,可以在这里找到对我们有用的解决方案:https : //github.com/alexwoolford/mybatis- spring-multiple-mysql-reproducible- example