通用mapper集成双数据源
一个动态数据源(多数据源动态切换) 一个非动态数据源
非动态
@Configuration
@MapperScan(basePackages = {"com.company.push.push.**.mapper"}, sqlSessionTemplateRef = "userSqlSessionTemplate")
public class PushMybatisConfig {
@Value("${push.mybatis.mapperLocations}")
private String mainMapper;
@Bean(name = "userDataSource")
@Primary
@ConfigurationProperties(prefix = "push.datasource")
public DataSource userDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "masterTransactionManger")
@Primary
public DataSourceTransactionManager masterTransactionManger(@Qualifier("userDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
@Primary
public SqlSessionFactory userSqlSessionFactory(@Qualifier("userDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setVfs(SpringBootVFS.class);
bean.setTypeAliasesPackage("com.companyPush");
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
bean.setMapperLocations(resolver.getResources(mainMapper));
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Bean
@Primary
public SqlSessionTemplate userSqlSessionTemplate(@Qualifier("userSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory);
return template;
}
@Bean(name = "mainJdbcTemplate")
public JdbcTemplate mainJdbcTemplate(@Qualifier("userDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
配置 多数据源(动态切换多数据源)
@Configuration
@MapperScan(basePackages = {"com.company.push.yewu.**.mapper"}, sqlSessionTemplateRef = "yewuSqlSessionTemplate")
public class DataSourceConfig {
@Value("${yewu.mybatis.mapperLocations}")
private String yewuMapper;
@Bean
@ConfigurationProperties(prefix = "yewu.datasource")
public DataSource defaultDataSource(){
DataSource build = DataSourceBuilder.create().build();
return build;
}
@Bean("yewuDataSource")
public DynamicDataSource dynamicDataSource(DataSource dataSource){
DynamicDataSource dynamicDataSource = new DynamicDataSource(dataSource);
return dynamicDataSource;
}
@Bean
public SqlSessionFactory yewuSqlSessionFactory(@Qualifier("yewuDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
bean.setMapperLocations(resolver.getResources(yewuMapper));
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Bean
public SqlSessionTemplate yewuSqlSessionTemplate(@Qualifier("yewuSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory);
return template;
}
@Bean(name = "yewuJdbcTemplate")
public JdbcTemplate yewuJdbcTemplate(@Qualifier("yewuDataSource") DataSource dataSource){
return new JdbcTemplate(dataSource);
}
}
@Component
public class DataSourceUtil {
@Autowired
private DynamicDataSource dynamicDataSource;
private final ThreadLocal<String> contextHolder = ThreadLocal.withInitial(() -> "defaultDataSource");
public void setDataSourceKey(String key) {
contextHolder.set(key);
dynamicDataSource.afterPropertiesSet();
}
public String getDataSourceKey() {
return contextHolder.get();
}
public void clearDataSourceKey() {
contextHolder.remove();
}
public void addDataSource(String tenantId, DataSource dataSource) {
if (!dynamicDataSource.isExistDataSource(tenantId)) {
dynamicDataSource.addDataSource(tenantId, dataSource);
}
setDataSourceKey(tenantId);
dynamicDataSource.afterPropertiesSet();
}
}
@Data
@Component
@ConfigurationProperties(prefix = "dynamicdatasource")
public class DynamicDataSourceConfig {
private Map<String, Map<String,Object>> list;
}
@Data
public class DynamicDataSourceConfiguration {
private Map<String, DataSource> dynamicDataSource;
}
@Configuration
public class MyAppConfig {
Logger log = LoggerFactory.getLogger(MyAppConfig.class);
@Autowired
private DynamicDataSourceConfig dynamicDataSourceConfig;
@Bean
public DynamicDataSourceConfiguration addDynamicDataSourceConfiguration(){
log.info("初始化动态数据源......");
DynamicDataSourceConfiguration dynamicDataSourceConfiguration = new DynamicDataSourceConfiguration();
Map<String,DataSource> dataSourceMap = new HashMap<>();
Map<String, Map<String, Object>> list = dynamicDataSourceConfig.getList();
if(list!= null && !list.isEmpty()){
for (Map.Entry<String, Map<String, Object>> sets:
list.entrySet()) {
String key = sets.getKey();
Map<String, Object> value = sets.getValue();
Map<String,Object> datasource = (Map<String,Object>)value.get("datasource");
for (Map.Entry<String, Object> maps:
datasource.entrySet()) {
String s = maps.getValue().toString();
datasource.put(maps.getKey(),s);
}
DataSource dataSource = null;
try {
dataSource = DruidDataSourceFactory.createDataSource(datasource);
} catch (Exception e) {
e.printStackTrace();
log.error("初始化动态数据源失败 {}",e.getMessage());
}
dataSourceMap.put(key,dataSource);
}
dynamicDataSourceConfiguration.setDynamicDataSource(dataSourceMap);
log.info("初始化动态数据源完成");
}else{
log.error("初始化动态数据源失败,未读取到数据源相关配置信息");
}
return dynamicDataSourceConfiguration;
}
}
业务需求记录,部分核心代码都是在网上扒下来的,忘记了出处,如有冒犯,请联系我删除;
小白码农,请大神多多指教,共同进步!!