SpringBoot Mybatis多数据源配置

这篇博客介绍了如何在SpringBoot2.x项目中配置MyBatis以支持多个数据源。首先展示了配置文件,包括两个不同数据库的连接信息。接着,详细解释了多数据源配置类的编写,包括`@Primary`注解的使用来设定默认数据源,以及两种不同的数据源配置方法:一种基于`@ConfigurationProperties`,另一种通过指定XML文件位置。最后,通过示例展示了如何在控制器中注入并使用不同数据源的Mapper,实现了从两个数据源分别查询数据的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考资料:

  1. Spring Boot 2.x基础教程:MyBatis的多数据源配置


一. 配置文件

spring:
  datasource:
    # 数据源1
    primary:
      jdbc-url: jdbc:mysql://localhost/myblog?useUnicode=true&characterEncoding=utf-8
      username: root
      password: mysql
      driver-class-name: com.mysql.cj.jdbc.Driver
    # 数据源2
    secondary:
      jdbc-url: jdbc:mysql://localhost/pythonblog?useUnicode=true&characterEncoding=utf-8
      username: root
      password: mysql
      driver-class-name: com.mysql.cj.jdbc.Driver

⏹同时连接了Mysql中的两个数据库,myblogpythonblog

在这里插入图片描述


二. 多数据源配置类

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfiguration {

    // Primary注解是在没有指明使用哪个数据源的时候指定默认使用的主数据源
    @Primary
    @Bean("primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean("secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
}

三. 多数据源Mybatis配置

注意事项:

  • 3.1 primary数据源配置3.2 secondary数据源配置是两种不同的配置方式,都能实现多数据源的效果.此处使用两种不同的方式进行配置,只是为了展示不同的配置方式.
  • sqlSessionFactoryBean.setMapperLocations适用于Mybatis的Mapper接口文件和 .xml文件不在同一个目录下的情况,用于指定 .xml文件 所在的文件路径.
  • @Primary注解用于指定默认的数据源.

3.1 primary数据源配置

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.annotation.Resource;
import javax.sql.DataSource;

@Configuration
@MapperScan(
		// 指定该数据源扫描指定包下面的Mapper接口文件
        basePackages = "com.example.jmw.mapper",
        sqlSessionFactoryRef = "sqlSessionFactoryPrimary",
        sqlSessionTemplateRef = "sqlSessionTemplatePrimary")
publc class DataSourcePrimaryConfig {
	
	// 注入数据源1
    @Resource
    private DataSource primaryDataSource;

    @Bean
    @Primary
    public SqlSessionFactory sqlSessionFactoryPrimary() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(primaryDataSource);
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    @Primary
    public SqlSessionTemplate sqlSessionTemplatePrimary() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryPrimary());
    }
}

在这里插入图片描述

3.2 secondary数据源配置

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
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.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(
        basePackages = "com.example.jmw.mapper1",
        sqlSessionFactoryRef = "sqlSessionFactorySecondary")
public class DataSourceSecondaryConfig {

    // mapper扫描xml文件的路径
    private static final String MAPPER_LOCATION = "classpath:mapper1/*.xml";

    private DataSource secondaryDataSource;
	
	// 通过构造方法进行注入
    public DataSourceSecondaryConfig(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
        this.secondaryDataSource = secondaryDataSource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactorySecondary() throws Exception {

        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();

        // 指定数据源
        sqlSessionFactoryBean.setDataSource(secondaryDataSource);
        /*
			获取xml文件资源对象
			当Mapper接口所对应的.xml文件与Mapper接口文件分离,存储在 resources 
			文件夹下的时候,需要手动指定.xml文件所在的路径
		*/ 
        Resource[] resources = new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION);
        sqlSessionFactoryBean.setMapperLocations(resources);

        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public DataSourceTransactionManager SecondaryDataSourceManager() {
        return new DataSourceTransactionManager(secondaryDataSource);
    }
}

在这里插入图片描述


四. 效果

import com.example.jmw.mapper.I18nMessageMapper;
import com.example.jmw.mapper1.BlogTagMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import java.util.List;

@Controller
@RequestMapping("/test12")
public class Test12Controller {
	
	// 数据源1Mapper注入
	@Resource
    private I18nMessageMapper i18nMessageMapper;
	
	// 数据源2Mapper注入
    @Resource
    private BlogTagMapper blogTagMapper;

    @GetMapping("/selectManyDataSourceData")
    @ResponseBody
    public void selectManyDataSourceData() {
		
		// 查询数据源1中的数据
        List<I18MessageEnttiy> allLocaleMessage = i18nMessageMapper.getAllLocaleMessage();
        System.out.println(allLocaleMessage);
		
		// 查询数据源2中的数据
        List<BlogTag> allBlogTag = blogTagMapper.getAllBlogTag();
        System.out.println(allBlogTag);
    }
}

在这里插入图片描述

<think>首先,用户的问题是:“我想了解如何在SpringBoot项目中使用MyBatis配置多数据源请问springbootmybatis多数据源配置教程”。根据系统指令,我需要基于提供的引用(引用[1]到[4])来回答这个问题。系统指令关键点:-所有行内数学表达式使用$...$格式(但这里可能不需要数学表达式,因为主题是SpringBootMyBatis)。-独立公式使用$$...$$格式(同样,可能不适用)。-LaTeX语法正确。-使用中文回答。-生成相关问题。-在引用的段落末尾自然地添加引用标识。-回答结构清晰,帮助用户逐步解决问题。-参考用户上一次的问题:用户提到参考站内引用,但用户的初始问题就是如何配置多数据源。提供的引用摘要:-[^1]:SpringBoot多数据源配置教程,自动切换数据源的项目地址。-[^2]:SpringBoot2.x基础教程:MyBatis多数据源配置,来自博客didispace.com。-[^3]:SpringBoot整合MyBatis多数据源配置了application.properties中的两个数据源。-[^4]:SpringBoot集成MyBatis配置多数据源详细教程,包括Mapper接口和XML文件的组织。我需要基于这些引用来构建回答。核心主题是配置多数据源,涉及:1.配置数据源在application.properties(或.yml)中。2.定义多个DataSourcebean。3.配置MyBatis来使用这些数据源。4.组织Mapper接口和XML映射文件。逐步回答结构:1.**引言**:简要介绍SpringBootMyBatis配置多数据源的重要性或场景。2.**步骤分解**:分步解释配置过程。3.**参考引用的部分**:自然地融入引用内容。4.**代码示例**:提供代码片段展示配置。5.**相关问题**:生成相关问题。6.**引用标识**:在相关的结尾处添加引用标识。回答必须是中文。最终输出格式:按照用户可见层,结构清晰。生成相关问题:在回答末尾,添加相关问题,用§§相关问题§§标记。现在,规划回答内容:**步骤:**1.**配置数据源属性**:在application.properties中定义多个数据源的连接信息。示例来自[^3]:```spring.datasource.one.url=jdbc:mysql:///zmfspring.datasource.one.username=rootspring.datasource.one.password=rootspring.datasource.one.driver-class-name=com.mysql.jdbc.Driver#类似定义第二个数据源spring.datasource.two.url=jdbc:mysql:///test...```添加引用标识[^3]。2.**创建DataSourcebeans**:在配置类中定义多个DataSourcebean。从引用中推测,使用@Configuration注解类,定义@Bean方法。例如:```java@ConfigurationpublicclassDataSourceConfig{@Bean@ConfigurationProperties(prefix="spring.datasource.one")publicDataSourcedataSourceOne(){returnDataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix="spring.datasource.two")publicDataSourcedataSourceTwo(){returnDataSourceBuilder.create().build();}}```参考[^3],它提到提供两个DataSource。3.**配置MyBatisSessionFactory**:为每个数据源创建SqlSessionFactory和SqlSessionTemplate。引用[^4]提到在Mapper接口和XML中组织不同包。-例如,为每个数据源创建单独的配置:```java@Configuration@MapperScan(basePackages="com.example.mapper.one",sqlSessionTemplateRef="sqlSessionTemplateOne")publicclassMyBatisConfigOne{@BeanpublicSqlSessionFactorysqlSessionFactoryOne(DataSourcedataSourceOne)throwsException{SqlSessionFactoryBeanfactoryBean=newSqlSessionFactoryBean();factoryBean.setDataSource(dataSourceOne);factoryBean.setMapperLocations(newPathMatchingResourcePatternResolver().getResources("classpath:mapper/one/*.xml"));returnfactoryBean.getObject();}@BeanpublicSqlSessionTemplatesqlSessionTemplateOne(SqlSessionFactorysqlSessionFactoryOne){returnnewSqlSessionTemplate(sqlSessionFactoryOne);}}```类似定义第二个配置。4.**组织Mapper接口**:引用[^4]:在com.chenyun.cloud.mapper.wxdev和com.chenyun.cloud.mapper.platform包中提供不同的Mapper接口,以及在resources目录下创建不同的XML映射文件。添加引用[^4]。5.**自动切换数据源**:引用[^1]提到自动切换数据源,可能使用AOP或ThreadLocal来管理数据源路由。完整回答:-开头:解释什么是多数据源配置。-步骤1:配置属性。-步骤2:定义DataSourcebeans。-步骤3:配置MyBatisSqlSessionFactory和Template。-步骤4:使用@MapperScan指定不同的包。-结尾:总结或注意事项。相关问题生成:基于主题,生成如:1.如何实现多数据源的动态切换?2.SpringBoot中如何解决多数据源事务问题?3.MyBatis多数据源配置常见问题有哪些?添加引用标识:-在提到具体内容后添加,例如:"配置属性如引用[^3]所示。"</think> ### Spring Boot配置MyBatis多数据源的分步教程 在Spring Boot项目中配置MyBatis多数据源,主要涉及定义多个数据源、创建独立的SqlSessionFactory实例,并通过包路径或Mapper接口分离不同数据源的SQL操作。以下是基于参考引用的详细步骤指南: #### **步骤1:配置数据源属性(`application.properties`)** 在配置文件中定义多个数据源的连接信息。以下示例配置两个数据源(`one` 和 `two`),分别指向不同的数据库: ```properties # 数据源 one 的配置 spring.datasource.one.url=jdbc:mysql:///zmf spring.datasource.one.username=root spring.datasource.one.password=root spring.datasource.one.driver-class-name=com.mysql.jdbc.Driver # 数据源 two 的配置 spring.datasource.two.url=jdbc:mysql:///test spring.datasource.two.username=root spring.datasource.two.password=root spring.datasource.two.driver-class-name=com.mysql.jdbc.Driver ``` 关键点: - 使用前缀(如`spring.datasource.one`)区分不同数据源。 - 支持第三方连接池(如Druid),通过`type`属性指定[^3]。 #### **步骤2:创建多个DataSource Bean** 在配置类中定义多个`DataSource` Bean,分别对应配置文件中的属性: ```java @Configuration public class DataSourceConfig { // 数据源 one @Bean @ConfigurationProperties(prefix = "spring.datasource.one") public DataSource dataSourceOne() { return DataSourceBuilder.create().build(); } // 数据源 two @Bean @ConfigurationProperties(prefix = "spring.datasource.two") public DataSource dataSourceTwo() { return DataSourceBuilder.create().build(); } } ``` 说明:`@ConfigurationProperties`自动绑定属性到Bean属性[^3]。 #### **步骤3:配置独立的SqlSessionFactory和SqlSessionTemplate** 为每个数据源创建单独的`SqlSessionFactory`和`SqlSessionTemplate`,确保SQL会话隔离: ```java @Configuration @MapperScan(basePackages = "com.example.mapper.one", sqlSessionTemplateRef = "sqlSessionTemplateOne") public class MyBatisConfigOne { @Autowired private DataSource dataSourceOne; @Bean public SqlSessionFactory sqlSessionFactoryOne() throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSourceOne); // 指定Mapper XML路径(可选) factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/one/*.xml")); return factoryBean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplateOne() throws Exception { return new SqlSessionTemplate(sqlSessionFactoryOne()); } } // 类似配置第二个数据源(如MyBatisConfigTwo),修改basePackages和路径 ``` 要点: - `@MapperScan`的`basePackages`指定Mapper接口的包路径,确保不同数据源接口隔离(如`com.example.mapper.one`和`com.example.mapper.two`)[^4]。 - XML映射文件建议放在不同目录(如`resources/mapper/one`和`resources/mapper/two`)[^4]。 #### **步骤4:实现自动数据源切换(可选)** 引用[^1]提到的项目实现了自动切换逻辑: - 使用Spring AOP或自定义注解,通过ThreadLocal动态切换数据源。 - 示例核心逻辑: ```java public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceKey(); // 从ThreadLocal获取数据源标识 } } ``` - 可在[项目地址](https://gitcode.com/gh_mirrors/spr/springboot-multiple-dataSources)查看完整代码[^1]。 #### **注意事项** 1. **事务管理**:默认Spring事务仅支持单个数据源。如需多数据源事务,需引入JTA或Atomikos。 2. **依赖冲突**:确保`spring-boot-starter-jdbc`和`mybatis-spring-boot-starter`版本兼容[^2]。 3. **测试**:启动时检查日志确认数据源初始化成功。 通过以上步骤,即可实现多数据源的隔离操作。例如,访问`com.example.mapper.one`包中的Mapper会使用数据源one,而`com.example.mapper.two`则使用数据源two[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值