SpringBoot多数据源实战:Mybatis-plus+Druid配置避坑指南(附完整代码)

Dynamic DataSource 多数据源配置【 Springboot + DataSource + MyBatis Plus + Druid】 MybatisPlus多数据源配置主要解决的是多数据库连接和切换的问题。在一些大型应用中,由于数据量的增长或者业务模块的增多,可能需要访问多个数据库。这时,就需要配置多个数据源。 阅读详情

SpringBoot多数据源实战:从架构设计到生产避坑的深度指南

最近在重构一个老项目的报表模块,需要同时从业务库和日志库拉取数据。本以为在SpringBoot里配个多数据源是分分钟的事,结果一脚踩进了配置的深坑。从连接池莫名变成HikariCP,到事务在多个数据源间乱窜,再到Mybatis-Plus的拦截器失效,这一路折腾下来,发现网上很多“抄来抄去”的教程,要么配置层级不对,要么关键细节缺失,真正能直接用在生产环境的少之又少。

如果你也正在为SpringBoot应用连接多个数据库而头疼,特别是想用好Druid连接池的监控和防护能力,那么这篇文章或许能帮你省下不少排查时间。我会从一个真实的微服务场景出发,拆解多数据源配置的核心逻辑,分享那些官方文档里不会写的“坑”,并附上可直接复用的完整代码。无论你是要对接异构数据库(MySQL + PostgreSQL),还是做读写分离、分库分表的前期技术预研,这里的内容都能给你一个扎实的起点。

1. 多数据源架构:不只是多个DataSource那么简单

在单数据源应用中,SpringBoot的自动配置为我们包办了一切:它自动创建DataSource、SqlSessionFactory、事务管理器,我们只需要在application.yml里填上数据库地址就行。但当我们声明第二个DataSource时,这种“魔法”就失效了。SpringBoot的自动配置默认是单数据源导向的,它会因为找到多个DataSource Bean而困惑,不知道应该把SqlSessionFactory和事务管理器绑定到哪一个上。

所以,实现多数据源的核心,实质上是手动接管原本由自动配置完成的那些Bean的创建过程,并为每个数据源明确地建立一套独立的、完整的Mybatis运行环境。这套环境主要包括三个核心组件:

  1. DataSource: 数据库连接的来源,通常包含连接池配置。
  2. SqlSessionFactory: Mybatis的核心,负责创建SqlSession,它需要绑定到特定的DataSource,并加载对应的Mapper接口和XML文件。
  3. TransactionManager: 事务管理器,确保数据库操作在事务边界内执行,它也必须与特定的DataSource关联。

注意:很多人误以为配好几个DataSource Bean就完事了,结果运行时发现事务不生效、Mapper找不到,根本原因就是后两者没有正确配置和关联。

在多数据源场景下,我们通常需要指定一个主数据源(Primary)。这个“主”并非指业务上最重要,而是技术上的默认选择。当某些框架或场景(例如一些健康检查端点、没有明确指定数据源的简单查询)需要注入一个DataSource时,Spring会优先选择带有@Primary注解的那个。因此,合理设置@Primary是避免NoUniqueBeanDefinitionException(找到多个Bean)错误的关键。

为了更清晰地理解这三个组件与数据源的关系,我们可以看下面这个对比表格:

组件单数据源 (SpringBoot自动配置)多数据源 (手动配置)关键区别
DataSource自动从spring.datasource读取配置创建1个。需手动创建多个Bean,分别读取不同的配置前缀。从“一个”变为“多个”,需要明确命名和区分。
SqlSessionFactory自动创建1个,绑定到唯一的DataSource。需手动创建多个,每个通过setDataSource()绑定到特定的DataSource。需要建立明确的绑定关系,并指定不同的Mapper扫描路径。
TransactionManager自动创建1个,基于唯一的DataSource。需手动创建多个,每个在构造时传入对应的DataSource。必须确保事务管理器与操作使用的SqlSessionFactory使用的是同一个DataSource。
配置复杂度极低,开箱即用。高,需要完整定义多套环境。从“零配置”到“全手动配置”。

理解了这层关系,我们再来看具体的技术选型。本次我们选择 Mybatis-Plus + Druid 的组合。Mybatis-Plus在Mybatis基础上提供了强大的CRUD增强和插件机制,而Druid则是经过阿里大规模生产验证的连接池,以其强大的监控、防御SQL注入、统计等功能著称。将它们与多数据源结合,既能提升开发效率,又能保障应用稳定性。

2. 项目依赖与配置:奠定正确的基础

一切从pom.xml开始。依赖的版本选择不当,往往是后续一系列诡异问题的根源。对于SpringBoot 2.7.x 或 3.x 版本,我推荐以下依赖配置,这能确保各组件间的良好兼容性。

<dependencies>
    <!-- SpringBoot Web 基础 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Mybatis-Plus 启动器 (已包含Mybatis和JDBC) -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.3.1</version> <!-- 请检查最新版本 -->
    </dependency>

    <!-- Druid 连接池启动器 (关键!) -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.18</version> <!-- 请检查最新版本 -->
    </dependency>

    <!-- 数据库驱动 (以MySQL为例) -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- 其他可能需要的依赖,如Lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

这里有两个极易踩坑的点:

  1. 不要单独引入spring-boot-starter-jdbc:mybatis-plus-boot-starter已经包含了它。重复引入可能导致依赖冲突或配置加载顺序问题。
  2. 务必使用 druid-spring-boot-starter,而不是旧的druid。这个starter提供了与SpringBoot配置属性(spring.datasource.druid.*)的无缝集成,简化了监控等功能的开启。

接下来是重头戏:application.yml配置。网上很多错误配置都源于对配置层级的误解。Druid starter期望的配置结构是特定的。

spring:
  datasource:
    # 1. 指定数据源类型为DruidDataSource
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      # 2. Druid连接池的通用配置 (对所有数据源生效)
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 60000
      validation-query: SELECT 1
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      # 开启监控统计等功能(按需)
      stat-view-servlet:
        enabled: true
        login-username: admin
        login-password: admin
      filter:
        stat:
          enabled: true
          log-slow-sql: true
          slow-sql-millis: 2000

      # 3. 多数据源定义 (关键!)
      # 这里定义的`datasource1`和`datasource2`是自定义名称,对应后续Bean的prefix
      datasource1:
        url: jdbc:mysql://localhost:3306/db_primary?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver
      datasource2:
        url: jdbc:mysql://localhost:3307/db_log?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver

配置解读与避坑:

  • spring.datasource.type:这个必须指定为Druid的类。如果不指定,SpringBoot可能会根据classpath下的连接池jar包自动选择(通常是HikariCP),导致Druid配置不生效。
  • spring.datasource.druid.*:这个层级的配置是Druid连接池的全局默认属性。比如initial-size: 5,意味着你通过Druid创建的每个数据源连接池,初始连接数默认都是5,除非你在数据源专属配置里覆盖它。
  • spring.datasource.druid.datasource1:这是我们自定义的数据源配置块。名字datasource1可以任意取,但后续Java配置中的@ConfigurationProperties(prefix = "spring.datasource.druid.datasource1")必须与此保持一致。这里配置的是该数据源独有的连接信息(URL、用户名等)。
  • 关于jdbc-url:网上有些教程会写jdbc-url。对于Druid starter,使用标准的url属性即可。jdbc-url是HikariCP等连接池的写法,在Druid的特定配置语境下可能不识别。

3. 核心配置类详解:手动构建多套运行时环境

配置写好了,现在需要写代码把它们“激活”。我们将创建三个配置类。

第一步:创建多个DataSource Bean

这个类的唯一职责,就是根据YAML配置,生成多个DruidDataSource实例。

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    /**
     * 主数据源 (业务库)
     * Bean名称为 "primaryDataSource"
     * 配置前缀绑定到 spring.datasource.druid.datasource1
     */
    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.druid.datasource1")
    public DataSource primaryDataSource() {
        // 关键!必须返回 new DruidDataSource()
        // 如果使用 DataSourceBuilder.create().build(),得到的将是默认的HikariCP数据源
        return new DruidDataSource();
    }

    /**
     * 第二数据源 (日志库)
     * Bean名称为 "secondaryDataSource"
     * 配置前缀绑定到 spring.datasource.druid.datasource2
     */
    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.druid.datasource2")
    public DataSource secondaryDataSource() {
        return new DruidDataSource();
    }
}

这里有个巨坑:如果你看到代码里写的是return DataSourceBuilder.create().build();,请立刻警惕。DataSourceBuilder是SpringBoot提供的一个便捷工具,但它无法感知spring.datasource.type并将其应用于Druid。它默认会创建一个HikariDataSource(如果HikariCP在classpath下)。这就是为什么很多人配置了半天,监控里看到的连接池却是Hikari。正确的做法是直接new DruidDataSource(),@ConfigurationProperties注解会自动将prefix指定的配置属性(url, username等)注入到这个新创建的对象中。

第二步:配置主数据源的Mybatis环境

我们将主数据源(业务库)标记为@Primary,这意味着当其他地方需要注入一个DataSource但未指定名称时,Spring会使用这个。

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
// 指定扫描主数据源对应的Mapper接口包,并绑定到名为`primarySqlSessionFactory`的工厂
@MapperScan(
        basePackages = "com.yourpackage.mapper.primary",
        sqlSessionFactoryRef = "primarySqlSessionFactory"
)
public class PrimaryDataSourceConfig {

    /**
     * 创建SqlSessionFactory,并绑定到主数据源。
     * 使用MybatisSqlSessionFactoryBean而不是原生的SqlSessionFactoryBean,以支持Mybatis-Plus特性。
     */
    @Bean(name = "primarySqlSessionFactory")
    @Primary // 标记为主要的SqlSessionFactory
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
        // 绑定数据源
        sessionFactoryBean.setDataSource(dataSource);
        // 设置Mapper XML文件位置 (路径根据实际项目调整)
        sessionFactoryBean.setMapperLocations(
                new PathMatchingResourcePatternResolver()
                        .getResources("classpath:mapper/primary/*.xml")
        );

        // 配置Mybatis-Plus插件,例如分页插件 (这是关键,否则MP的分页等功能可能失效)
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        sessionFactoryBean.setPlugins(interceptor);

        return sessionFactoryBean.getObject();
    }

    /**
     * 创建SqlSessionTemplate,它是SqlSession的线程安全实现。
     */
    @Bean(name = "primarySqlSessionTemplate")
    @Primary
    public SqlSessionTemplate primarySqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    /**
     * 创建事务管理器,并绑定到主数据源。
     * 事务注解@Transactional默认会使用这个管理器。
     */
    @Bean(name = "primaryTransactionManager")
    @Primary
    public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

关键点解析:

  • @MapperScan:这个注解告诉Mybatis去哪里找Mapper接口。basePackages最好按数据源进行物理目录隔离(如mapper.primary和mapper.secondary),避免混淆。sqlSessionFactoryRef必须指向本配置类中创建的SqlSessionFactory Bean的名称。
  • MybatisSqlSessionFactoryBean:使用Mybatis-Plus时必须用这个类来创建工厂,否则Mybatis-Plus的全局配置和插件(如分页、乐观锁)不会生效。
  • 插件配置:必须在SqlSessionFactoryBean中手动添加MybatisPlusInterceptor。在多数据源配置下,Mybatis-Plus的自动配置可能会失效,这是一个常见的“坑”。分页、动态表名等插件都需要在这里显式添加。
  • @Primary:在SqlSessionFactory、SqlSessionTemplate和TransactionManager上都标记@Primary,确保它们成为默认选择。

第三步:配置从数据源的Mybatis环境

第二个数据源(日志库)的配置与主数据源几乎一样,核心区别在于不能使用@Primary注解,并且所有Bean的名称、扫描的包路径、XML文件路径都必须不同。

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
// 扫描从数据源对应的Mapper接口包
@MapperScan(
        basePackages = "com.yourpackage.mapper.secondary",
        sqlSessionFactoryRef = "secondarySqlSessionFactory"
)
public class SecondaryDataSourceConfig {

    @Bean(name = "secondarySqlSessionFactory")
    public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        // 指向从数据源专用的XML目录
        sessionFactoryBean.setMapperLocations(
                new PathMatchingResourcePatternResolver()
                        .getResources("classpath:mapper/secondary/*.xml")
        );
        // 如果从数据源也需要Mybatis-Plus插件,同样需要在这里配置
        // MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        // sessionFactoryBean.setPlugins(interceptor);
        return sessionFactoryBean.getObject();
    }

    @Bean(name = "secondarySqlSessionTemplate")
    public SqlSessionTemplate secondarySqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Bean(name = "secondaryTransactionManager")
    public DataSourceTransactionManager secondaryTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

至此,两套独立的Mybatis运行环境就搭建完毕了。它们拥有各自的数据源、Mapper接口包、XML文件目录和事务管理器,互不干扰。

4. 使用、事务控制与生产级避坑指南

配置完成后,如何在Service层使用呢?关键在于使用@Qualifier注解来指定你要注入哪个数据源对应的组件。但更常见的做法是,直接让Mapper接口归属于对应的@MapperScan包下,这样Mybatis会自动将其与正确的SqlSessionFactory关联。

Mapper与Service层示例:

// PrimaryUserMapper.java - 位于 com.yourpackage.mapper.primary 包下
// 它会自动被 PrimaryDataSourceConfig 中的 @MapperScan 扫描,并使用 primarySqlSessionFactory
@Mapper
public interface PrimaryUserMapper extends BaseMapper<User> {
    // 自定义查询...
}

// SecondaryLogMapper.java - 位于 com.yourpackage.mapper.secondary 包下
// 它会自动被 SecondaryDataSourceConfig 中的 @MapperScan 扫描,并使用 secondarySqlSessionFactory
@Mapper
public interface SecondaryLogMapper extends BaseMapper<Log> {
    // 自定义查询...
}

@Service
public class BusinessService {
    @Autowired
    private PrimaryUserMapper primaryUserMapper; // 自动使用主数据源

    @Autowired
    private SecondaryLogMapper secondaryLogMapper; // 自动使用从数据源

    public void doBusiness() {
        User user = primaryUserMapper.selectById(1L);
        Log log = new Log();
        log.setAction("query");
        secondaryLogMapper.insert(log);
        // 此时操作了两个数据库
    }
}

多数据源下的事务控制: 这是另一个难点。Spring的@Transactional注解默认使用@Primary标记的事务管理器(即我们配置的primaryTransactionManager)。这意味着,如果一个Service方法上加了@Transactional,那么该方法内所有数据库操作(即使是通过secondaryLogMapper)都将在主数据源的事务中执行。这显然不符合预期,并且对从数据源的操作可能无法回滚。

解决方案是使用Spring的事务管理器路由或编程式事务。一个相对简单的实践是:将涉及不同数据源写操作的方法拆分开,或者使用@Transactional注解的transactionManager属性显式指定。

@Service
public class MixedService {

    @Transactional(transactionManager = "primaryTransactionManager")
    public void updatePrimary() {
        // 操作 primaryUserMapper
    }

    @Transactional(transactionManager = "secondaryTransactionManager")
    public void updateSecondary() {
        // 操作 secondaryLogMapper
    }

    // 这个方法没有@Transactional,或者只标记了默认的,则只适合查询,或单个数据源的写操作。
    public void updateBoth() {
        updatePrimary(); // 在独立事务中执行
        updateSecondary(); // 在另一个独立事务中执行
        // 注意:这两个事务是独立的,无法做到原子性。如果需要分布式事务,需引入Seata等方案。
    }
}

生产环境避坑清单:

  1. Druid监控未生效:检查druid-spring-boot-starter依赖,并确保YAML中stat-view-servlet.enabled: true。访问 /druid/index.html 查看。
  2. Mybatis-Plus分页失效:检查是否在SqlSessionFactoryBean中手动添加了MybatisPlusInterceptor和PaginationInnerInterceptor。多数据源下自动配置可能不生效。
  3. Mapper绑定异常(Invalid bound statement):99%的原因是@MapperScan的basePackages路径写错,或者XML文件路径setMapperLocations没配置对。确保接口和XML在正确的、被扫描的目录下。
  4. 循环依赖:如果配置类之间或与Service有复杂的@Autowired依赖,可能启动报循环依赖错误。尽量使用构造器注入或@Lazy注解。
  5. 性能问题:Druid的默认配置可能不适合高并发场景。需要根据实际监控数据调整max-active(最大连接数)、max-wait(获取连接超时时间)等参数。max-active设置过高可能导致数据库连接耗尽,设置过低则应用排队等待。
  6. 动态数据源切换:本文是静态配置多数据源。如果业务需要根据请求参数、分片键等动态切换数据源(如分库分表),则需要引入AbstractRoutingDataSource和线程上下文(如ThreadLocal)来实现,复杂度会更高。

配置多数据源就像搭积木,每一块都必须严丝合缝。最让我印象深刻的一次排查是,所有配置看起来都正确,但Druid监控里就是看不到连接池信息。最后发现是另一位同事在某个不起眼的测试配置类里,用@Bean定义了一个未指定类型的DataSource,Spring容器里存在多个同类型Bean,导致自动注入混乱。所以,在多数据源项目中,保持配置的清晰和唯一性至关重要。建议将不同数据源的配置类、Mapper包、Service层进行严格的模块化隔离,从物理结构上避免混淆。

正确可用版:SpringBoot+Mybatis-plus+Druid 实现配置多数据源(数据库) 前言 此文介绍的是在SpringBoot中使用Mybatis配置多数据源(多个数据库),整合Druid 网上有很多文章,翻了翻,但是都有问题啊,有的是没使用Druid,使用了默认的Hirika,有的是配置文件不给或者给的是Hirika能用的配置,层级不对,所以我自己来记一下 代码 pom文件maven依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid 阅读详情

相关推荐

SpringBoot+Druid多数据源配置:从Hikari切换到Druid的完整流程

本文详细介绍了如何将SpringBoot项目从HikariCP迁移到Druid连接池,并实现多数据源配置。通过对比Druid与HikariCP的优势,提供完整的依赖配置、单数据源和多数据源设置、MyBatis-Plus集成以及监控功能配置,帮助开发者提升数据库连接管理效率和系统监控能力。

qsc901234567的博客 971

spring boot + mybatis plus 搭建

看了几位大佬的文章后,终于搭建spring boot + mybatis plus成功了,实现分页查询,代码自动生成,这里使用的数据库为mysql ,数据库连接池为druid 1.maven管理: <parent> <groupId>org.springframework.boot</groupId> <artifactId>sp...

J4ffee的博客 470

Spring Boot:mybatis-plus + atomikos + druid 实现不同实例数据库的多数据源配置和分布式事务管理

想到工作上可能会用到多数据源,但是自己在这方面并不是很熟悉,于是在网上查阅了很多文章,结果发现,网上的文章要么版本太老有些过时,要么用的不是mybatis-plus而是mybaits,要么步骤繁琐、需要自己手动编写aop切面代码,要么在同一service层方法中只能使用@Transactional实现单个数据源的事务管理控制,总是觉得有点不太完美,所以综合了以上文章的不足之处和可以借鉴之处,在这里总结出了一个万能的、可以适应多方面需求的多数据源配置方法,以满足相对完整的、代码简练的分布式事务控制需求。 一.

朗朗繁星的博客 1544

04.SpringBoot 整合Druid+Mybatis-Plus实现数据持久化

4、SpringBoot 整合Druid+Mybatis-plus实现数据持久化前言1、数据连接池1.1、添加Druid的maven依赖1.2、添加配置文件(application.yml)1.3 在浏览器方位127.0.0.1/druid/,可看到druid的登录框2、Mybatis-Plus2.1、简介2.2、添加依赖2.3、分页的实现2.4、CRUD实现2.4.1、创建数据库表2.4.2、创建实体类2.4.3、创建Mapper2.4.4、创建Service接口2.4.5、实现Service接口2.4.

cwt260732160的专栏 680

SpringBoot整合MyBatis-Plus完整配置指南

ORM框架作为Java开发中数据持久层的核心技术,通过对象关系映射简化数据库操作。MyBatis-Plus在MyBatis基础上进一步增强,提供自动CRUD、分页等高效功能。与SpringBoot整合后,开发者可以快速构建数据访问层,显著提升开发效率。本文基于SpringBoot 3.1.5和MyBatis-Plus 3.5.3.1版本,详细解析依赖配置、数据源设置、分页插件等核心模块的实现方案,并针对多数据源、自动填充等高级功能提供生产级配置示例,帮助开发者规避版本兼容性问题。

weixin_34059951的博客 406

实战指南:SpringBoot+Mybatis-plus+Druid 多数据源配置避坑大全

本文提供SpringBoot+Mybatis-plus+Druid多数据源配置的实战避坑指南。针对配置中常见的Druid连接池失效、事务管理混乱等问题,详细解析了正确的依赖引入、YAML配置结构、数据源定义以及独立事务管理器配置,确保开发者能一次性成功搭建高效、可监控的多数据源环境。

weixin_29256771的博客 181

Spring boot 4 搞懂MyBatis-Plus的用法

[MyBatis-Plus](https://github.com/baomidou/mybatis-plus) 是一个 [MyBatis](https://www.mybatis.org/mybatis-3/) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生 本文针对Spring boot 4如何集成MyBatis-Plus进行梳理汇总

penriver的博客 3660

Vue项目实战:海康WebControl插件从安装到预览功能全流程(附RSA加密避坑指南)

本文详细介绍了在Vue项目中集成海康威视WebControl插件的全流程,从环境准备、插件部署到核心功能实现。重点解析了使用JS_RequestInterface获取RSA公钥并进行加密参数初始化的关键步骤与常见避坑指南,帮助开发者高效完成监控视频预览功能的开发与调试。

linux6sysadmin的博客 1228

springboot整合mybatis-plus、druid连接池和多数据源配置

在使用springboot开发业务应用程序的过程中,使用多数据源的场景很常见。目前,业界常用的spring boot整合多数据源的方案主要有两个,一个是Mapper分包方式,另一个是AOP切片方式。针对这种多数据源使用场景的痛点,MyBatis-plus团队开源了一个更为方便的解决方案(https://mp.baomidou.com/guide/dynamic-datasource.html),但是对于整合druid数据库连接池,却没有给出具体的使用示例。本篇文章就是使用springboot整合mybati

WorldMvp的专栏 1万+

《大明王朝1566》中,朝廷财政危机无法解决的根源分析

财政困局中的财富最终流向三重黑洞:​皇室挥霍​(如嘉靖炼丹修殿)、特权阶层贪腐​(严党年入百万两盐税)、制度性损耗​(宗室供养、低效官僚)。更深层的“钱”其实是被禁锢在道德化治理的牢笼中——当国家用“黄河长江皆可为用”的权术思维替代制度性改革时,财政危机便成为帝制王朝无法逃脱的宿命。

为了小家奋斗 1977

openeuler在线/离线安装docker服务

openeuler在线/离线安装docker服务

haixuti7的博客 1071

SpringBoot多数据源实战:Druid+Mybatis-Plus配置避坑指南(附完整代码)

本文深入解析了在SpringBoot项目中整合Mybatis-Plus与Druid实现多数据源的完整方案。文章不仅提供了清晰的配置代码,更重点剖析了从数据源定义、会话工厂绑定到事务管理的核心原理,并针对常见的Bean冲突、事务失效、监控异常等生产级“坑点”提供了深度解决方案,帮助开发者高效避坑。

ik678901234的博客 1085

Ubuntu本地部署CodeX编程助手:CLI配置全指南

本地AI编程助手是当前开发者关注的核心技术趋势,指在不依赖云端API、保障代码隐私前提下,于本地环境运行具备代码理解、多语言补全与知识库检索能力的智能辅助工具。其技术原理涉及模型加载、API网关编排、向量数据库集成及系统级资源调度,关键价值在于可控性、低延迟与合规性。典型应用场景包括企业内网DevOps提效、边缘设备嵌入式开发支持,以及敏感代码场景下的离线编程增强。本文聚焦Ubuntu系统下基于CLI的手动配置路径,深入解析Ollama服务注册、Node.js版本锁定、API Key环境隔离及Qwen2.5

weixin_26804345的博客 598

SpringBoot整合Mybatis-Plus、Druid配置多数据源

本文将介绍如何使用Spring Boot框架整合MyBatis和Druid多数据源,并包含以下内容: 概述Spring Boot、MyBatis和Druid 环境准备和依赖配置 配置多数据源 配置MyBatis 配置Druid连接池 使用MyBatis访问多数据源 代码实现和测试 通过本文的阅读,学习到如何使用Spring Boot框架整合MyBatis和Druid多数据源,能够帮助您更快速、更高效地开发企业级应用程序。

拾一二的博客 1万+

利用Arcgis发布wmts服务

使用发布 GIS 服务连接连接到 ArcGIS Server 站点后,可以将各种 GIS 资源(如地图文档、数据库以及服务定义)发布到服务器上。此外,还可以添加、删除、启动和停止服务。使用管理 GIS 服务器连接到 ArcGIS Server 站点后,可以编辑各种服务器属性,例如配置存储位置、集群配置、参与到该站点中的计算机列表以及管理站点的数据存储。通过使用 GIS 服务连接建立连接后,可以查看并使用发布到该站点的服务。但不能编辑服务器或服务属性、发布服务,也不能添加、删除、启动、停止或暂停服务。

ghgfsasxda的博客 2395

基于PLC的立体车库控制系统设计

本文介绍了基于西门子S7-1511-1PN PLC和KTP700 Basic PN HMI的立体堆垛式停车场自动化控制系统。系统通过PLC逻辑控制滑台运动,配合传感器实现车辆存取自动化,包含初始化、入库、出库和安全保护程序。程序采用模块化设计,分为安全互锁、动画显示、模式切换等六个功能模块,运用边沿触发、定时器和多级联锁确保安全。HMI界面提供模式切换、车位选择、状态显示和手动控制功能。该系统具有模块化、安全性和可扩展性特点,可应用于多车位立体停车场场景。

sxs3030787796的博客 1266

SpringBoot整合Mybatis-Plus+Druid实现多数据源

springboot 整合mybitasplus + druid 实现多数据源 。

爱媳妇儿爱编程 7921

45.qt quick-qml虚拟软键盘详解(一)

1.qml虚拟键盘介绍 Qt虚拟键盘的主要功能包括: 可定制的键盘布局和风格与动态切换。 带有单词选择的预测性文本输入。 角色预览和替代角色视图。 自动大小写和空格插入。 不同分辨率的可伸缩性。 支持不同的字符集(拉丁,简体/繁体中文,印地语,日语,阿拉伯语,希伯来语,韩语和其他)。 支持大多数常见的输入语言,可以轻松扩展语言支持。 从左到右和从右到左的输入。 硬件键支持2路和5路导航。 手写支持,带有全屏输入的手势。 音频反馈。 跨平台功能。 支持多国语言,高达40多个语言 本

抵抗时间扭曲,坚持做一件有意义的事 3561

Springboot+MyBatis-Plus+druid多数据源配置实现

Springboot+MyBatis-Plus+druid多数据源配置实现 一.背景 业务上需求或者业务的扩展需要分库,多数据源的配置使用在业务开发中常常会用到。MyBatis-plus官网(https://mp.baomidou.com/guide/dynamic-datasource.html)对如何配置多数据源给出了范例,但对于整合druid数据库连接池却没有具体的实施范例。 二.依赖 <parent> <groupId>org.springframework.boot<

sunrise_zhu的专栏 7966

【C++实战(62)】从0到1:C++打造TCP网络通信实战指南

本文是 C++ 网络编程实战专栏第 62 篇,聚焦 TCP 客户端与服务端开发。先阐述 TCP 协议特点、核心 API 及阻塞与非阻塞 IO 区别,打牢基础;再详解 TCP 服务端初始化、客户端连接处理与数据收发,以及客户端初始化、异常处理和协议设计;最后通过简易聊天系统实战,介绍线程池应用、协议解析及稳定性测试,助力开发者掌握 TCP 网络编程实操技能。

邓邓子的博客 999

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

springboot+druid+mybatis plus的多数据源配置

注:本文主要介绍基于注解的方式,适合于有一个主库,其他库只使用个别表的情形,我会在文末贴出使用切面方式博客地址。 1、创建工程引入依赖 使用动态数据源不一样的是需要引入dynamic-datasource-spring-boot-starter包。 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave...

qqxhb 资源共享 4881

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SpringBoot + Mybatis Plus + Druid 实现多数据源切换和动态事务

之前配置多数据源踩了很多坑,包括事务注解失效,多数据源无法切换等,特此把配置过程整理下来,以供后来的小伙伴参考。

盛夏温暖流年 4191

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

基于SpringBoot的XXL-JOB集成mybatis-plus+druid多数据源配置

一、简介 二、过程 新建一个SpringBoot项目,或使用现有的SpringBoot项目; maven配置pom.xml,导入相关的依赖 编写application.yml,如:项目路径名及端口,mybatisplus配置,mysql多数据源配置。 新建DataSourceContextHolder 用于设置,获取,清空 当前线程内的数据源变量。 新建 MultipleDataSource 实现 AbstractRoutingDataSource 类。重写determineCurren..

花开不败才是姿态 4767

SpringBoot整合mybatis-plus配置多数据源,整合Druid连接池及数据源监控

文章目录添加相应依赖(重要)排除原生Druid的快速配置类yml配置使用多数据源如何在同一个方法中切换数据源?整合Druid连接池及数据源监控 第一次用mybatis-plus配置多数据源也是踩了很多坑,写一篇文章记录下详细的配置过程。首先要自行搭建一个初始化的springboot工程 添加相应依赖(重要) 为什么说添加相应依赖很重要,因为这里坑很多,依赖添不好启动直接会jar包冲突报错的。 1.MyBatis-Plus官方文档说多数据源配置第一步要引入dynamic-datasource-spring-b

凹凸曼的博客 3608

SpringBoot2.x + MyBatis-Plus + Druid + 注解方式多数据源

【简介】 如果不熟悉MyBatis-Plus可以先看下这篇文章:SpringBoot2.x整合MyBatis-Plus 本文主要讲解使用注解的方式配置多数据源 【本文Demo】 https://github.com/qidasheng2012/data-sources 本文只会把核心的一部分代码粘贴出来进行讲解,道友可以根据上面的GitHub地址clone下项目,修改为自己的数据库配置,项目即可...

日拱一卒 3014
上一篇: Mac上VScode与Fortran的联姻:从零搭建高效科学计算环境
下一篇: 深入剖析Transformers库中的Trainer类:从基础配置到高级优化
code8
博客等级 码龄17年 65粉丝 1720原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值