微信公众号“假装正经的程序员”
前言
最近有个需求是需要通过数据源类型来动态切换数据源的操作,所有配置通过读取配置文件获取。与一般的选择实现类最大的区别是本文是动态选择,不需要通过@Qualifier注释写死实现类。看了下网上相关资料较少,且存在部分不一定正确的情况,故写此篇博客以作记录,也希望碰到此问题的小伙伴能够少走弯路。
注:本文以postgresql和maxcompute官方SDK两种查询方式查询maxcompute为例
正文
1.创建odps
package com.XXXX.tools.email.common.model.BO;
import com.aliyun.odps.Odps;
import com.aliyun.odps.account.Account;
import com.aliyun.odps.account.AliyunAccount;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
* Description:创建maxcompute中的odps
* 作者:gu.weidong(Marco)
*/
@Component
public class MaxComputeOdps {
//读取配置文件中的配置,由于实际项目中还用到了mysql,故此处是secondary
@Value("${spring.datasource.secondary.username}")
private String accessId;
@Value("${spring.datasource.secondary.password}")
private String accessKey;
private final String endPoint = "http://service.odps.aliyun.com/api";
private final String project = "XXXX";//对应库名
@Bean(name="odps")
public Odps odps(){
Account account = new AliyunAccount(accessId, accessKey);
Odps odps = new Odps(account);
odps.setEndpoint(endPoint);
odps.setDefaultProject(project);
return odps;
}
}
2.数据查询接口
package com.XXXX.tools.email.service.query;
import java.util.LinkedHashMap;
import java.util.List;
/**
* Description:查询数据接口
* 作者:gu.weidong(Marco)
*/
public interface QueryService {
//验证sql,避免DROP等操作
default boolean validSql(Stri