跳转至

使用單個 or 多個資料庫連線設定

單個資料庫連線設定

application.properties

# Database settings
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3308/myjdbc?serverTimezone=Asia/Taipei&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=ji#@k7au$a83

Spring JDBC 自動生成 NamedParameterJdbcTemplate Bean 出來

我們就可以去注入這個bean 然後去使用他的 update 方法 或是 query 方法

去執行相對應的sql 語法

多個資料庫連線設定

application.properties

# 多個資料庫的連線設定
spring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.test1.url=jdbc:mysql://localhost:3308/test1?serverTimezone=Asia/Taipei&characterEncoding=utf-8
spring.datasource.test1.username=root
spring.datasource.test1.password=ji#@k7au$a83

spring.datasource.test2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.test2.url=jdbc:mysql://localhost:3308/test2?serverTimezone=Asia/Taipei&characterEncoding=utf-8
spring.datasource.test2.username=root
spring.datasource.test2.password=ji#@k7au$a83 

當你想要去連線到多個資料庫的時候

  1. 必須在這個datasource後面指定說這一組資料庫連線設定 是要連線到哪一個資料庫上
  2. 單個是 url , 多個是 jdbc-url

運作方式

步驟

  1. application.properties
  2. 上面有所以略..
  3. DataSourceConfiguration
  4. @Configuration Spring Boot設定
  5. prefix 對應到 application.properties
  6. @Qualifier 因為有多個所以要指定
package com.example.demo;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfiguration {

    // 連線到 test1 資料庫的 DataSource 和 NamedParameterJdbcTemplate
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    public DataSource test1DataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean
    public NamedParameterJdbcTemplate test1JdbcTemplate(
            @Qualifier("test1DataSource") DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }

    // 連線到 test2 資料庫的 DataSource 和 NamedParameterJdbcTemplate
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    public DataSource test2DataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean
    public NamedParameterJdbcTemplate test2JdbcTemplate(
            @Qualifier("test2DataSource") DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }
}
  1. controller

  2. @Qualifier("test1JdbcTemplate") 指定bean

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class DataSourceController {

    @Autowired
    @Qualifier("test1JdbcTemplate") // 指定
    private NamedParameterJdbcTemplate test1JdbcTemplate;

    @Autowired
    @Qualifier("test2JdbcTemplate")
    private NamedParameterJdbcTemplate test2JdbcTemplate;

    @PostMapping("/test1/students")
    public String test1Insert(@RequestBody Student student){
        String sqlstr = "insert into student(name) value (:studentName)";
        Map<String ,Object> map = new HashMap<>();
        map.put("studentName" ,student.getName());
        test1JdbcTemplate.update(sqlstr ,map);
        return "插入數據到 test1 資料庫";
    }

    @PostMapping("/test2/students")
    public String test2Insert(@RequestBody Student student){
        String sqlstr = "insert into student(name) value (:studentName)";
        Map<String ,Object> map = new HashMap<>();
        map.put("studentName" ,student.getName());
        test2JdbcTemplate.update(sqlstr ,map);
        return "插入數據到 test1 資料庫";
    }
}