《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
这里我们使用两个数据库, 但是数据库的表结构一致(至少多数据源涉及到的表需要结构一致), 以避免不能共用一套代码
DataSourceType
public enum DataSourceType {
//NONE用来返回默认
NONE(“”),
DB1(“db1”),
DB2(“db2”),
;
//省略部分代码
}
复制代码
此文件是数据源的枚举, 这里的枚举我们只配置里一个参数, 可以依据业务扩展. 本枚举的值代表数据源的名称, 是和配置文件里的配置对应上的
另外说明一下, NONE是用来代表默认数据源的, 是为了方便编程添加的, 不是必须的
DataSourceUtil
public class DataSourceUtil {
private static final ThreadLocal localDataSource = new ThreadLocal<>();
private DataSourceUtil(){
}
public static DataSourceType get() {
return localDataSource.get();
}
public static void set(DataSourceType type){
localDataSource.set(type);
}
public static void remove() {
localDataSource.remove();
}
}
复制代码
数据源切换工具类, 这里的核心是ThreadLocal<DataSourceType>
变量, ThreadLocal以前有过文档分析, 主要是用来维护线程内部变量的, 其中:
-
get()方法用来获取数据源
-
set()方法用来设置数据源
-
remove()用来清除数据源
MybatisConfig*
@Configuration
@MapperScan(“jin.panpan.database.dao”)
public class MybatisConfig {
//默认数据源
@Primary
@Bean(“db1”)
@ConfigurationProperties(prefix = “spring.datasource.db1”)
public DataSource dataSource1(){
return DataSourceBuilder.create().build();
}
@Bean(“db2”)
@ConfigurationProperties(prefix = “spring.datasource.db2”)
public DataSource dataSource2(){
return DataSourceBuilder.create().build();
}
//动态数据源选择
@Bean
public DynamicDataSource dynamicDataSource(@Qualifier(“db1”) DataSource db1,
@Qualifier(“db2”) DataSource db2){
Map<Object, Object> map = new HashMap<>();
//此处的key 要和DynamicDataSource类的determineCurrentLookupKey方法返回值一致
map.put(DataSourceTy