SpringBoot Mybatis多数据源配置全过程

 更新时间:2025年11月12日 08:50:43   作者:fengyehongWorld  
本文详细介绍了如何在Java项目中配置多数据源,包括配置文件设置、多数据源配置类、MyBatis配置等,通过两种不同的方式配置primary和secondary数据源,展示了如何处理Mapper接口文件和.xml文件不在同一目录下的情况,并使用@Primary注解指定默认数据源

一. 配置文件

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);
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Intellij IDEA如何查看所有断点

    Intellij IDEA如何查看所有断点

    这篇文章主要介绍了Intellij IDEA如何查看所有断点问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • SpringBoot+Tess4j实现牛的OCR识别工具的示例代码

    SpringBoot+Tess4j实现牛的OCR识别工具的示例代码

    这篇文章主要介绍了SpringBoot+Tess4j实现牛的OCR识别工具的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Java substring原理及使用方法实例

    Java substring原理及使用方法实例

    这篇文章主要介绍了Java substring原理及使用方法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • java实现波雷费密码算法示例代码

    java实现波雷费密码算法示例代码

    这篇文章主要介绍了java实现波雷费密码算法示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 使用graalvm为带有反射功能的java代码生成native image的示例详解

    使用graalvm为带有反射功能的java代码生成native image的示例详解

    graalvm让native镜像支持反射的关键是利用json提前告诉它哪些类的哪些方法会被反射调用,然后它就能力在运行时支持反射了,这篇文章主要介绍了如何使用graalvm为带有反射功能的java代码生成native image,需要的朋友可以参考下
    2024-02-02
  • Java并发系列之CyclicBarrier源码分析

    Java并发系列之CyclicBarrier源码分析

    这篇文章主要为大家详细分析了Java并发系列之CyclicBarrier源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Java使用Tesseract-Ocr识别数字

    Java使用Tesseract-Ocr识别数字

    这篇文章主要介绍了Java使用Tesseract-Ocr识别数字的方法,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • SpringBoot底层注解详解

    SpringBoot底层注解详解

    这篇文章主要介绍了SpringBoot底层注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-05-05
  • java复制文件的4种方式及拷贝文件到另一个目录下的实例代码

    java复制文件的4种方式及拷贝文件到另一个目录下的实例代码

    这篇文章主要介绍了java复制文件的4种方式,通过实例带给大家介绍了java 拷贝文件到另一个目录下的方法,需要的朋友可以参考下
    2018-06-06
  • springBoot整合shiro如何解决读取不到@value值问题

    springBoot整合shiro如何解决读取不到@value值问题

    这篇文章主要介绍了springBoot整合shiro如何解决读取不到@value值问题,具有很好的参考价值,希望对大家有所帮助,
    2023-08-08

最新评论