Java根据参数选择不同的数据源,springboot根据参数获取不同的数据源

导入依赖
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.2.5</version>
</dependency>

 

根据参数选择不同的数据源

import cn.hutool.db.DbUtil;
import cn.hutool.db.ds.simple.SimpleDataSource;

import javax.sql.DataSource;
import java.sql.*;
import java.util.*;

/**
 * author ss
 * createTime 2020/4/21
 * package ${com.dtroad.ieasweb.DynDataSource}
 * DESC 根据参数获取不同数据源的数据
 ***/
public class DataSourceTools {

    private final static Integer GET_ROW_NAME = 1;//获取列名
    private final static Integer GET_DATA = 2;//获取数据

    private static List<Map<String, Object>> connection(DataSource ds, String sql, Integer type) {
        Connection conn = null;
        List<Map<String, Object>> result = new ArrayList<>();
        try {
            conn = ds.getConnection();
            /* 执行查询语句,返回实体列表,一个Entity对象表示一行的数据,Entity对象是一个继承自HashMap的对象,存储的key为字段名,value为字段值 */
            PreparedStatement stm = conn.prepareStatement(sql);
            ResultSet resultSet = stm.executeQuery(sql);
            if (type == GET_DATA) {
                Map<Integer, Object> rowName = buildRowName(resultSet);
                result = buildResult(rowName, resultSet);
            }
            if (type == GET_ROW_NAME) {
                result = new ArrayList<>();
                result.add(buildColumnRowLabel(resultSet));
            }
        } catch (SQLException e) {
        } finally {
            DbUtil.close(conn);
        }
        return result;
    }

    /**
     * 查询那数据的结果集列名称
     */
    private static Map<String, Object> buildColumnRowLabel(ResultSet resultSet) throws SQLException {
        Map<String, Object> map = new LinkedHashMap<>();
        Integer size = resultSet.getMetaData().getColumnCount();
        List<Map<String, Object>> result = new ArrayList<>();
        for (Integer i = 0; i < size; i++) {
            map.put(resultSet.getMetaData().getColumnLabel(size - i), resultSet.getMetaData().getColumnLabel(size - i));
        }
        //将返回的列名称倒叙显示
        List<String> list = new ArrayList<>();
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            String k = entry.getKey();
            list.add(k);
        }
        Collections.reverse(list); // 倒序排列
        Map<String, Object> m = new LinkedHashMap<>();
        for (String k : list) {
            m.put(k, k);
        }
        return m;
    }

    /**
     * 查询那数据的结果集Map类型
     */
    private static Map<Integer, Object> buildRowName(ResultSet resultSet) throws SQLException {
        Map<Integer, Object> map = new LinkedHashMap<>();
        Integer size = resultSet.getMetaData().getColumnCount();
        for (Integer i = 0; i < size; i++) {
            map.put(size - i, resultSet.getMetaData().getColumnLabel(size - i));
        }
        return map;
    }

    /**
     * 构建返回结果集合List<Map<String, Object>>
     */
    private static List<Map<String, Object>> buildResult(Map<Integer, Object> rowName, ResultSet resultSet) throws SQLException {
        Integer size = resultSet.getMetaData().getColumnCount();
        List<Map<String, Object>> result = new ArrayList<>();
        while (resultSet.next()) {
            Map<String, Object> map = new LinkedHashMap<>();
            for (Integer i = 0; i < size; i++) {
                //放入列名称和列值
                map.put(rowName.get(size - i).toString(), resultSet.getString(size - i));
            }
            result.add(map);
        }
        return result;
    }
 //从properties获取数据源的配置信息
    private static DataSource getDataSource(String ds) {
        //可从数据库中获取以下值
        String url = PropertiesUtil.getString("spring.datasource.dynamic.datasource." + ds + ".url");
        String username = PropertiesUtil.getString("spring.datasource.dynamic.datasource." + ds + ".username");
        String password = PropertiesUtil.getString("spring.datasource.dynamic.datasource." + ds + ".password");
        return new SimpleDataSource(url, username, password);
    }
    /**
     * 查询那数据的结果集
     */
    public static List<Map<String, Object>> query(String ds, String sql) {
        //可从数据库中获取以下值
        DataSource dataSource = getDataSource(ds);
        return connection(dataSource, sql, GET_DATA);
    }

    /**
     * 获取列名称Map<String,Object> k值,value值相等
     */
    public static List<Map<String, Object>> queryRowName(String ds, String sql) {
        DataSource dataSource = getDataSource(ds);
        Integer type = GET_ROW_NAME;
        return connection(dataSource, sql, type);
    }

   
}
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.MissingResourceException;

/**
 * author ss
 * createTime 2020/4/21
 * package ${com.dtroad.ieasweb.DynDataSource}
 * 获取系统参数 引用自其他网站
 ***/
@Component
public class PropertiesUtil {
    public static final byte[] KEY = {9, -1, 0, 5, 39, 8, 6, 19};
    private static Environment env;

    @Autowired
    protected void set(Environment env) throws IOException {
        PropertiesUtil.env = env;
    }

    /**
     * Get a value based on key , if key does not exist , null is returned
     *
     * @param key
     * @return
     */
    public static String getString(String key) {
        try {
            return env.getProperty(key);
        } catch (MissingResourceException e) {
            return null;
        }
    }

    /**
     * Get a value based on key , if key does not exist , null is returned
     *
     * @param key
     * @return
     */
    public static String getString(String key, String defaultValue) {
        try {
            String value = env.getProperty(key);
            if (value == null) {
                return defaultValue;
            }
            return value;
        } catch (MissingResourceException e) {
            return defaultValue;
        }
    }

    /**
     * 根据key获取值
     *
     * @param key
     * @return
     */
    public static int getInt(String key) {
        return Integer.parseInt(env.getProperty(key));
    }

    /**
     * 根据key获取值
     *
     * @param key
     * @param defaultValue
     * @return
     */
    public static int getInt(String key, int defaultValue) {
        String value = env.getProperty(key);
        if (StringUtils.isBlank(value)) {
            return defaultValue;
        }
        return Integer.parseInt(value);
    }

    /**
     * 根据key获取值
     *
     * @param key
     * @param defaultValue
     * @return
     */
    public static boolean getBoolean(String key, boolean defaultValue) {
        String value = env.getProperty(key);
        if (StringUtils.isBlank(value)) {
            return defaultValue;
        }
        return new Boolean(value);
    }
}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在 Spring Boot 中,可以使用拦截器(Interceptor)来实现在请求处理过程中进行数据源的动态切换。以下是一个简单的实现方式: 1. 首先需要定义一个拦截器,在其中实现数据源的动态切换逻辑,例如: ```java public class DataSourceInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 获取请求中的参数,根据参数选择不同数据源 String dataSourceName = request.getParameter("dataSource"); DataSourceContextHolder.setDataSource(dataSourceName); return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 清除数据源上下文 DataSourceContextHolder.clearDataSource(); } } ``` 2. 在拦截器中获取请求中的参数,并根据参数选择相应的数据源。这里使用了一个 `DataSourceContextHolder` 类来保存当前数据源的名称,代码如下: ```java public class DataSourceContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<>(); public static void setDataSource(String dataSource) { contextHolder.set(dataSource); } public static String getDataSource() { return contextHolder.get(); } public static void clearDataSource() { contextHolder.remove(); } } ``` 3. 接着,在 Spring Boot 的配置类中注册拦截器,并设置拦截器的顺序,例如: ```java @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private DataSourceInterceptor dataSourceInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(dataSourceInterceptor) .addPathPatterns("/**") .order(Ordered.HIGHEST_PRECEDENCE); } } ``` 4. 最后,需要在应用程序中配置多个数据源,并为每个数据源指定一个名称。这里使用了 Spring Boot 的自动配置来配置数据源,代码如下: ```java @Configuration public class DataSourceConfig { @Bean(name = "dataSource1") @ConfigurationProperties(prefix = "spring.datasource.ds1") public DataSource dataSource1() { return DataSourceBuilder.create().build(); } @Bean(name = "dataSource2") @ConfigurationProperties(prefix = "spring.datasource.ds2") public DataSource dataSource2() { return DataSourceBuilder.create().build(); } @Bean public RoutingDataSource routingDataSource(@Qualifier("dataSource1") DataSource dataSource1, @Qualifier("dataSource2") DataSource dataSource2) { Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put("dataSource1", dataSource1); targetDataSources.put("dataSource2", dataSource2); RoutingDataSource routingDataSource = new RoutingDataSource(); routingDataSource.setTargetDataSources(targetDataSources); routingDataSource.setDefaultTargetDataSource(dataSource1); return routingDataSource; } } ``` 在这个示例中,我们通过定义两个数据源 `dataSource1` 和 `dataSource2`,并为每个数据源指定一个名称。然后,我们创建一个 `RoutingDataSource`,并将这两个数据源添加到目标数据源列表中。在拦截器中,我们可以根据请求参数的值选择不同数据源,并将选择数据源名称保存在 `DataSourceContextHolder
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我来秋风扫落叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值