项目目前情况是mysql查询,需要添加clickhouse查询
需要多数据源
于是对项目改造如下
@Configuration
//配置maapper类的扫描路径,执行对应的mapper类方法时才可以使用合适的datasource
@MapperScan(value = "扫描路径",sqlSessionFactoryRef = "clickSqlSessionFactory")
public class ClickDataSourceConfig extends DataSourceConfig{
@Value("属性注入")
private String url;
@Value("属性注入")
private String username;
@Value("属性注入")
private String password;
@Value("属性注入")
private String driverclassname;
@Bean(name="clickHouseDataSource")
public DataSource clickHouseDataSource() {
return DataSourceBuilder.create().driverClassName(driverclassname).url(url)
.username(username).password(password).build();
}
@Bean(name = "clickSqlSessionFactory")
public SqlSessionFactory clickHouseSqlSessionFactoryBean(@Qualifier("clickHouseDataSource")DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory=new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
//配置实体类路径,方便做对象和数据库记录的关联
factory.setTypeAliasesPackage("");
ResourcePatternResolver resourcePatternResolver=new PathMatchingResourcePatternResolver();
//配置mapper.xml文件的路径
factory.setMapperLocations(resourcePatternResolver.getResources("classpath:clickhouse/*.xml"));
//开启驼峰命名的转换
// factory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return factory.getObject();
}
}
@Configuration
@MapperScan(value = "",sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MysqlDataSourceConfig extends DataSourceConfig{
@Value("属性注入")
private String url;
@Value("属性注入")
private String username;
@Value("属性注入")
private String password;
@Value("属性注入")
private String driverclassname;
@Bean(name="mysqlDataSource")
@Primary
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().driverClassName(driverclassname).url(url)
.username(username).password(password).build();
}
@Bean(name = "mysqlSqlSessionFactory")
@Primary
public SqlSessionFactory mysqlSqlSessionFactoryBean(@Qualifier("mysqlDataSource") DataSource dataSource)throws Exception{
SqlSessionFactoryBean factory=new SqlSessionFactoryBean();
factory.setConfiguration(mybatisConfiguration());
factory.setDataSource(dataSource);
factory.setTypeAliasesPackage("");
ResourcePatternResolver resourcePatternResolver=new PathMatchingResourcePatternResolver();
factory.setMapperLocations(resourcePatternResolver.getResources("classpath:mapper/*.xml"));
//factory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return factory.getObject();
}
@Bean
public org.apache.ibatis.session.Configuration mybatisConfiguration() {
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
// 配置类型别名
configuration.getTypeAliasRegistry().registerAlias("page", com.reformer.commons.bo.Page.class);
return configuration;
}
public class DataSourceConfig {
}
下面的问题就是如何切换数据源做查询了
这里可以使用切面 加注解的方式实现
import com.rfca.config.ClickDataSourceConfig;
import com.rfca.datasource.DynamicDataSource;
import com.rfca.datasource.MutilDataSourceContextHolder;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Aspect
@Order(1)
@Component
public class ClickHouseDataSourceAspect {
@Pointcut("@annotation(com.rfca.anno.UseClickHouseDataSource)")
public void useClickHouseDataSourcePointcut() {
}
@Before("useClickHouseDataSourcePointcut()")
public void setClickHouseDataSource() {
MutilDataSourceContextHolder.setDataSourceConfig(new ClickDataSourceConfig());
}
@After("useClickHouseDataSourcePointcut()")
public void clear() {
MutilDataSourceContextHolder.clearDataSourceConfig();
}
}
注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UseClickHouseDataSource {
}
方法加上注解
@UseClickHouseDataSource
ParkingRecord selectByPrimaryKey(Long id);
然后在项目中使用
CkParkingRecordMapper ckParkingRecordMapper = (CkParkingRecordMapper) SpringContextHolder.getBean("ckParkingRecordMapper"); ckParkingRecordMapper.selectByPrimaryKey(1L);
其他类
import com.rfca.config.DataSourceConfig;
public class MutilDataSourceContextHolder {
private static ThreadLocal<DataSourceConfig> contextHolder = new ThreadLocal<>();
public static void setDataSourceConfig(DataSourceConfig config) {
contextHolder.set(config);
}
public static DataSourceConfig getDataSourceConfig() {
return contextHolder.get();
}
public static void clearDataSourceConfig() {
contextHolder.remove();
}
}