springboot项目,根据项目环境变量去切换项目的唯一数据源

Springboot项目根据项目环境变量去切换指定项目的唯一数据源

需求:项目本身是mysql的数据库,由于客户无法使用mysql,需要适配一套sqlerver数据源,mysql数据源也不能移除,以后可能会出现其他数据库适配
1、根据项目的动态变量的值去指定数据源类型(需要制定严格规范)
2、代码中需要获取变量的值去加载配置制定的数据源
3、不同的数据源指向不用的mapper.xml文件夹目录,执行不用的sql语句

Idea中设置环境变量(key-value)的位置以及获取方式在这里插入图片描述

在这里插入图片描述
变量获取方式:(数据库类型,ip,端口号,数据库,账号,密码都需要在变量中配置)

	/**
     * 获取环境变量中取数据库的类型(1:sqlserver 3:mysql)三元运算符获取,没有就给默认的一套
     * DatabaseType就是key
     */
    private static String databaseType = ObjectUtils.isEmpty(System.getenv("DatabaseType")) ? "3" : System.getenv("DatabaseType");
代码:
package sol.edrms.config.checkdatasource;

import com.zaxxer.hikari.HikariDataSource;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import sol.edrms.common.constants.CheckDataSourceConstants;

import javax.sql.DataSource;

/**
 * @Date 2021/5/24 15:12
 * @Description 根据变量去加载不同的数据库连接
 */
@Configuration
@MapperScan(basePackages = {"sol.edrms.dao.*"}) // 指向dao层接口文件
public class CheckDataSourceConfig {

    /**
     * 获取当前配置文件环境(dev/prod,dev本地测试环境)
     */
    @Value("${spring.profiles.active}")
    private String active;

	// 本地测试环境的mapper.xml路径
    @Value("${mybatis.mapper-locations}")
    private String resourcesClasspath;

	// dev环境下dev.yml的数据源获取
    @Autowired
    private DataSourceProperties dataSourceProperies;


    /**
     * 通过环境变量去获取数据库的类型(1:sqlserver 3:mysql)
     */
    private static String databaseType = ObjectUtils.isEmpty(System.getenv("DatabaseType")) ? "3" : System.getenv("DatabaseType");

    /**
     * 数据库地址
     */
    private static String databaseServerName = ObjectUtils.isEmpty(System.getenv("DatabaseServerName")) ? "mysql" : System.getenv("DatabaseServerName");

    /**
     * 数据库名称
     */
    private static String databaseName = ObjectUtils.isEmpty(System.getenv("DatabaseName")) ? "xxxx" : System.getenv("DatabaseName");

    /**
     * 端口号
     */
    private static String databaseServerPort = ObjectUtils.isEmpty(System.getenv("DatabaseServerPort")) ? "xxxx" : System.getenv("DatabaseServerPort");

    /**
     * 用户名
     */
    private static String databaseUserName = ObjectUtils.isEmpty(System.getenv("DatabaseUserName")) ? "xxxx" : System.getenv("DatabaseUserName");

    /**
     * 密码
     */
    private static String databasePassword = ObjectUtils.isEmpty(System.getenv("DatabasePassword")) ? "xxxx" : System.getenv("DatabasePassword");


    /**
     * mysql驱动
     */
    private static String mysqlClassName = "com.mysql.cj.jdbc.Driver";

    /**
     * sqlserver驱动
     */
    private static String sqlserverClassName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";


    @Bean
    DataSource getDataSource() {

        // 先判断当前环境 dev走dev的数据库环境(方便本地测试用的)
        if (CheckDataSourceConstants.ACTIVE.equals(active)) {
            // dev环境的数据库参数
            HikariDataSource dataSource = new HikariDataSource();
            dataSource.setDriverClassName(dataSourceProperies.getDriverClassName());
            dataSource.setJdbcUrl(dataSourceProperies.getUrl());
            dataSource.setUsername(dataSourceProperies.getUserName());
            dataSource.setPassword(dataSourceProperies.getPassword());
            return dataSource;
        } else if (CheckDataSourceConstants.MYSQL.equals(databaseType)) {
            // 变量中的mysql参数
            HikariDataSource dataSource = new HikariDataSource();
            String mysqlUrl = "jdbc:mysql://" + databaseServerName + ":" + databaseServerPort + "/" + databaseName + "?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true";
            dataSource.setDriverClassName(mysqlClassName);
            dataSource.setJdbcUrl(mysqlUrl);
            dataSource.setUsername(databaseUserName);
            dataSource.setPassword(databasePassword);
            return dataSource;
        } else if (CheckDataSourceConstants.SQL_SERVER.equals(databaseType)) {
            // sqlserver
            HikariDataSource dataSource = new HikariDataSource();
            String sqlserverUrl = "jdbc:sqlserver://" + databaseServerName + ":" + databaseServerPort + ";DatabaseName=" + databaseName + "";
            dataSource.setDriverClassName(sqlserverClassName);
            dataSource.setJdbcUrl(sqlserverUrl);
            dataSource.setUsername(databaseUserName);
            dataSource.setPassword(databasePassword);
            return dataSource;
        }
        return null;
    }


    @Bean
    SqlSessionFactory getSqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(getDataSource());
		
        if (CheckDataSourceConstants.ACTIVE.equals(active)) {
           // dev环境的数据源
            sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(resourcesClasspath));
        }else {
            // 设置mapper.xml文件的路径
            if (CheckDataSourceConstants.MYSQL.equals(databaseType)) {
                // mysql
                sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mysql/**/*.xml"));
            } else if (CheckDataSourceConstants.SQL_SERVER.equals(databaseType)) {
                // sqlserver
                sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/sqlserver/**/*.xml"));
            }
        }
        return sqlSessionFactoryBean.getObject();
    }
}

mapper.xml的的文件夹目录示意
在这里插入图片描述

OK,这样项目初始化就会根据变量去加载指定的数据源,从而完成动态切换项目的数据源,就是后期比较麻烦,mysql写一套,sqlserver 也需要同步一套,sqlserver和mysql的语法也不一样,比较恶心~~~
有问题环境随时私信留言,看到就回……
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橡皮擦不去的争执

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值