代码作者:干货食堂
我写这个博客只是怕作者删除文档 我找不到原链接
依赖下面代码块
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ganhuoshitang</groupId>
<artifactId>multiple-data-sources</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>multiple-data-sources</name>
<description>多数据源mybatis版本--公众号:干货食堂</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml下面代码
# mysql
spring:
datasource:
db1:
driver-class-name: com.mysql.cj.jdbc.Driver
# springboot 2.6.1之后换数据库连接池了,要换成jdbc-url 之前是url 这点是个坑
jdbc-url: jdbc:mysql://127.0.0.1:3306/gsc-account?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
username: root
password: 123456
db2:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/gsc-order?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
username: root
password: 123456
启动类下面
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
/**
* 公众号:干货食堂
*/
@MapperScan("com.ganhuoshitang.multipledatasources.mapper")
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MultipleDataSourcesApplication {
public static void main(String[] args) {
SpringApplication.run(MultipleDataSourcesApplication.class, args);
}
}
DataSourceConfig.java配置类
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.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
/**
* 数据源切换工具
* @author 公众号:干货食堂
*/
@Configuration
//@MapperScan(basePackages = {"com.ganhuoshitang.multipledatasources.mapper.db1"}, sqlSessionFactoryRef = "sqlSessionFactory1")
public class DataSourceConfig {
/**
* 数据源1
* spring.datasource.db1:application.properteis中对应属性的前缀
* @return
*/
@Bean(name = "db1")
@ConfigurationProperties(prefix = "spring.datasource.db1")
public DataSource dataSourceOne() {
return DataSourceBuilder.create().build();
}
/**
* 数据源2
* spring.datasource.db2:application.properteis中对应属性的前缀
* @return
*/
@Bean(name = "db2")
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource dataSourceTwo() {
return DataSourceBuilder.create().build();
}
/**
* 动态数据源: 通过AOP在不同数据源之间动态切换
* @return
*/
@Bean(name = "dynamicDataSource")
@Primary
public DataSource dynamicDataSource(@Qualifier("db1") DataSource db1,@Qualifier("db2") DataSource db2) {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
// 默认数据源
dynamicDataSource.setDefaultTargetDataSource(db1);
// 配置多数据源
Map<Object, Object> dsMap = new HashMap<>();
dsMap.put("db1", db1);
dsMap.put("db2", db2);
dynamicDataSource.setTargetDataSources(dsMap);
return dynamicDataSource;
}
/**
* 配置@Transactional注解
* @return
*/
@Bean
public PlatformTransactionManager transactionManager(@Qualifier("dynamicDataSource") DataSource dynamicDataSource) {
return new DataSourceTransactionManager(dynamicDataSource);
}
}
DataSourceUtil.java配置类代码下面
/**
* @author 公众号:干货食堂
*/
public class DataSourceUtil {
private static final ThreadLocal<String> contextHolder = new ThreadLocal();
/**
* 设置数据源名
* @param dbType
*/
public static void setDB(String dbType) {
contextHolder.set(dbType);
}
/**
* 获取数据源名
* @return
*/
public static String getDB() {
return contextHolder.get();
}
/**
* 清除数据源名
*/
public static void clearDB() {
contextHolder.remove();
}
}
DynamicDataSource.java代码下面
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
* @author 公众号:干货食堂
*/
@Slf4j
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
log.info("动态获取数据源——{}",DataSourceUtil.getDB());
return DataSourceUtil.getDB();
}
}
controller代码下面
import com.ganhuoshitang.multipledatasources.config.DataSourceUtil;
import com.ganhuoshitang.multipledatasources.entity.Account;
import com.ganhuoshitang.multipledatasources.entity.Orders;
import com.ganhuoshitang.multipledatasources.mapper.AccountMapper;
import com.ganhuoshitang.multipledatasources.mapper.OrdersMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author: 公众号:干货食堂
* Project Name: multiple-data-sources
* File Name: TestController
* Package Name: com.ganhuoshitang.multipledatasources.controller
* Date: 2022/6/7 22:33
* Copyright (c) 2022,All Rights Reserved.
* @Description
*/
@RestController
@RequestMapping("test")
public class TestController {
@Autowired
AccountMapper accountMapper;
@Autowired
OrdersMapper ordersMapper;
@GetMapping("addAccount")
public Account addAccount(){
Account account = new Account();
account.setUserId(1);
account.setUpdateTime(new Date());
account.setBalance(new BigDecimal(1));
accountMapper.insert(account);
return account;
}
@GetMapping("addOrder")
public Orders addOrder(){
DataSourceUtil.setDB("db2");
Orders orders = new Orders();
orders.setUserId(1);
orders.setUpdateTime(new Date());
orders.setAddTime(new Date());
orders.setPayAmount(new BigDecimal(1));
orders.setProductId(1);
ordersMapper.insert(orders);
return orders;
}
}
如果爆数据路url之类的问题
参考
spring:
main:
banner-mode: console
banner:
image:
location: banner.png
datasource: #数据库
db1:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/springboot_study
username: root
password: root
db2:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/test
username: root
password: root
db3:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/test2
username: root
password: root