1. 程式人生 > 其它 >SpringBoot 整合JdbcTemplate 多資料來源

SpringBoot 整合JdbcTemplate 多資料來源

多資料來源

所謂多資料來源,就是一個Java EE專案中採用了不同資料庫例項中的多個庫,或者同一個資料庫例項中多個不同的庫。一般來說,採用MyCat等分散式資料庫中介軟體是比較好的解決方案,這樣可以把資料庫讀寫分離、分庫分表、備份等操作交給中介軟體去做,Java程式碼只需要專注於業務即可。不過,這並不意味著無法使用Java程式碼解決類似的問題,在Spring Framework中就可以配置多資料來源,Spring Boot繼承其衣缽,只不過配置方式有所變化

因為一個JdbcTemplate對應一個DataSource,開發者只需要手動提供多個DataSource,再手動配置JdbcTemplate即可。

新增如下依賴:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId
>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</
version> </dependency>

這裡新增的資料庫連線池依賴是druid-spring-boot-starter。druid-spring-boot-starter可以幫助開發者在Spring Boot專案中輕鬆整合Druid資料庫連線池和監控。

配置資料庫連線:

spring:
  datasource:
    boot:
      type: com.alibaba.druid.pool.DruidDataSource
      url: jdbc:mysql://localhost:3306/boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
      username: root
      password: 123456
    boot2:
      type: com.alibaba.druid.pool.DruidDataSource
      url: jdbc:mysql://localhost:3306/boot2?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
      username: root
      password: 123456

配置資料來源:

建立DataSourceConfig配置資料來源,根據application.yml中的配置生成兩個資料來源:

@Configuration
public class DataSourceConfig {

    @Primary
    @Bean
    @ConfigurationProperties("spring.datasource.boot")
    DataSource dsOne() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.boot2")
    DataSource dsTwo() {
        return DruidDataSourceBuilder.create().build();
    }

}

  

配置JdbcTemplate:

只要引入了spring-jdbc依賴,那麼開發者沒有提供JdbcTemplate例項時,Spring Boot預設會提供一個JdbcTemplate例項。現在配置多資料來源時,由開發者自己提供JdbcTemplate例項

@Configuration
public class JdbcTemplateConfig {

    @Primary
    @Bean
    JdbcTemplate jdbcTemplateOne(@Qualifier("dsOne") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean
    JdbcTemplate jdbcTemplateTwo(@Qualifier("dsTwo") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

}

  

建立BookController:

@RestController
public class BookController {

    @Resource(name = "jdbcTemplateOne")
    JdbcTemplate jdbcTemplate;

    @Autowired
    @Qualifier("jdbcTemplateTwo")
    JdbcTemplate jdbcTemplateTwo;

    @GetMapping("/test1")
    public void test1() {
        List<Book> books1 = jdbcTemplate.query("select * from book", new BeanPropertyRowMapper<>(Book.class));
        List<Book> books2 = jdbcTemplateTwo.query("select * from book", new BeanPropertyRowMapper<>(Book.class));
        System.out.println("books1:" + books1);
        System.out.println("books2:" + books2);
    }
}

簡單起見,這裡沒有新增Service層,而是直接將JdbcTemplate注入到了Controller中。在Controller中注入兩個不同的JdbcTemplate有兩種方式:一種是使用@Resource註解,並指明name屬性,即按name進行裝配,此時會根據例項名查詢相應的例項注入;另一種是使用@Autowired註解結合@Qualifier註解,效果等同於使用@Resource註解。

文章來源:Spring Boot+Vue全棧開發實戰 5.4 多資料來源