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