Spring Boot多數據源配置之JdbcTemplate

Spring Boot多數據源配置之JdbcTemplate

2019年03月17日 17:17:31 _江南一點雨 閱讀數:240 標籤: springboot 更多

個人分類: java

版權聲明:本文爲江南一點雨原創文章,未經允許,嚴禁轉載。 https://blog.csdn.net/u012702547/article/details/88622445

多數據源配置也算是一個常見的開發需求,Spring和SpringBoot中,對此都有相應的解決方案,不過一般來說,如果有多數據源的需求,我還是建議首選分佈式數據庫中間件MyCat去解決相關問題,之前有小夥伴在我的知識星球上提問,他的數據根據條件的不同,可能保存在四十多個不同的數據庫中,怎麼辦?這種場景下使用多數據源其實就有些費事了,我給的建議是使用MyCat,然後分表策略使用sharding-by-intfile。當然如果一些簡單的需求,還是可以使用多數據源的,Spring Boot中,JdbcTemplate、MyBatis以及Jpa都可以配置多數據源,本文就先和大夥聊一聊JdbcTemplate中多數據源的配置(關於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操作不同的數據源,實現了多數據源配置。

好了,這個問題就先說到這裏,關於這個多數據源配置,還有一個小小的視頻教程,加入我的星球免費觀看:
在這裏插入圖片描述

關於我的星球【Java達摩院】,大夥可以參考這篇文章推薦一個技術圈子,Java技能提升就靠它了.

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章