使用MyBatis-Spring-Boot-Starter,我们可以轻松地将MyBatis与Spring Boot集成,它可以完美地用于一个数据源。但是,现在我们想在我们的项目中添加一个额外的数据源,遗憾的是它似乎并不容易。 在MyBatis官方文档中,我看到以下内容:
MyBatis-Spring-Boot-Starter将:
- 自动检测现有的DataSource。
- 将创建并注册一个SqlSessionFactoryBean实例,并将该DataSource作为输入传递。
- 将创建并注册从SqlSessionFactoryBean中获取的SqlSessionTemplate实例。
看起来MyBatis-Spring-Boot-Starter目前只支持一个数据源。那么,问题是如何在Sping Boot中配置多个MyBatis数据源?
答案 0 :(得分:1)
您概述了MyBatis + Spring集成所需的3个bean。这些是为单个数据源自动创建的。
如果需要两个数据源,则需要为每个数据源显式创建3个bean。因此,您将创建6个bean(2个类型为DataSource,2个类型为SqlSessionFactoryBean,2个类型为SqlSessionFactoryBean)。
要将DAO与某些数据源绑定,您需要使用@MapperScan
或sqlSessionTemplateRef
注释的sqlSessionFactoryRef
参数。
另外,我也不建议将XML下去。我在PROD中以这种方式使用它,有两个数据源,在各种项目中没有任何丑陋的XML配置。 SQL查询也被注释了。
遗憾的是,MyBatis文档不是很好,大多数示例都是XML格式。
答案 1 :(得分:0)
这样的事情就像你的春天servlet.xml
:
<bean id="db2dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"><value>${db2.database.driver}</value></property>
<property name="url"><value>${db2.database.url}</value></property>
<property name="username"><value>${db2.database.username}</value></property>
<property name="password"><value>${db2.database.password}</value></property>
<property name="maxActive"><value>${db2.database.maxactiveconnections}</value></property>
<property name="maxIdle"><value>${db2.database.idleconnections}</value></property>
<property name="initialSize"><value>${db2.database.initialSize}</value></property>
</bean>
<bean id="db2SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="db2dataSource" />
<property name="configLocation" value="/WEB-INF/mybatis-config.xml"/>
</bean>
<bean id="db2Dao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="db2SqlSessionFactory"/>
<property name="mapperInterface" value="com.dao.db2Dao" />
</bean>
<bean id="oracledataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"><value>${oracle.database.driver}</value></property>
<property name="url"><value>${oracle.database.url}</value></property>
<property name="username"><value>${oracle.database.username}</value></property>
<property name="password"><value>${oracle.database.password}</value></property>
<property name="maxActive"><value>${oracle.database.maxactiveconnections}</value></property>
<property name="maxIdle"><value>${oracle.database.idleconnections}</value></property>
<property name="initialSize"><value>${oracle.database.initialSize}</value></property>
</bean>
<bean id="oracleSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="oracledataSource" />
<property name="configLocation" value="/WEB-INF/mybatis-config.xml"/>
</bean>
<bean id="oracleoardDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="oracleSqlSessionFactory"/>
<property name="mapperInterface" value="com.lodige.clcs.dao.oracleoardDao" />
</bean>
答案 2 :(得分:0)
也许这就是您需要的
@Configuration
@MapperScan(basePackages = "com.neo.mapper.test1", sqlSessionTemplateRef =
"test1SqlSessionTemplate")
public class DataSource1Config {
@Bean(name = "test1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test1")
@Primary
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "test1SqlSessionFactory")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
@Bean(name = "test1TransactionManager")
@Primary
public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "test1SqlSessionTemplate")
@Primary
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}