下面记录一下单数据源的自动配置、使用Bean配置方式和多数据源配置与事务管理器扩配置。

单数据源配置

这里选用的是druid作为数据源,下面是Mysql驱动和druid数据池依赖

pom.xml包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.21</version>
</dependency>

数据池的选用和数据库的配置
application.yml配置文件

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://139.9.183.232:3306/test?useSSL=false&characterEncoding=utf8
    username: root
    password: root

最后在启动类中进行mapper包的扫描

@MapperScan("com.example.springbootmysql01")
@SpringBootApplication
public class SpringbootMysql01Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMysql01Application.class, args);
    }

}

使用bean方式配置数据源

数据库的配置
sql.properties配置文件

mysql.driver-class-name=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://139.9.183.232:3306/test?useSSL=false&characterEncoding=utf8
mysql.username=root
mysql.password=root

使用配置类配置数据源

@Configuration
@PropertySource(value = "classpath:sql.properties")
public class DataSourceConfig {

    @Value("${mysql.driver-class-name}")
    private String driverClassName;
    @Value("${mysql.url}")
    private String url;
    @Value("${mysql.username}")
    private String username;
    @Value("${mysql.password}")
    private String password;

    @Bean
    public DataSource setDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

配置二,使用DataSourceBuilder方式构建数据源

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://139.9.183.232:3306/test?useSSL=false&characterEncoding=utf8
    username: root
    password: root
@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSourceDb1() {
        return DataSourceBuilder.create().type(DruidDataSource.class).build();
    }
}
  • 配置多数据源

在配置文件配置多个数据源地址

spring:
  datasource-db1:
    url: jdbc:mysql://139.9.183.232:3306/test?useSSL=false&characterEncoding=utf8
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root

  datasource-db2:
    url: jdbc:mysql://139.9.183.232:3306/test?useSSL=false&characterEncoding=utf8
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root

初始化数据源和事务管理器

@Configuration
public class DatasourceConfig {

    /**
     * 数据源1
     * @return
     */
    @Bean(name = "DataSources.DB1")
    @ConfigurationProperties(prefix = "spring.datasource-db1")
    public DataSource dataSourceDb1() {
        return DataSourceBuilder.create().type(DruidDataSource.class).build();
    }

    /**
     * 数据源2
     * @return
     */
    @Bean(name = "DataSources.DB2")
    @ConfigurationProperties(prefix = "spring.datasource-db2")
    public DataSource dataSourceDb2() {
        return DataSourceBuilder.create().type(DruidDataSource.class).build();
    }

    /**
     * 事务管理器1
     * @param dataSource 数据源1
     * @return
     */
    @Primary
    @Bean("transactionManager.DB1")
    public DataSourceTransactionManager transactionManagerDB1(@Qualifier("DataSources.DB1") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * 事务管理器2
     * @param dataSource 数据源1
     * @return
     */
    @Bean("transactionManager.DB2")
    public DataSourceTransactionManager transactionManagerDB2(@Qualifier("DataSources.DB2") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

}

配置查询使用的SqlSessionFactoryBean

数据源一
配置com.example.springbootmysql03.mapper.db1包下使用sqlSessionFactoryBean.DB1数据源工厂

@Configuration
@MapperScan(value = "com.example.springbootmysql03.mapper.db1", sqlSessionFactoryRef = "sqlSessionFactoryBean.DB1")
public class MyBatisDB1Config {

    @Autowired
    @Qualifier("DataSources.DB1")
    private DataSource dataSource;

    @Bean("sqlSessionFactoryBean.DB1")
    public SqlSessionFactoryBean sqlSessionFactoryBean() {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }

}

数据源二
配置com.example.springbootmysql03.mapper.db2包下使用sqlSessionFactoryBean.DB2数据源工厂

@Configuration
@MapperScan(value = "com.example.springbootmysql03.mapper.db2", sqlSessionFactoryRef = "sqlSessionFactoryBean.DB2")
public class MyBatisDB2Config {

    @Autowired
    @Qualifier("DataSources.DB2")
    private DataSource dataSource;

    @Bean("sqlSessionFactoryBean.DB2")
    public SqlSessionFactoryBean sqlSessionFactoryBean() {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }

}

注意:在sqlsessionFactoryBean中可以配置加载xml配置文件

    // 解决配置到配置文件中通过*配置找不到mapper文件的问题。 如果不设置这一行,在配置文件中,只能使用数组的方式一个个的罗列出来,并且要指定具体的文件名
    sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper_db2/*.xml"));

不同数据源事务管理器的使用

@SpringBootTest
class SpringbootMysql03ApplicationTests {

    @Resource
    private User1Mapper user1Mapper;

    @Resource
    private User2Mapper user2Mapper;

    @Test
    @Transactional(transactionManager = "transactionManager.DB1")
    void testDB1() {
        System.out.println(user1Mapper.get());
    }

    @Test
    @Transactional(transactionManager = "transactionManager.DB2")
    void testDB2() {
        System.out.println(user2Mapper.get());
    }
}

完!