话不多说,背景是接了一个新功能,说白了还是对表项的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数据源查询成功