如果是 mybatis 的话,这篇博客讲的很清楚:传送阵
还有一遍文章讲的 mybatis-puls 多数据源 非常好:传送阵
开始之前最好是先过一遍 mybatis-puls 官网讲的多数据源文档:传送阵
在重点看看 数据源的 增 删 改 查 :传送阵
上面 信息不看 也可以 主要是看下面这个动态数据源,上面的看看,可以加深理解。
在看看这个 动态数据源 基本就可以了:传送阵
springboot-mybatis-puls 项目搭建 自行搭建吧,推荐一个博客讲的比较好:传送阵
接下来就是代码环节了,特少
创建一个 储存数据库连接信息的表
CREATE TABLE `yx_substation` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`ip_address` varchar(255) DEFAULT NULL COMMENT 'ip地址',
`port` varchar(10) DEFAULT NULL COMMENT '端口号',
`account` varchar(255) DEFAULT NULL COMMENT '数据库账号',
`password` varchar(255) DEFAULT NULL COMMENT '数据库密码',
`database_name` varchar(255) DEFAULT NULL COMMENT '数据库名称',
`mark` varchar(255) DEFAULT NULL COMMENT '分站标识',
`create_time` datetime DEFAULT NULL COMMENT '添加时间',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='分站表';
依赖
<!-- SpringBoot 核心包 -->
<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>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--mybatis-puls 依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-core -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>3.4.2</version>
</dependency>
<!--mybatis-puls 代码生成依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<!--多数据源 依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
添加配置信息
这个 看完基本就会了:https://www.yuque.com/fishball-sdk5o/uszavm/qhoym4
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
datasource:
master:
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/yshop_cloud_mall?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
创建实体类 和 语雀上面的文档一样
package com.example.source.entity;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class DataSourceDTO {
//连接池名称,如slave_1
private String pollName;
private String driverClassName;
private String url;
private String username;
private String password;
}
控制层代码
package com.example.source.controller;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.DataSourceCreator;
import com.baomidou.dynamic.datasource.creator.DruidDataSourceCreator;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.example.source.entity.DataSourceDTO;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.DataSource;
import java.util.Set;
@RestController
@AllArgsConstructor
@RequestMapping("/data")
public class LoadController {
private final DataSource dataSource;
private final DataSourceCreator dataSourceCreator; //3.3.1及以下版本使用這個
//private final DefaultDataSourceCreator dataSourceCreator; //3.3.2及以上版本使用這個
private final DruidDataSourceCreator druidDataSourceCreator;
/**
* 获取当前所有数据源
* @return
*/
@GetMapping
public Set<String> now() {
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
return ds.getCurrentDataSources().keySet();
}
/**
* 添加数据源
* @return
*/
@PostMapping("/add")
public Set<String> add(DataSourceDTO dto) {
DataSourceProperty dataSourceProperty = new DataSourceProperty();
BeanUtils.copyProperties(dto, dataSourceProperty);
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
DataSource dataSource = dataSourceCreator.createDataSource(dataSourceProperty);
ds.addDataSource(dto.getPollName(), dataSource);
return ds.getCurrentDataSources().keySet();
}
/**
* 删除数据源
* @return
*/
@PostMapping("remove")
public String remove(String name) {
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
ds.removeDataSource(name);
return "删除成功";
}
}
随便写一个 查看数据库表 信息的Controller层测试使用
这个使用我自己的,可以根据自己的情况来写,
package com.example.source.controller;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.example.source.entity.YxUser;
import com.example.source.mapper.YxUserMapper;
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.util.List;
/**
* <p>
* 用户表 前端控制器
* </p>
*
* @author astupidcoder
* @since 2021-04-20
*/
@RestController
@RequestMapping("/yxUser")
public class YxUserController {
@Autowired
private YxUserMapper yxUserMapper;
@GetMapping("")
public String get(){
List<YxUser> yxUsers = yxUserMapper.selectList(null);
return yxUsers.toString();
}
}
接下来比较重要的
@DS(“yuan”) 注解 意思是,使用那个数据源,我们默认所有 mapper层都去走 yuan这个数据源,当这个yuan数据源被我们动态删除 后 代码就会去 找 我们yml配置的默认数据源,这样就能 来回切换数据源了。。其他的就是删除数据源,和添加数据源 的操作
package com.example.source.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.example.source.entity.YxUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 用户表 Mapper 接口
* </p>
*
* @author astupidcoder
* @since 2021-04-20
*/
@DS("yuan")
public interface YxUserMapper extends BaseMapper<YxUser> {
}
大功告成 之后去测试
创建多个数据库测试
启动 。。查看数据源 现在是一个默认数据源
看看数据
添加一个数据源名称是yuan的
在请求数据
我们如果想切换其他数据源,可以删除 当前 yuan数据源, 在创建一个yuan数据源
就可以完成数据源的切换。