springboot使用mybatis配置多数据源

概述

配置多数据源有两种方案。一种是使用dynamic依赖的@DS注解的方法,这种是比较简单方便的方法。另一种是本文介绍的方式,配置不同数据源的SqlSessionFactory 。

第二种方法是我在开发一个老项目时,老项目配置的方法。

application.xml

xml 复制代码
server:
  port: 8002

spring:
  datasource:
    master:
      jdbc-url: xxx
      username: username
      password: password
      driver-class-name: driver-class-name
    slave:
      jdbc-url: xxx
      username: username
      password: password
      driver-class-name: driver-class-name

初始化多数据源

java 复制代码
package com.zou.myproject.config;

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 DatasourceConfig {

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

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

}

主数据源配置

java 复制代码
package com.zou.myproject.config;

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
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.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 javax.sql.DataSource;

@Configuration
@MapperScan(
        basePackages = "com.zou.myproject.mapper",
        sqlSessionFactoryRef = "sqlSessionFactoryMaster",
        sqlSessionTemplateRef = "sqlSessionTemplateMaster"
)
public class MasterDatasourceConfig {
    private DataSource masterDatasource;

    public MasterDatasourceConfig(@Qualifier("masterDatasource") DataSource masterDatasource){
        this.masterDatasource = masterDatasource;
    }

    @Bean("sqlSessionFactoryMaster")
    @Primary
    public SqlSessionFactory sqlSessionFactoryMaster() throws Exception{
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(masterDatasource);
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        bean.setMapperLocations(resolver.getResources("classpath*:/mapper/*.xml"));
        return bean.getObject();
    }

    @Bean("sqlSessionTemplateMaster")
    @Primary
    public SqlSessionTemplate sqlSessionTemplateMaster() throws Exception{
        return new SqlSessionTemplate(sqlSessionFactoryMaster());
    }
}

次数据源

java 复制代码
package com.zou.myproject.config;

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
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.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;


@Configuration
@MapperScan(
        basePackages = "com.zou.myproject.mapper2",
        sqlSessionFactoryRef = "sqlSessionFactorySlave",
        sqlSessionTemplateRef = "sqlSessionTemplateSlave"
)
public class SlaveDatasourceConfig {
    private DataSource slaveDatasource;

    public SlaveDatasourceConfig(@Qualifier("slaveDatasource") DataSource slaveDatasource){
        this.slaveDatasource = slaveDatasource;
    }

    @Bean("sqlSessionFactorySlave")
    public SqlSessionFactory sqlSessionFactorySlave() throws Exception{
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(slaveDatasource);
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        bean.setMapperLocations(resolver.getResources("classpath*:/mapper2/*.xml"));
        return bean.getObject();
    }

    @Bean("sqlSessionTemplateSlave")
    public SqlSessionTemplate sqlSessionTemplateSlave() throws Exception{
        return new SqlSessionTemplate(sqlSessionFactorySlave());
    }
}

测试

我这里就不贴代码了。思路就是创建单元测试,新建两个mapper,不同mapper对应不同数据源。最后我自己的测试方法是可行的。

启动类取消mybatisplus的自动装配

如果上面配置完启动后,使用mybatisplus封装的方法报了Invalid bound statement的错误,就把MybatisAutoConfiguration.class从启动类中排除掉。

java 复制代码
package com.zou.myproject;

import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(exclude = MybatisAutoConfiguration.class)
public class MyProjectApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyProjectApplication.class, args);
    }

}

总结

springboot mybatis mybatisplus+多数据源配置+事务,这块内容开发的时候都是一直查一直试错才找到解决方案的,有时间得看源码才能理清楚。

相关推荐
Cicada1283 分钟前
ccvt:一个用 Rust 写的中国地图坐标系互转命令行工具
开发语言·后端·rust
明月_清风11 分钟前
🤗 Hugging Face 模型上传完全指南:从本地到 Hub 的 4 种姿势
前端·后端·ai编程
神奇小汤圆1 小时前
疯了!Fastjson 又爆出严重安全漏洞,Spring Boot 项目赶紧自查
后端
自进化Agent智能体2 小时前
Hermes CLI 界面详解——命令行交互全攻略
后端
1点东西2 小时前
做了个AI日志平台,零代码接入,嘎嘎好用
后端·aigc·自动化运维
程序员AI工坊3 小时前
Agent 开发:ReAct 循环与工具调用实战——从单次调用到自主 Agent
人工智能·后端·python·langchain·agent·react
不爱说话郭德纲3 小时前
我只给了 TRAE Work 一张差评截图,它最后却把自己的 P0 结论推翻了?
前端·后端·架构
tech讯息3 小时前
企业做视频生成,应该选择哪些云上多模态模型平台,以平衡模型质量、可控性和推理成本?AWS 分层选型路径
后端
不谈恋爱的猫3 小时前
redis哨兵模式
数据库·redis·mybatis