1,在yml配置两个数据源
spring:
datasource:
druid:
dataSource1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/dataSource1?useUnicode=true&characterEncoding=utf-8
initialSize: 10
minIdle: 10
maxActive: 20
maxWait: 30000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 30000
validationQuery: select 1 from dual
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
filters: stat,wall
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
dataSource2:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/datSource2?useUnicode=true&characterEncoding=utf-8
initialSize: 10
minIdle: 10
maxActive: 20
maxWait: 30000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 30000
validationQuery: select 1 from dual
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
filters: stat,wall
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
2,注入两个DataSource
@Configuration
public class DataSourceConfig {
@Primary
@Bean(name = dataSource1")
@ConfigurationProperties("spring.datasource.druid.dataSource1")
DataSource dataSource1(){
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "dataSource2")
@ConfigurationProperties("spring.datasource.druid.dataSource2")
DataSource dataSource2(){
return DruidDataSourceBuilder.create().build();
}
}
3,将dataSource配置入jdbcPepositories
注入dataSource1
@Configuration
@EnableJdbcRepositories(
//指定dao层的包
basePackages = {"com.shawemou.mapper.dataSource1"},
//将dataSource配置到Repository,不填入此项,会将@primary标注的NamedParameterJdbcOperations(dataSource)注入到Repository
repositoryFactoryBeanClass = DataSource1RepositoryFactoryBean.class
)
public class DataSource1Config {
/**
* 数据源的依赖注入
*/
@Autowired
@Qualifier("dataSource1")
private DataSource dataSource;
//此配置无用,当repositoryFactoryBeanClass为默认的时候才有用
@Primary
@Bean
NamedParameterJdbcOperations dataSource1Operations() {
return new NamedParameterJdbcTemplate(dataSource);
}
}
public class DataSource1RepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable> extends TransactionalRepositoryFactoryBeanSupport<T, S, ID> implements ApplicationEventPublisherAware {
private ApplicationEventPublisher publisher;
private RelationalMappingContext mappingContext;
private RelationalConverter converter;
private DataAccessStrategy dataAccessStrategy;
private RowMapperMap rowMapperMap;
private NamedParameterJdbcOperations operations;
DataSource1RepositoryFactoryBean(Class<? extends T> repositoryInterface) {
super(repositoryInterface);
this.rowMapperMap = RowMapperMap.EMPTY;
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
super.setApplicationEventPublisher(publisher);
this.publisher = publisher;
}
@Override
protected RepositoryFactorySupport doCreateRepositoryFactory() {
JdbcRepositoryFactory jdbcRepositoryFactory = new JdbcRepositoryFactory(this.dataAccessStrategy, this.mappingContext, this.converter, this.publisher, this.operations);
jdbcRepositoryFactory.setRowMapperMap(this.rowMapperMap);
return jdbcRepositoryFactory;
}
@Autowired
protected void setMappingContext(RelationalMappingContext mappingContext) {
super.setMappingContext(mappingContext);
this.mappingContext = mappingContext;
}
@Autowired(
required = false
)
public void setDataAccessStrategy(DataAccessStrategy dataAccessStrategy) {
this.dataAccessStrategy = dataAccessStrategy;
}
@Autowired(
required = false
)
public void setRowMapperMap(RowMapperMap rowMapperMap) {
this.rowMapperMap = rowMapperMap;
}
/**
* 此处为自己配置
*/
@Autowired
public void setJdbcOperations(@Qualifier("dataSource1") DataSource dataSource) {
this.operations = new NamedParameterJdbcTemplate(dataSource);
}
@Autowired
public void setConverter(RelationalConverter converter) {
this.converter = converter;
}
@Override
public void afterPropertiesSet() {
if (this.dataAccessStrategy == null) {
SqlGeneratorSource sqlGeneratorSource = new SqlGeneratorSource(this.mappingContext);
this.dataAccessStrategy = new DefaultDataAccessStrategy(sqlGeneratorSource, this.mappingContext, this.converter, this.operations);
}
if (this.rowMapperMap == null) {
this.rowMapperMap = RowMapperMap.EMPTY;
}
super.afterPropertiesSet();
}
}
注入dataSource1
@Configuration
@EnableJdbcRepositories(
//指定dao层的包
basePackages = {"com.shawemou.mapper.dataSource2"},
//将dataSource配置到Repository,不填入此项,会将@primary标注的NamedParameterJdbcOperations(dataSource)注入到Repository
repositoryFactoryBeanClass = DataSource2RepositoryFactoryBean.class
)
public class DataSource2Config {
/**
* 数据源的依赖注入
*/
@Autowired
@Qualifier("dataSource2")
private DataSource dataSource;
//此配置无用,当repositoryFactoryBeanClass为默认的时候才有用
@Bean
NamedParameterJdbcOperations dataSource1Operations() {
return new NamedParameterJdbcTemplate(dataSource);
}
}
public class DataSource2RepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable> extends TransactionalRepositoryFactoryBeanSupport<T, S, ID> implements ApplicationEventPublisherAware {
private ApplicationEventPublisher publisher;
private RelationalMappingContext mappingContext;
private RelationalConverter converter;
private DataAccessStrategy dataAccessStrategy;
private RowMapperMap rowMapperMap;
private NamedParameterJdbcOperations operations;
DataSource2RepositoryFactoryBean(Class<? extends T> repositoryInterface) {
super(repositoryInterface);
this.rowMapperMap = RowMapperMap.EMPTY;
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
super.setApplicationEventPublisher(publisher);
this.publisher = publisher;
}
@Override
protected RepositoryFactorySupport doCreateRepositoryFactory() {
JdbcRepositoryFactory jdbcRepositoryFactory = new JdbcRepositoryFactory(this.dataAccessStrategy, this.mappingContext, this.converter, this.publisher, this.operations);
jdbcRepositoryFactory.setRowMapperMap(this.rowMapperMap);
return jdbcRepositoryFactory;
}
@Autowired
protected void setMappingContext(RelationalMappingContext mappingContext) {
super.setMappingContext(mappingContext);
this.mappingContext = mappingContext;
}
@Autowired(
required = false
)
public void setDataAccessStrategy(DataAccessStrategy dataAccessStrategy) {
this.dataAccessStrategy = dataAccessStrategy;
}
@Autowired(
required = false
)
public void setRowMapperMap(RowMapperMap rowMapperMap) {
this.rowMapperMap = rowMapperMap;
}
/**
* 此处为自己配置
*/
@Autowired
public void setJdbcOperations(@Qualifier("dataSource2") DataSource dataSource) {
this.operations = new NamedParameterJdbcTemplate(dataSource);
}
@Autowired
public void setConverter(RelationalConverter converter) {
this.converter = converter;
}
@Override
public void afterPropertiesSet() {
if (this.dataAccessStrategy == null) {
SqlGeneratorSource sqlGeneratorSource = new SqlGeneratorSource(this.mappingContext);
this.dataAccessStrategy = new DefaultDataAccessStrategy(sqlGeneratorSource, this.mappingContext, this.converter, this.operations);
}
if (this.rowMapperMap == null) {
this.rowMapperMap = RowMapperMap.EMPTY;
}
super.afterPropertiesSet();
}
}
4,创建dao,repository会根据dao所处包的不同使用不通数据源
/**
* @Author: MouXiaoFei
* @CreateTime: 2019-10-27 10:43
* @Description:
*/
public interface StudentReposistory extends CrudRepository<Student, Integer> {
@Override
Student save(Student s);
@Query("select * from student s where name = :name")
List<Student> selectByRecord(@Param("name") String name);
}
5,使用
public List<Student> findStudentsByRecord(Student student) {
return this.studentReposistory.selectByRecord(student.getName());
}