当前位置: 首页 > news >正文

Spring Boot 多数据源配置

1. 项目结构

src
├── main
│   ├── java
│   │   └── org
│   │       └── songtang
│   │           └── springbootdynamic
│   │               ├── config
│   │               ├── controller
│   │               ├── entity
│   │               ├── mapper
│   │               │   ├── master
│   │               │   └── slave
│   │               └── service
│   └── resources
│       └── mapper
│           ├── master
│           └── slave
└── test

pom配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.2</version><relativePath/></parent><groupId>org.songtang</groupId><artifactId>springboot-dynamic</artifactId><version>0.0.1-SNAPSHOT</version><properties><java.version>17</java.version><mysql.version>8.4.0</mysql.version><mybatisplus.version>3.5.7</mybatisplus.version></properties><dependencies><!-- SpringBoot相关 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mybatisplus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>${mybatisplus.version}</version></dependency><!--mysql 数据库相关--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.34</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins><resources><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes></resource></resources></build></project>

2. 数据源配置类 (DataSourceConfig)

此类用于配置多个数据源,并将其分别标记为 PrimarySecondary,以便在需要时进行区分。

package org.songtang.springbootdynamic.config;import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
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 org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;@Configuration
public class DataSourceConfig {@Primary@Bean(name = "mainDateSource")@ConfigurationProperties(prefix = "spring.datasource.main")public DataSource mainDateSource(){return DataSourceBuilder.create().build();}@Bean(name = "targetDateSource")@ConfigurationProperties(prefix = "spring.datasource.target")public DataSource targetDateSource(){return DataSourceBuilder.create().build();}@Primary@Bean(name = "mainSessionFactory")public SqlSessionFactory mainSessionFactory(@Qualifier("mainDateSource")DataSource dataSource) throws Exception{MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();mybatisSqlSessionFactoryBean.setDataSource(dataSource);mybatisSqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master/*.xml"));return mybatisSqlSessionFactoryBean.getObject();}@Bean(name = "targetSessionFactory")public SqlSessionFactory SessionFactory(@Qualifier("targetDateSource")DataSource dataSource) throws Exception{MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/slave/*.xml"));return sqlSessionFactoryBean.getObject();}@Bean(name = "mainTransactionManager")public DataSourceTransactionManager mainTransactionManager(@Qualifier("mainDateSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean(name = "targetTransactionManager")public DataSourceTransactionManager targetTransactionManager(@Qualifier("targetDateSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}

3. 数据源映射配置类

MasterMapperConfigSlaveMapperConfig 分别配置主数据源和从数据源的 Mapper

主数据源配置 (MasterMapperConfig)

package org.songtang.springbootdynamic.config;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;@Configuration
@MapperScan(basePackages = "org.songtang.springbootdynamic.mapper.master", sqlSessionFactoryRef = "mainSessionFactory")
public class MasterMapperConfig {
}

从数据源配置 (SlaveMapperConfig)

package org.songtang.springbootdynamic.config;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;@Configuration
@MapperScan(basePackages = "org.songtang.springbootdynamic.mapper.slave", sqlSessionFactoryRef = "targetSessionFactory")
public class SlaveMapperConfig {
}

4. 实体类 (Member)

Member 实体类用于表示数据库中的成员数据,并与 masterslave 两个数据源交互。

package org.songtang.springbootdynamic.entity;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@TableName("member")
@Data
public class Member extends BaseEntity{private String name;private String phone;private Double amount;
}

5. Mapper 接口

Mapper 接口用于定义与数据库交互的方法。

主数据源 Mapper (MasterMapper)

package org.songtang.springbootdynamic.mapper.master;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.songtang.springbootdynamic.entity.Member;@Mapper
public interface MasterMapper extends BaseMapper<Member> {// 主数据源相关操作
}

从数据源 Mapper (SlaveMapper)

package org.songtang.springbootdynamic.mapper.slave;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.songtang.springbootdynamic.entity.Member;@Mapper
public interface SlaveMapper extends BaseMapper<Member> {// 从数据源相关操作
}

6. 控制器 (Controller)

控制器类用于定义对外暴露的 API 接口,用于操作不同数据源的数据。

package org.songtang.springbootdynamic.controller;import org.songtang.springbootdynamic.entity.Member;
import org.songtang.springbootdynamic.service.YourService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/api")
public class MultiDataSourceController {@Autowiredprivate YourService yourService;// 使用主数据源插入数据@PostMapping("/master")public void addMasterEntity(@RequestBody Member masterEntity) {yourService.addMaster(masterEntity);}// 使用从数据源插入数据@PostMapping("/slave")public void addSlaveEntity(@RequestBody Member slaveEntity) {yourService.addSlave(slaveEntity);}
}

7. 使用示例

在项目中,可以通过调用控制器的 API 来测试不同数据源的功能:

  • 插入主数据源的数据: 通过 /api/master 接口插入数据
  • 插入从数据源的数据: 通过 /api/slave 接口插入数据

8. application.yml 配置 

application.yml 文件中需要配置主数据源和从数据源的连接信息:

spring:datasource:main:url: jdbc:mysql://localhost:3306/masterdbusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivertarget:url: jdbc:mysql://localhost:3306/slavedbusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver

总结

通过以上配置,您可以在 Spring Boot 项目中成功实现多数据源的管理,分离不同的数据库操作。这样可以轻松处理不同数据源之间的事务以及数据交互,确保应用的高效性和可扩展性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【软件工程】软件与软件危机
  • Kali学习(ms17-010、ms08-067漏洞复现)
  • 算法: 双指针
  • QT Quick QML 添加海康威视SDK云台控制模块
  • 【ShuQiHere】《机器学习的进化史『上』:从数学模型到智能算法的百年征程》
  • 【Git】常用命令大全(带注释)
  • GPT-4.0 新手使用教程(保姆级入门)
  • OpenCV小练习:身份证号码识别
  • linux-----内核(Kernel)与文件系统(File System)
  • 排序---
  • 04:创建PADS Logic软件逻辑库
  • 乾元通渠道商中标湖南省煤业集团公司安全生产预防和应急救援能力建设装备配备采购项目
  • 快速安全部署 Tomcat
  • 电路笔记(PCB): kicad freerouting自动布线
  • UVM仿真的启动(二)—— uvm_phase::m_run_phase()
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【笔记】你不知道的JS读书笔记——Promise
  • Angular6错误 Service: No provider for Renderer2
  • Joomla 2.x, 3.x useful code cheatsheet
  • laravel 用artisan创建自己的模板
  • Unix命令
  • 基于游标的分页接口实现
  • 聊聊sentinel的DegradeSlot
  • 面试遇到的一些题
  • 前端js -- this指向总结。
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 消息队列系列二(IOT中消息队列的应用)
  • 赢得Docker挑战最佳实践
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • FaaS 的简单实践
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ## 1.3.Git命令
  • $.ajax()
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (Python第六天)文件处理
  • (windows2012共享文件夹和防火墙设置
  • (二) 初入MySQL 【数据库管理】
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (函数)颠倒字符串顺序(C语言)
  • (区间dp) (经典例题) 石子合并
  • (十)c52学习之旅-定时器实验
  • (四)stm32之通信协议
  • (一)Linux+Windows下安装ffmpeg
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .htaccess 强制https 单独排除某个目录
  • .NET NPOI导出Excel详解
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • @Conditional注解详解
  • @html.ActionLink的几种参数格式
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [\u4e00-\u9fa5] //匹配中文字符
  • [ACM独立出版]2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)