Spring Boot2 系列教程(二十)Spring Boot 整合JdbcTemplate 多數據源


多數據源配置也算是一個常見的開發需求,Spring 和 SpringBoot 中,對此都有相應的解決方案,不過一般來說,如果有多數據源的需求,我還是建議首選分布式數據庫中間件 MyCat 去解決相關問題,之前有小伙伴在我的知識星球上提問,他的數據根據條件的不同,可能保存在四十多個不同的數據庫中,怎么辦?這種場景下使用多數據源其實就有些費事了,我給的建議是使用 MyCat,然后分表策略使用 sharding-by-intfile 。

當然如果一些簡單的需求,還是可以使用多數據源的,Spring Boot 中,JdbcTemplate、MyBatis 以及 Jpa 都可以配置多數據源,本文就先和大伙聊一聊 JdbcTemplate 中多數據源的配置(關於JdbcTemplate的用法,如果還有小伙伴不了解,可以參考我的 Spring Boot2 系列教程(十九)Spring Boot 整合 JdbcTemplate)。

創建工程

首先是創建工程,和前文一樣,創建工程時,也是選擇 Web、Jdbc 以及 MySQL 驅動,如下圖:

創建成功之后,一定接下來手動添加 Druid 依賴,由於這里一會需要開發者自己配置 DataSoruce,所以這里必須要使用 druid-spring-boot-starter 依賴,而不是傳統的那個 druid 依賴,因為 druid-spring-boot-starter 依賴提供了 DruidDataSourceBuilder 類,這個可以用來構建一個 DataSource 實例,而傳統的 Druid 則沒有該類。完整的依賴如下:

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

配置數據源

接下來,在 application.properties 中配置數據源,不同於上文,這里的數據源需要配置兩個,如下:

spring.datasource.one.url=jdbc:mysql:///test01?useUnicode=true&characterEncoding=utf-8
spring.datasource.one.username=root
spring.datasource.one.password=root
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.two.url=jdbc:mysql:///test02?useUnicode=true&characterEncoding=utf-8
spring.datasource.two.username=root
spring.datasource.two.password=root
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource

這里通過 one 和 two 對數據源進行了區分,但是加了 one 和 two 之后,這里的配置就沒法被 SpringBoot 自動加載了(因為前面的 key 變了),需要我們自己去加載 DataSource 了,此時,需要自己配置一個 DataSourceConfig,用來提供兩個 DataSource Bean,如下:

@Configuration
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.one")
    DataSource dsOne() {
        return DruidDataSourceBuilder.create().build();
    }
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.two")
    DataSource dsTwo() {
        return DruidDataSourceBuilder.create().build();
    }
}

這里提供了兩個 Bean,其中 @ConfigurationProperties 是 Spring Boot 提供的類型安全的屬性綁定,以第一個Bean為例, @ConfigurationProperties(prefix = "spring.datasource.one") 表示使用 spring.datasource.one 前綴的數據庫配置去創建一個 DataSource,這樣配置之后,我們就有了兩個不同的 DataSource,接下來再用這兩個不同的 DataSource 去創建兩個不同的 JdbcTemplate。

配置 JdbcTemplate 實例

創建 JdbcTemplateConfig 類,用來提供兩個不同的 JdbcTemplate 實例,如下:

@Configuration
public class JdbcTemplateConfig {
    @Bean
    JdbcTemplate jdbcTemplateOne(@Qualifier("dsOne") DataSource dsOne) {
        return new JdbcTemplate(dsOne);
    }
    @Bean
    JdbcTemplate jdbcTemplateTwo(@Qualifier("dsTwo") DataSource dsTwo) {
        return new JdbcTemplate(dsTwo);
    }
}

每一個 JdbcTemplate 的創建都需要一個 DataSource,由於 Spring 容器中現在存在兩個 DataSource,默認使用類型查找,會報錯,因此加上 @Qualifier 注解,表示按照名稱查找。這里創建了兩個 JdbcTemplate 實例,分別對應了兩個 DataSource。

接下來直接去使用這個 JdbcTemplate 就可以了。

測試使用

關於 JdbcTemplate 的詳細用法大伙可以參考我的上篇文章,這里我主要演示數據源的差異,在 Controller 中注入兩個不同的 JdbcTemplate ,這兩個 JdbcTemplate 分別對應了不同的數據源,如下:

@RestController
public class HelloController {
    @Autowired
    @Qualifier("jdbcTemplateOne")
    JdbcTemplate jdbcTemplateOne;
    @Resource(name = "jdbcTemplateTwo")
    JdbcTemplate jdbcTemplateTwo;

    @GetMapping("/user")
    public List<User> getAllUser() {
        List<User> list = jdbcTemplateOne.query("select * from t_user", new BeanPropertyRowMapper<>(User.class));
        return list;
    }
    @GetMapping("/user2")
    public List<User> getAllUser2() {
        List<User> list = jdbcTemplateTwo.query("select * from t_user", new BeanPropertyRowMapper<>(User.class));
        return list;
    }
}

和 DataSource 一樣,Spring 容器中的 JdbcTemplate 也是有兩個,因此不能通過 byType 的方式注入進來,這里給大伙提供了兩種注入思路,一種是使用 @Resource 注解,直接通過 byName 的方式注入進來,另外一種就是 @Autowired 注解加上 @Qualifier 注解,兩者聯合起來,實際上也是 byName。將 JdbcTemplate 注入進來之后,jdbcTemplateOne 和 jdbcTemplateTwo 此時就代表操作不同的數據源,使用不同的 JdbcTemplate 操作不同的數據源,實現了多數據源配置。

好了,這個問題就先說到這里,感興趣的小伙伴也可以參考相關案例:https://github.com/lenve/javaboy-code-samples

關注公眾號【江南一點雨】,專注於 Spring Boot+微服務以及前后端分離等全棧技術,定期視頻教程分享,關注后回復 Java ,領取松哥為你精心准備的 Java 干貨!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM