Springboot项目根据项目环境变量去切换指定项目的唯一数据源
需求:项目本身是mysql的数据库,由于客户无法使用mysql,需要适配一套sqlerver数据源,mysql数据源也不能移除,以后可能会出现其他数据库适配
1、根据项目的动态变量的值去指定数据源类型(需要制定严格规范)
2、代码中需要获取变量的值去加载配置制定的数据源
3、不同的数据源指向不用的mapper.xml文件夹目录,执行不用的sql语句
Idea中设置环境变量(key-value)的位置以及获取方式![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/19b5bc6745204c705eb5fe9a081757e2.png)
变量获取方式:(数据库类型,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的的文件夹目录示意