如何在Spring Boot中配置多个MyBatis数据源?

时间:2016-05-05 06:53:10

标签: spring-boot datasource multiple-databases spring-mybatis

使用MyBatis-Spring-Boot-Starter,我们可以轻松地将MyBatis与Spring Boot集成,它可以完美地用于一个数据源。但是,现在我们想在我们的项目中添加一个额外的数据源,遗憾的是它似乎并不容易。 在MyBatis官方文档中,我看到以下内容:

  

MyBatis-Spring-Boot-Starter将:

     
    
        
  • 自动检测现有的DataSource。
  •     
  • 将创建并注册一个SqlSessionFactoryBean实例,并将该DataSource作为输入传递。
  •     
  • 将创建并注册从SqlSessionFactoryBean中获取的SqlSessionTemplate实例。
  •     
  

看起来MyBatis-Spring-Boot-Starter目前只支持一个数据源。那么,问题是如何在Sping Boot中配置多个MyBatis数据源?

3 个答案:

答案 0 :(得分:1)

您概述了MyBatis + Spring集成所需的3个bean。这些是为单个数据源自动创建的。

如果需要两个数据源,则需要为每个数据源显式创建3个bean。因此,您将创建6个bean(2个类型为DataSource,2个类型为SqlSessionFactoryBean,2个类型为SqlSessionFactoryBean)。

要将DAO与某些数据源绑定,您需要使用@MapperScansqlSessionTemplateRef注释的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);
}