业务需要在数据中台配置多数据源 采用默认数据库mysql 与配置的多数据源数据库格式
@RequiredArgsConstructor
public final class DynamicDataSource extends AbstractRoutingDataSource {
private static final ThreadLocal<Object> DATASOURCE_FLAG_NAME = new ThreadLocal<>();
private static final String DEF_KEY = "DEF";
private static final Map<Object, Object> MULTI_DATASOURCE = new HashMap<>(2<<4);
private final DataSource defDatasource;
@Override
protected DataSource determineCurrentLookupKey() {
return (DataSource) MULTI_DATASOURCE.get(Optional.ofNullable(DATASOURCE_FLAG_NAME.get()).orElse(DEF_KEY));
}
@PostConstruct
public void loadDefDatasource(){
MULTI_DATASOURCE.put(DEF_KEY, this.defDatasource);
this.setDefaultTargetDataSource(this.defDatasource);
this.setTargetDataSources(MULTI_DATASOURCE);
}
public void loadDynamicDataSource(String datasourceFlagName, DataSource dataSource){
MULTI_DATASOURCE.putIfAbsent(datasourceFlagName, dataSource);
}
/**
* 重置为默认数据源
*/
public static void resetDs(){
DATASOURCE_FLAG_NAME.remove();
}
public static void attachedDs(String datasourceFlagName){
DATASOURCE_FLAG_NAME.set(datasourceFlagName);
}
}
然后再调用mapperbase中分页方法时候遇到的问题
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
打完断点以后查看 猜测可能是这个原因 接口与mapper配置文件在做映射绑定的时候出现问题导致匹配不到 然后采取了以下措施
1.检查了mapper.xml文件的namespace名称是否写对了包名
2.检查mapper.xml下的标签
3.是否添加mybatis依赖
<!--这个配置是解决mapper-locations找不到,如果把xml放在resourceces中就不用配。当然也不要用mapper-locations--> <build> <finalName>datamiddle-manager</finalName> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build>
4.去掉xml文件中空格再保存一下
5.maven通过clean清理
6.application.yml配置文件
mapper-locations: - classpath:*/*/datamiddle/mapper/xml/*.xml - classpath:mapper/*.xml
然后再次调用接口 不报错了