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 多資料來源