当前位置:   article > 正文

springboot+mybatis实现动态切换数据源_mybatis执行原生sql,并防止注入,并支持数据源动态切换(基于springboot) 原创

mybatis执行原生sql,并防止注入,并支持数据源动态切换(基于springboot) 原创

由于目前项目中需要用到项目中的两个库,研究了一下发现一个比较轻松的写法。

首先配置多个数据源并且交给bean管理 写在 Config中

  1. @Bean(name = "db1")
  2. public DataSource druidDataSource() {
  3. DruidDataSource datasource = null;
  4. //直连数据库
  5. if ("0".equals(jndiflag)) {
  6. datasource = new DruidDataSource();
  7. datasource.setUrl(dbUrl);
  8. datasource.setUsername(username);
  9. datasource.setPassword(password);
  10. datasource.setDriverClassName(driverClassName);
  11. datasource.setInitialSize(initialSize);
  12. datasource.setMinIdle(minIdle);
  13. datasource.setMaxActive(maxActive);
  14. datasource.setMaxWait(maxWait);
  15. datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
  16. datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
  17. datasource.setValidationQuery(validationQuery);
  18. datasource.setTestWhileIdle(testWhileIdle);
  19. datasource.setTestOnBorrow(testOnBorrow);
  20. datasource.setTestOnReturn(testOnReturn);
  21. try {
  22. datasource.setFilters(filters);
  23. } catch (SQLException e) {
  24. log.error("druid configuration initialization filter", e);
  25. }
  26. } else {
  27. try {
  28. Context ctx = new InitialContext();
  29. datasource = (DruidDataSource) ctx.lookup("");
  30. } catch (NamingException e) {
  31. log.error("通过JNDI名称找到DataSource 异常", e);
  32. }
  33. }
  34. return datasource;
  35. }
  36. @Bean(name = "db2")
  37. public DataSource druidDataSourceTwo() {
  38. DruidDataSource datasource = null;
  39. //直连数据库
  40. if ("0".equals(jndiflag)) {
  41. datasource = new DruidDataSource();
  42. datasource.setUrl(dbUrlTwo);
  43. datasource.setUsername(usernameTwo);
  44. datasource.setPassword(passwordTwo);
  45. datasource.setDriverClassName(driverClassNameTwo);
  46. datasource.setInitialSize(initialSize);
  47. datasource.setMinIdle(minIdle);
  48. datasource.setMaxActive(maxActive);
  49. datasource.setMaxWait(maxWait);
  50. datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
  51. datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
  52. datasource.setValidationQuery(validationQuery);
  53. datasource.setTestWhileIdle(testWhileIdle);
  54. datasource.setTestOnBorrow(testOnBorrow);
  55. datasource.setTestOnReturn(testOnReturn);
  56. try {
  57. datasource.setFilters(filters);
  58. } catch (SQLException e) {
  59. log.error("druid configuration initialization filter", e);
  60. }
  61. } else {
  62. try {
  63. Context ctx = new InitialContext();
  64. datasource = (DruidDataSource) ctx.lookup("");
  65. } catch (NamingException e) {
  66. log.error("通过JNDI名称找到DataSource 异常", e);
  67. }
  68. }
  69. return datasource;
  70. }

目前配置了两个数据源后,我们也应该在Config 中指定一个默认数据源

  1. @Bean(name = "dynamicDataSource")
  2. @Primary
  3. public DataSource dynamicDataSource(@Qualifier("db1") DataSource db1, @Qualifier("db2") DataSource db2) {
  4. DynamicDataSource dynamicDataSource = new DynamicDataSource();
  5. // 默认数据源
  6. dynamicDataSource.setDefaultTargetDataSource(db1);
  7. // 配置多数据源
  8. Map<Object, Object> dsMap = new HashMap<>();
  9. dsMap.put("db1", db1);
  10. dsMap.put("db2", db2);
  11. dynamicDataSource.setTargetDataSources(dsMap);
  12. return dynamicDataSource;
  13. }

以下是DynamicDataSource 类

  1. package com.guobaojingrong.salesupport.config;/*
  2. * 消息描述
  3. * @Description: $
  4. * @return: $
  5. * @Author: 李
  6. * @Date: $ $
  7. */
  8. import lombok.extern.slf4j.Slf4j;
  9. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
  10. @Slf4j
  11. public class DynamicDataSource extends AbstractRoutingDataSource {
  12. @Override
  13. protected Object determineCurrentLookupKey() {
  14. log.info("动态获取数据源——{}",DataSourceUtil.getDB());
  15. return DataSourceUtil.getDB();
  16. }
  17. }
DataSourceUtil类
  1. package com.guobaojingrong.salesupport.config;/*
  2. * 消息描述
  3. * @Description: $
  4. * @return: $
  5. * @Author: 李
  6. * @Date: $ $
  7. */
  8. public class DataSourceUtil {
  9. private static final ThreadLocal<String> contextHolder = new ThreadLocal();
  10. /**
  11. * 设置数据源名
  12. * @param dbType
  13. */
  14. public static void setDB(String dbType) {
  15. contextHolder.set(dbType);
  16. }
  17. /**
  18. * 获取数据源名
  19. * @return
  20. */
  21. public static String getDB() {
  22. return contextHolder.get();
  23. }
  24. /**
  25. * 清除数据源名
  26. */
  27. public static void clearDB() {
  28. contextHolder.remove();
  29. }
  30. }

在Controller 指定对应的库

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/902929
推荐阅读
相关标签
  

闽ICP备14008679号