SpringBoot整合Mybatis-Plus+Druid实现多数据源配置功能

 更新时间:2023年06月09日 09:02:38   作者:梦随风扬  
本文主要讲解springboot +mybatisplus + druid 实现多数据源配置功能以及一些必要的准备及代码说明,具有一定的参考价值,感兴趣的小伙伴可以借鉴一下

SpringBoot :
Spring Boot是一个基于Spring框架的开源Java开发框架,旨在简化Spring应用程序的开发、配置和部署。它提供了一种快速、敏捷的方式来构建独立的、生产级别的Spring应用程序,同时还提供了许多开箱即用的功能和工具,如自动配置、内嵌式Web容器、健康检查、监控和管理等。
Mybatis-Plus:
Mybatis-Plus是一个基于Mybatis的增强工具,它在Mybatis的基础上扩展了许多实用的功能,可以帮助开发人员更加高效地完成数据库操作,提高开发效率和代码质量。
Druid:
Druid是一个高性能的数据库连接池,它可以与各种关系型数据库进行集成,如MySQL、Oracle、PostgreSQL等。Druid提供了可扩展、高可用、高性能的数据库连接管理功能,可以帮助开发人员更加高效地完成数据库操作。

有了基本的理解 接下来我们用这些组合实现多数据源功能

🍹1. pom.xml 添加依赖

加入一些必要的依赖:

这里是引用

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--spring-boot-web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.2</version>
        </dependency>
        <!-- druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.16</version>
        </dependency>
	   <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--   mysql     -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

🛑2. application.yml

多数据源的一个简单yml配置:

spring:
  datasource:
    druid:
      initial-size: 5
      min-idle: 5
      max-active: 5
      db1:
        url: jdbc:mysql://localhost:6030/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true
        username: root
        password: root
        driver-class-name: com.mysql.cj.jdbc.Driver
      db2:
        url: jdbc:mysql://localhost:6030/demo1?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true
        username: root
        password: root
        driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: false

⏳ 3. 排除默认加载

在项目启动类中排除druid属性默认加载(也可以直接在配置中加载 我的项目配置没有成功就直接用这种方式了)
不加这个多数据源可能无法都加载出来

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)

🛎 4. Mybatis-Plus 配置

添加mybatisplus的多数据源配置

@Configuration
public class MybatisPlusConfig {
    /** mybatis 3.4.1 pagination config start ***/
    @Bean
    public PaginationInterceptor paginationInterceptor() {
		//        return new PaginationInterceptor();
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        paginationInterceptor.setDialectType("postgresql");
        return paginationInterceptor;
    }
    /**
     * SQL执行效率插件(优化sql的执行效率 不需要可以不加)
     * 
     */
    @Bean
    @Profile({"dev","qa"})// 设置 dev test 环境开启
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(1000);
        performanceInterceptor.setFormat(true);
        return performanceInterceptor;
    }
	/**
	 * 多数据源的创建 有几个就写几个 
	 */
    @Bean(name = "db1")
    @ConfigurationProperties(prefix = "spring.datasource.druid.db1" )
    public DataSource db1() {
        return DruidDataSourceBuilder.create().build();
    }
    @Bean(name = "db2")
    @ConfigurationProperties(prefix = "spring.datasource.druid.db2" )
    public DataSource db2() {
        return DruidDataSourceBuilder.create().build();
    }
    /**
     * 动态数据源配置
     * @return
     */
    @Bean
    @Primary
    public DataSource multipleDataSource(@Qualifier("db1") DataSource db1, @Qualifier("db2") DataSource db2) {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        Map< Object, Object > targetDataSources = new HashMap<>();
        targetDataSources.put(DataSourceEnum.DB1.getValue(), db1);
        targetDataSources.put(DataSourceEnum.DB2.getValue(), db2);
        //添加数据源
        dynamicDataSource.setTargetDataSources(targetDataSources);
        //设置默认数据源
        dynamicDataSource.setDefaultTargetDataSource(db1);
        return dynamicDataSource;
    }
    @Bean("sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(multipleDataSource(db1(),db2()));
        //sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*/*Mapper.xml"));
        MybatisConfiguration configuration = new MybatisConfiguration();
        //configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
        configuration.setJdbcTypeForNull(JdbcType.NULL);
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.setCacheEnabled(false);
        sqlSessionFactory.setConfiguration(configuration);
        sqlSessionFactory.setPlugins(new Interceptor[]{
                //PerformanceInterceptor(),OptimisticLockerInterceptor()
                paginationInterceptor()
                //添加分页功能
        });
        //sqlSessionFactory.setGlobalConfig(globalConfiguration());
        return sqlSessionFactory.getObject();
    }
}

🪐5. 多数据源实例:

🔒 5.1 DataSourceEnum

枚举:

public enum DataSourceEnum {
    DB1("db1"),DB2("db2");
    private String value;
    DataSourceEnum(String value){this.value=value;}
    public String getValue() {
        return value;
    }
}

🔓 5.2 DataSource

自定义多数据源切换:

/** 
 * 自定义多数据源切换
 * @author zzh
 * @date 2023/4/28 15:19:21
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface DataSource {
    DataSourceEnum value() default DataSourceEnum.DB1;
}

🔏 5.3 DataSourceAspect

切面处理类:

@Aspect
@Order(1)
@Component
public class DataSourceAspect {
    @Pointcut("@annotation(com.taosdata.example.mybatisplusdemo.datasource.annotation.DataSource)"
            + "|| @within(com.taosdata.example.mybatisplusdemo.datasource.annotation.DataSource)")
    public void dsPc() {
    }
    @Before("dsPc()  && @annotation(dataSource)")
    public void doBefore(DataSource dataSource)  {
        DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().getValue());
    }
    @After("dsPc()")
    public void doAfter() {
        DynamicDataSourceContextHolder.clearDataSourceType();
    }
}

🔐 5.4 DruidConfiguration

driud配置类 配置启动视图和过滤规则

@Configuration
public class DruidConfiguration {
    @Bean
    public ServletRegistrationBean startViewServlet(){
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
        // IP白名单
        servletRegistrationBean.addInitParameter("allow","127.0.0.1");
        // IP黑名单(共同存在时,deny优先于allow)
        servletRegistrationBean.addInitParameter("deny","127.0.0.1");
        //控制台管理用户
        servletRegistrationBean.addInitParameter("loginUsername","admin");
        servletRegistrationBean.addInitParameter("loginPassword","123456");
        //是否能够重置数据
        servletRegistrationBean.addInitParameter("resetEnable","false");
        return servletRegistrationBean;
    }
    @Bean
    public FilterRegistrationBean statFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
        //添加过滤规则
        filterRegistrationBean.addUrlPatterns("/*");
        //忽略过滤的格式
        filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }
}

🔏 5.5 DynamicDataSource

动态数据源决策

public class DynamicDataSource extends AbstractRoutingDataSource {
    /**
     * @description:  动态数据源决策
     * @return
     */
    @Override
    protected Object determineCurrentLookupKey() {
        String dataSourceType = DynamicDataSourceContextHolder.getDataSourceType();
        return dataSourceType;
    }
}

🔓 5.6 DynamicDataSourceContextHolder

多数据源上下文

public class DynamicDataSourceContextHolder {
    public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);
    /**
     * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
     * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
     */
    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
    /**
     * 设置数据源的变量
     */
    public static void setDataSourceType(String dsType) {
        log.info("切换到{}数据源", dsType);
        CONTEXT_HOLDER.set(dsType);
    }
    /**
     * 获得数据源的变量
     */
    public static String getDataSourceType() {
        return CONTEXT_HOLDER.get();
    }
    /**
     * 清空数据源变量
     */
    public static void clearDataSourceType() {
        CONTEXT_HOLDER.remove();
    }
}

🆗 总结:

至此,一个非常简单的多数据源配置就基本搞定了。

以上就是SpringBoot+Mybatis-Plus+Druid实现多数据源配置功能的详细内容,更多关于SpringBoot Druid多数据源的资料请关注脚本之家其它相关文章!

相关文章

  • Java Springboot全局异常处理

    Java Springboot全局异常处理

    这篇文章主要给大家介绍了关于Springboot全局异常处理的资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SpringBoot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2021-11-11
  • java新手入门——String类详解

    java新手入门——String类详解

    在java、C#中,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。string>是C++标准程序库中的一个头文件
    2021-06-06
  • java静态工具类注入service出现NullPointerException异常处理

    java静态工具类注入service出现NullPointerException异常处理

    如果我们要在我们自己封装的Utils工具类中或者非controller普通类中使用@Autowired注解注入Service或者Mapper接口,直接注入是报错的,因Utils用了静态方法,我们无法直接用非静态接口的,遇到这问题,我们要想法解决,下面小编就简单介绍解决办法,需要的朋友可参考下
    2021-09-09
  • SpringBoot配置动态数据源的实战详解

    SpringBoot配置动态数据源的实战详解

    Spring对数据源的管理类似于策略模式,不懂策略模式也没关系,其实就是有一个全局的键值对,类型是Map<String, DataSource>,当JDBC操作数据库之时,会根据不同的key值选择不同的数据源,本文介绍了SpringBoot配置动态数据源的方法,需要的朋友可以参考下
    2024-08-08
  • java对接微信支付之JSAPI支付(微信公众号支付)

    java对接微信支付之JSAPI支付(微信公众号支付)

    这篇文章主要给大家介绍了关于java对接微信支付之JSAPI支付(微信公众号支付)的相关资料,微信JSAPI支付是近年来非常流行的一种支付方式,它使用了微信支付的SDK和demo来实现支付接口的对接,需要的朋友可以参考下
    2023-07-07
  • java通过HttpServletRequest获取post请求中的body内容的方法

    java通过HttpServletRequest获取post请求中的body内容的方法

    本篇文章主要介绍了java通过HttpServletRequest获取post请求中的body内容的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 浅谈Java多线程编程中Boolean常量的同步问题

    浅谈Java多线程编程中Boolean常量的同步问题

    这篇文章主要介绍了浅谈Java多线程编程中Boolean常量的同步问题,主要针对线程之间同步了不同的布尔对象的问题,需要的朋友可以参考下
    2015-10-10
  • Filter在springboot中的使用方法详解

    Filter在springboot中的使用方法详解

    这篇文章主要介绍了Filter在springboot中的使用方法详解,filter(过滤器)作用于在intreceptor(拦截器)之前,不像intreceptor一样依赖于springmvc框架,只需要依赖于serverlet,需要的朋友可以参考下
    2023-08-08
  • 详解用Spring Boot Admin来监控我们的微服务

    详解用Spring Boot Admin来监控我们的微服务

    这篇文章主要介绍了用Spring Boot Admin来监控我们的微服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • java 发送带Basic Auth认证的http post请求实例代码

    java 发送带Basic Auth认证的http post请求实例代码

    下面小编就为大家带来一篇java 发送带Basic Auth认证的http post请求实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11

最新评论