spring boot下mybatis多数据源配置

话不多说,背景是接了一个新功能,说白了还是对表项的CRUD,只不过略复杂了些。然后新的表项和原来的表项不在一个数据源,ORM框架是mybatis

1.配置文件

pom文件的话不会很复杂,基本上只有单数据源的时候的那些依赖也就够了。

我们要做的是在application.properties里加上多个数据源

#datasource-ktep
spring.datasource.ktep.driver- class -name=com.mysql.jdbc.Driver
spring.datasource.ktep.url= "your first db url"
spring.datasource.ktep.password= "first db password"
spring.datasource.ktep.username= "first db username"
spring.datasource.ktep.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.ktep.hikari.idle-timeout= 1765000
spring.datasource.ktep.hikari.maximum-pool-size= 20
spring.datasource.ktep.hikari.max-lifetime= 100
spring.datasource.ktep.hikari.minimum-idle= 5
 
#datasource-bsp
spring.datasource.bsp.driver- class -name=com.mysql.jdbc.Driver
spring.datasource.bsp.url= "your second db url"
spring.datasource.bsp.password= "second db password"
spring.datasource.bsp.username= "second db username"
spring.datasource.bsp.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.bsp.hikari.idle-timeout= 1765000
spring.datasource.bsp.hikari.maximum-pool-size= 20
spring.datasource.bsp.hikari.max-lifetime= 100
spring.datasource.bsp.hikari.minimum-idle= 5

 

2.数据源配置

分别对两个数据源进行配置,这里一定要注意的是你必须告诉mybatis哪个是主的数据源,我在这里认为ktep这个数据源是主数据源,所以你看到在每个地方我都给他加了@Primary注解,此外因为这时候你需要通过指定不同的目录以区分使用不同的数据源,我的分组是这样的,以供参考



package  com.meituan.flight;
 
import  org.apache.ibatis.session.SqlSessionFactory;
import  org.mybatis.spring.SqlSessionFactoryBean;
import  org.mybatis.spring.annotation.MapperScan;
import  org.springframework.beans.factory.annotation.Qualifier;
import  org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import  org.springframework.boot.context.properties.ConfigurationProperties;
import  org.springframework.context.annotation.Bean;
import  org.springframework.context.annotation.Configuration;
import  org.springframework.context.annotation.Primary;
import  org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 
import  javax.sql.DataSource;
 
/**
  * Created by baiwenjun on 2017/8/22.
  * At 下午5:31.
  */
@Configuration
@MapperScan (basePackages =  "com.meituan.flight.dao.ktep" ,sqlSessionFactoryRef =  "ktepSqlSessionFactory" )
public  class  KtepDataSourceConfig {
 
     @Bean (name =  "ktepDataSource" )
     @ConfigurationProperties (prefix =  "spring.datasource.ktep" )
     @Primary
     public  DataSource masterDataSource(){
         return  DataSourceBuilder.create().build();
     }
 
     @Bean (name =  "ktepSqlSessionFactory" )
     @Primary
     public  SqlSessionFactory sqlSessionFactory( @Qualifier ( "ktepDataSource" ) DataSource dataSource)  throws  Exception {
         SqlSessionFactoryBean sessionFactoryBean =  new  SqlSessionFactoryBean();
         sessionFactoryBean.setDataSource(dataSource);
         sessionFactoryBean.setMapperLocations( new  PathMatchingResourcePatternResolver()
                 .getResources( "classpath*:dao/ktep/*.*" ));
         return  sessionFactoryBean.getObject();
     }
}
package  com.meituan.flight;
 
import  org.apache.ibatis.session.SqlSessionFactory;
import  org.mybatis.spring.SqlSessionFactoryBean;
import  org.mybatis.spring.annotation.MapperScan;
import  org.springframework.beans.factory.annotation.Qualifier;
import  org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import  org.springframework.boot.context.properties.ConfigurationProperties;
import  org.springframework.context.annotation.Bean;
import  org.springframework.context.annotation.Configuration;
import  org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 
import  javax.sql.DataSource;
 
/**
  * Created by baiwenjun on 2017/8/22.
  * At 下午5:37.
  */
@Configuration
@MapperScan (basePackages =  "com.meituan.flight.dao.bsp" ,sqlSessionFactoryRef =  "bspSqlSessionFactory" )
public  class  BspDataSourceConfig {
 
     @Bean (name =  "bspDataSource" )
     @ConfigurationProperties (prefix =  "spring.datasource.bsp" )
     public  DataSource masterDataSource(){
         return  DataSourceBuilder.create().build();
     }
 
     @Bean (name =  "bspSqlSessionFactory" )
     public  SqlSessionFactory sqlSessionFactory( @Qualifier ( "bspDataSource" ) DataSource dataSource)  throws  Exception {
         SqlSessionFactoryBean sessionFactoryBean =  new  SqlSessionFactoryBean();
         sessionFactoryBean.setDataSource(dataSource);
         sessionFactoryBean.setMapperLocations( new  PathMatchingResourcePatternResolver()
                 .getResources( "classpath*:dao/bsp/*.*" ));
         return  sessionFactoryBean.getObject();
     }
}

3.测试

可以直接写test通过代码直接做测试也可以通过web页面上的表现来验证是否成功,这里我采用第二种方式,如图,页面的内容包含了客户的信息,所以只截取了一部分,已经能证明成功就好了。可以看到左侧显示使用bsp的数据源查询成功,右侧使用ktep数据源查询成功