springboot +mybatis-plus 动态切换数据库 ,数据库连接信息存入表中 超简单。

如果是 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> {

}

大功告成 之后去测试
springboot +mybatis-plus 动态切换数据库 ,数据库连接信息存入表中 超简单。
创建多个数据库测试
启动 。。查看数据源 现在是一个默认数据源
springboot +mybatis-plus 动态切换数据库 ,数据库连接信息存入表中 超简单。
看看数据
springboot +mybatis-plus 动态切换数据库 ,数据库连接信息存入表中 超简单。
添加一个数据源名称是yuan的
springboot +mybatis-plus 动态切换数据库 ,数据库连接信息存入表中 超简单。

在请求数据
springboot +mybatis-plus 动态切换数据库 ,数据库连接信息存入表中 超简单。
我们如果想切换其他数据源,可以删除 当前 yuan数据源, 在创建一个yuan数据源
就可以完成数据源的切换。

上一篇:C语言编程小tip


下一篇:子项目的逆向工程-代码生成器