SpringBoot 动态数据源

创建数据库sys_DataSource 

POM

<!-- druid 连接池 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
		</dependency>
		<!--mybatis plus多数据源-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
		</dependency>

数据源相关常量

/**
 * <p>
 * 数据源相关常量
 */
public interface DataSourceConstants {
	/**
	 * 默认的数据源名称
	 */
	String DS_MASTER = "master";
	/**
	 * 数据源查询SQL
	 */
	String DS_QUERY_SQL = "";

	/**
	 * 数据源名称
	 */
	String DS_NAME = "name";

	/**
	 * jdbcurl
	 */
	String DS_JDBC_URL = "url";

	/**
	 * 用户名
	 */
	String DS_USER_NAME = "username";

	/**
	 * 密码
	 */
	String DS_USER_PWD = "password";

}

工具类DynamicDataSourceUtils 

添加移动和校验数据源

import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.DataSourceCreator;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import javax.sql.DataSource;
import java.sql.DriverManager;
import java.sql.SQLException;

@Slf4j
@AllArgsConstructor
public class DynamicDataSourceUtils {

	private DynamicRoutingDataSource dynamicRoutingDataSource;
	private DataSourceCreator druidDataSourceCreator;

	/**
	 * 添加动态数据源
	 * @param dataSourceProperty
	 */
	public void addDataSource(DataSourceProperty dataSourceProperty) {
		DataSource dataSource = druidDataSourceCreator.createDataSource(dataSourceProperty);
		dynamicRoutingDataSource.addDataSource(dataSourceProperty.getPoolName(), dataSource);
	}

	/**
	 * 移除动态数据源
	 * @param ds
	 */
	public void removeDataSource(String ds){
		dynamicRoutingDataSource.removeDataSource(ds);
	}

	/**
	 * 校验数据源配置是否能链接
	 * @param dataSourceProperty
	 * @return
	 * @throws SQLException
	 */
	public void checkDataSource(DataSourceProperty dataSourceProperty) {
		try {
			DriverManager.getConnection(dataSourceProperty.getUrl(),dataSourceProperty.getUsername(),dataSourceProperty.getPassword());
		}catch (SQLException e){
			log.error(e.getMessage(), e);
			throw new RuntimeException("连接失败,请检查配置信息:" + e.getMessage());
		}
	}
}

数据库保存数据源并添加动态数据源

/**
	 * 保存数据源并且加密
	 *
	 * @param sysDatasource
	 * @return
	 */
	@Override
	public Boolean saveSysDatasource(SysDatasource sysDatasource) {
		DataSourceProperty dataSourceProperty = new DataSourceProperty();
		dataSourceProperty.setPoolName(sysDatasource.getName());
		dataSourceProperty.setUrl(sysDatasource.getUrl());
		dataSourceProperty.setUsername(sysDatasource.getUsername());
		dataSourceProperty.setPassword(sysDatasource.getPassword());
		//校验数据源配置是否能链接
		dynamicDataSourceUtils.checkDataSource(dataSourceProperty);
		//添加动态数据源
		dynamicDataSourceUtils.addDataSource(dataSourceProperty);
		sysDatasource.setPassword(stringEncryptor.encrypt(sysDatasource.getPassword()));
		sysDatasource.setTenantId(null);
		this.baseMapper.insert(sysDatasource);
		return Boolean.TRUE;
	}

数据库更新数据源资料

/**
	 * 更新数据源
	 *
	 * @param sysDatasource
	 * @return
	 */
	@Override
	public Boolean updateSysDatasource(SysDatasource sysDatasource) {
		DataSourceProperty dataSourceProperty = new DataSourceProperty();
		dataSourceProperty.setPoolName(sysDatasource.getName());
		dataSourceProperty.setUrl(sysDatasource.getUrl());
		dataSourceProperty.setUsername(sysDatasource.getUsername());
		dataSourceProperty.setPassword(sysDatasource.getPassword());
		//校验数据源配置是否能链接
		dynamicDataSourceUtils.checkDataSource(dataSourceProperty);
		//先删除动态数据源
		dynamicDataSourceUtils.removeDataSource(baseMapper.selectById(sysDatasource.getId()).getName());
		//再添加动态数据源
		dynamicDataSourceUtils.addDataSource(dataSourceProperty);
		if (StrUtil.isNotBlank(sysDatasource.getPassword())) {
			sysDatasource.setPassword(stringEncryptor.encrypt(sysDatasource.getPassword()));
		}
		this.baseMapper.updateById(sysDatasource);
		return Boolean.TRUE;
	}

切换数据源

DynamicDataSourceContextHolder.push(DataSourceConstants.DS_MASTER);//切回主数据源

主要源码

链接:https://pan.baidu.com/s/1bN4_Ee2vVqD2mcKcWb_Auw 
提取码:512u

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值