创建数据库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