SpringBoot

mac2025-04-10  4

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()); }
最新回复(0)