SpringBoot_使用spring data jdbc配置多个数据源

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());
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值