SpringBoot结合MyBatis实现多数据源配置

news2025/1/23 22:33:28

SpringBoot结合MyBatis实现多数据源配置

一、前提条件

1.1、环境准备

SpringBoot框架实现多数据源操作,首先需要搭建Mybatis的运行环境。

由于是多数据源,也就是要有多个数据库,所以,我们创建两个测试数据库,分别是:【sp-demo01】和【sp-demo02】,如下图所示:

在这里插入图片描述

具体SQL代码:

  • 创建【sp-demo01】数据库。
-- 创建数据库
CREATE DATABASE sp-demo01;
 
-- ----------------------------
-- Table structure for t_emp
-- ----------------------------
DROP TABLE IF EXISTS `t_emp`;
CREATE TABLE `t_emp` (
  `emp_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '员工ID',
  `emp_name` varchar(255) NOT NULL COMMENT '员工姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `dept_id` int(11) NOT NULL COMMENT '部门ID',
  PRIMARY KEY (`emp_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3002 DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of t_emp
-- ----------------------------
INSERT INTO `t_emp` VALUES ('2001', 'Lucy', '21', '1002');
INSERT INTO `t_emp` VALUES ('3001', 'Tom', '25', '1001');
  • 创建【sp-demo02】数据库。
-- 创建数据库
CREATE DATABASE sp-demo02;
 
-- ----------------------------
-- Table structure for t_dept
-- ----------------------------
DROP TABLE IF EXISTS `t_dept`;
CREATE TABLE `t_dept` (
  `dept_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '部门ID',
  `dept_name` varchar(255) NOT NULL COMMENT '部门名称',
  `desc` varchar(255) DEFAULT NULL COMMENT '描述',
  PRIMARY KEY (`dept_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1003 DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of t_dept
-- ----------------------------
INSERT INTO `t_dept` VALUES ('1001', '研发部', '编写程序');
INSERT INTO `t_dept` VALUES ('1002', '测试部', '寻找bug');

1.2、如何配置

MyBatis框架中,提供了一个**【@MapperScan】注解,该注解作用是指定mapper接口所在的路径,并且这个注解中,也可以指定使用哪个【SqlSessionFactory】对象,只需要通过该注解的【sqlSessionFactoryRef】**属性即可实现。

这里的SqlSessionFactory就相当于是一个数据库,如果我们要配置多数据源,那就相当于是要在工程里面创建多个SqlSessionFactory对象,然后再使用的时候指定具体的SqlSessionFactory对象即可。

在这里插入图片描述

配置数据源,需要创建三个对象,分别是下面三个:

  • 第一个对象:创建DataSource对象。
  • 第二个对象:创建SqlSessionFactory对象。
  • 第三个对象:创建SqlSessionTmplate对象。

知道了这个知识,那就可以进行多数据源配置啦。

二、多数据源配置

这里,我们就创建两个数据源作为测试案例,两个数据源分别叫做【MasterDataSource】和【SlaveDataSource】。

2.1、创建数据源配置类

(1)创建Master配置类

在工程中,创建一个【MasterDataSourceConfig】配置类,代码如下所示:

package com.spring.boot.demo.config;
 
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
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;
 
/**
 * @author Js
 * @version 1.0.0
 * @Date: 2023/09/06 19:16:30
 * @Description
 */
@MapperScan(
        basePackages = "com.spring.boot.demo.master.mapper",
        sqlSessionFactoryRef = "masterSqlSessionFactory",
        sqlSessionTemplateRef = "masterSqlSessionTemplate"
)
@Configuration
public class MasterDataSourceConfig {
 
    // 默认指定 master 作为主数据源
    @Primary
    // 注入数据源
    @Bean("masterDataSource")
    // 指定 master 数据源的配置信息前缀
    @ConfigurationProperties(prefix = "spring.datasource.master")
    public DataSource masterDataSource() {
        // 手动创建 Druid 数据源对象
        return DruidDataSourceBuilder.create().build();
    }
 
    // 创建 SqlSessionFactory 对象
    @Bean("masterSqlSessionFactory")
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource) throws Exception {
        // 创建 SqlSessionFactoryBean 对象
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        // 设置数据源
        factoryBean.setDataSource(masterDataSource);
        // 设置 mapper 映射文件路径
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        factoryBean.setMapperLocations(resolver.getResources("classpath:mappers/master/**/*.xml"));
        // 设置 VFS
        factoryBean.setVfs(SpringBootVFS.class);
        // 返回 SqlSessionFactory 对象
        return factoryBean.getObject();
    }
 
    // 创建 SqlSessionTemplate 对象
    @Bean("masterSqlSessionTemplate")
    public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory masterSqlSessionFactory) {
        // 创建 SqlSessionTemplate 对象
        return new SqlSessionTemplate(masterSqlSessionFactory);
    }
 
}

(2)创建Slave配置类

在工程中,创建一个【SlaveDataSourceConfig】配置类,代码如下所示:

package com.spring.boot.demo.config;
 
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 
import javax.sql.DataSource;
 
/**
 * @author Js
 * @version 1.0.0
 * @Date: 2023/09/06 19:30:45
 * @Description
 */
@MapperScan(
        basePackages = "com.spring.boot.demo.slave.mapper",
        sqlSessionFactoryRef = "slaveSqlSessionFactory",
        sqlSessionTemplateRef = "slaveSqlSessionTemplate"
)
@Configuration
public class SlaveDataSourceConfig {
 
    // 注入数据源
    @Bean("slaveDataSource")
    // 指定 slave 数据源的配置信息前缀
    @ConfigurationProperties(prefix = "spring.datasource.slave")
    public DataSource slaveDataSource() {
        // 手动创建 Druid 数据源对象
        return DruidDataSourceBuilder.create().build();
    }
 
    // 创建 SqlSessionFactory 对象
    @Bean("slaveSqlSessionFactory")
    public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource slaveDataSource) throws Exception {
        // 创建 SqlSessionFactoryBean 对象
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        // 设置数据源
        factoryBean.setDataSource(slaveDataSource);
        // 设置 mapper 映射文件路径
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        factoryBean.setMapperLocations(resolver.getResources("classpath:mappers/slave/**/*.xml"));
        // 设置 VFS
        factoryBean.setVfs(SpringBootVFS.class);
        // 返回 SqlSessionFactory 对象
        return factoryBean.getObject();
    }
 
    // 创建 SqlSessionTemplate 对象
    @Bean("slaveSqlSessionTemplate")
    public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory slaveSqlSessionFactory) {
        // 创建 SqlSessionTemplate 对象
        return new SqlSessionTemplate(slaveSqlSessionFactory);
    }
 
}

2.2、添加数据源配置信息

在【application.yml】中添加master、slave两个数据源的配置信息,如下:

# 配置数据源
spring:
  datasource:
    # master 数据源信息
    master:
      driver-class-name: com.mysql.cj.jdbc.Driver # 数据库驱动
      url: jdbc:mysql://localhost:3306/sp-demo01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8 # 数据库地址
      username: root
      password: root
    # slave 数据源信息
    slave:
      driver-class-name: com.mysql.cj.jdbc.Driver # 数据库驱动
      url: jdbc:mysql://localhost:3306/sp-demo02?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8 # 数据库地址
      username: root
      password: root

2.3、创建Mapper接口

(1)创建Master的mapper接口

在【com.spring.boot.demo.master.mapper】包下面,创建【EmpMapper】类。

package com.spring.boot.demo.master.mapper;
 
import com.spring.boot.demo.pojo.EmpBo;
 
import java.util.List;
 
public interface EmpMapper {
    /**
     * 查询所有员工
     */
    List<EmpBo> queryAll();
}

(2)创建Slave的mapper接口

在【com.spring.boot.demo.slave.mapper】包下面,创建【DeptMapper】类。

package com.spring.boot.demo.slave.mapper;
 
import com.spring.boot.demo.pojo.DeptBo;
import org.apache.ibatis.annotations.Param;
 
public interface DeptMapper {
    /**
     * 根据 ID 查询部门
     * @param deptId
     * @return
     */
    DeptBo getDeptById(@Param("deptId") Integer deptId);
}

2.4、创建XML映射文件

(1)创建Master的XML映射文件

在【mappers/master】目录下面,新建【EmpMapper.xml】映射文件。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.spring.boot.demo.master.mapper.EmpMapper">
    <select id="queryAll" resultType="com.spring.boot.demo.pojo.EmpBo">
        select
            emp_id as empId,
            emp_name as empName,
            age,
            dept_id as deptId
        from t_emp
    </select>
</mapper>

(2)创建Slave的XML映射文件

在【mappers/slave】目录下面,新建【DeptMapper.xml】映射文件。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.spring.boot.demo.slave.mapper.DeptMapper">
    <select id="getDeptById" resultType="com.spring.boot.demo.pojo.DeptBo" parameterType="java.lang.Integer">
        select
            dept_id as deptId,
            dept_name as deptName
        from t_dept
        where dept_id = #{deptId}
    </select>
</mapper>

2.5、编写测试类

package com.spring.boot.demo.controller;
 
import com.spring.boot.demo.master.mapper.EmpMapper;
import com.spring.boot.demo.pojo.DeptBo;
import com.spring.boot.demo.pojo.EmpBo;
import com.spring.boot.demo.slave.mapper.DeptMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.List;
 
/**
* @author Js
 * @version 1.0.0
 * @Date: 2023/09/06 20:30:10
 * @Description
 */
@RestController
@RequestMapping("/api")
public class TestController {
 
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private DeptMapper deptMapper;
 
    @GetMapping("/demo")
    public String demo() {
        // 查询所有员工信息
        List<EmpBo> empBoList = empMapper.queryAll();
        System.out.println(empBoList);
        // 查询每一个员工的部门信息
        for (EmpBo empBo : empBoList) {
            DeptBo deptBo = deptMapper.getDeptById(empBo.getDeptId());
            System.out.println(deptBo);
        }
        return "测试成功";
    }
 
}

2.6、运行测试

经过上面几个步骤之后,最终的工程目录结果应该是下面这样子的,如下图:

在这里插入图片描述

启动工程,浏览器访问【http://localhost:8080/api/demo】,查看控制台输出结果。

在这里插入图片描述

到此,SpringBoot结合MyBatis框架实现多数据源配置就成功啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/996235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Alibaba(获得店铺的所有商品) API接口

为了进行电商平台 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个alibaba应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载alibaba API的SDK并掌握基本的API基础知识和调用 4&#xff09;利…

持安-大连万达集团零信任项目入选中国信通院2023零信任优秀案例

2023年8月25日&#xff0c;以“链接云端&#xff0c;可信而安”为主题的“2023首届SecGo云和软件安全大会”在京隆重召开。会上&#xff0c;中国信息通信研究院重磅揭晓了“安全守卫者计划”优秀案例评选结果。 零信任办公安全技术创新企业持安科技&#xff0c;与用户大连万达…

SpringBoot整合MQTT(MqttClient)

一、SpringBoot整合MQTT 创建项目&#xff0c;引入 MQTT依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version></dep…

java读取jar包中的程序版本号

java程序打包后的jar如下图所示&#xff1a; 可以看到META-INF目录下的三处均可以读取到程序的版本号&#xff1a; MANIFEST.MFbuild-info.propertiesmaven/xxx/xx/pom.properties 或 pom.xml 一、MANIFEST.MF 程序版本号字段 即 Implementation-Version Manifest-Version:…

【Java】之继承

Java中使用extends关键字&#xff0c;让我们在类和类之间建立联系。 使用继承的好处&#xff1a; 可以将多个类中重复的代码&#xff0c;抽象至父类中供子类使用。 子类可以在父类上的基础上继续增强&#xff0c;使子类可以有自己独特的性质和功能。 特点&#xff1a; 在J…

LASSO回归

LASSO回归 LASSO(Least Absolute Shrinkage and Selection Operator&#xff0c;最小绝对值收敛和选择算子算法)是一种回归分析技术&#xff0c;用于变量选择和正则化。它由Robert Tibshirani于1996年提出&#xff0c;作为传统最小二乘回归方法的替代品。 损失函数 1.线性回…

Alibaba(按关键字搜索商品) API接口

为了进行电商平台 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个alibaba应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载alibaba API的SDK并掌握基本的API基础知识和调用 4&#xff09;利…

Java从入门到精通-类和对象(一)

0. 类和对象 1. 面向对象概述 Java面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种强大的编程范式&#xff0c;它基于对象、类、封装、继承和多态等核心概念。这种编程范式使得代码更加模块化、可维护、可重用和可扩展。 1.1 对象和类…

线性代数的学习和整理20,关于向量/矩阵和正交相关,相似矩阵等(草稿)

目录 1 什么是正交 1.1 正交相关名词 1.2 正交的定义 1.3 正交向量 1.4 正交基 1.5 正交矩阵的特点 1.6 正交矩阵的用处 1 什么是正交 1.1 正交相关名词 orthogonal set 正交向量组正交变换orthogonal matrix 正交矩阵orthogonal basis 正交基orthogonal decompositio…

Kafka源码分析之网络通信

1、生产者网络设计 架构设计图 2、生产者消息缓存机制 1、RecordAccumulator 将消息缓存到RecordAccumulator收集器中, 最后判断是否要发送。这个加入消息收集器&#xff0c;首先得从 Deque 里找到自己的目标分区&#xff0c;如果没有就新建一个批量消息 Deque 加进入 2、消…

BUUCTF reverse1 1

使用die发现是64位程序 我们先运行一下 这里说错误的flag 使用IDA64位程序打开 shift F12 打开字符串窗口 查找 wrong flag 双击这个字符串 双击 sub_1400118C0C8↑o 这里跳跃到了汇编窗口&#xff0c; F5 反汇编 sub_1400111D1("input the flag:");sub_14001…

2024浙大MBA提面优秀经历分享:小微创客的小确幸

今年5月份我参加了浙大MBA创客班的提前批面试&#xff0c;目前浙大杭州这边还剩下最后一个批次也就是在10月份。最近身边也有很多朋友都在问关于提面的情况&#xff0c;趁今天比较空&#xff0c;我想借此机会与大家分享一下我的经验&#xff0c;希望对后续参加浙大MBA提前面试的…

重庆成都游记

大家好&#xff0c;我是煎鱼。 上周找了个时间去了重庆成都&#xff0c;现在马上国庆了&#xff0c;做个记录也分享给大家参考一下。 总体来讲&#xff0c;还是很好吃的。有些地标也是有一定的打卡、体验价值。 重庆-李子坝处拍 重庆 重庆的景点比较集中&#xff0c;都在那一圈…

【图像识别】图像特征、特征检测、特征提取

目录 1. 图像特征 2. 特征检测与特征提取 2.1 特征检测算法 2.2.1Moravec 2.1.2 Harris 2.1.3 FAST 2.1.4 SIFT 2.1.5 SURF 2.1.6 BRIRF 2.1.7 ORB 2.2 特征提取算法 2.2.1 HOG 2.2.2 Harr 2.2.3 SIFT 2.2.4 LBP 2.2.5 Gabor 2.3 边缘检测算法 3 算法对比 1. …

安卓多渠道打包(五)360加固walle多渠道打包

背景&#xff1a; 1、360加固宝&#xff0c;签名收費了&#xff0c;脚本上传加固也针对特定帐号才可实现。 内容 本文将会分享安卓项目中&#xff0c;使用360加固&#xff0c;再用walle签名&#xff0c;产出多渠道加固包的全流程。 环境 win10 jdk11 as2022 gradle7.5 最…

vue3+emelenui实现前端分页功能—最简单

在一些后台管理系统或者博客管理系统中分页功能是很常见的一种服务&#xff0c;因为总不可能把很多数据放在一块&#xff0c;那样阅读起来很麻烦&#xff0c;所以需要分页。也是前后端中最为常见的一个功能 先看一下分页场景的模拟。 首先我们要去后端写点数据通过接口给前端&a…

ssm实现折线统计图

​ 方法1&#xff1a;单张数据表中的数据图表生成 图表统计&#xff0c;查看部门人数统计这里实现的时单张表中的数据实现部门人数折线统计图展示。 <script type"text/javascript">// 利用AjAx来获取后台传入的数据&#xff08;Responsebody注解传入的&…

日志平台搭建第五章:Linux安装Kafka

相关链接 http://kafka.apache.org/downloads 1.使用Docker安装zookeeper 下载镜像&#xff1a; docker pull zookeeper:3.4.14 创建容器&#xff1a; docker run --name zookeeper \ -v /opt/data/zksingle:/data \ -p 2181:2181 \ -e ZOO_LOG4J_PROP"INFO,ROLLINGFILE&q…

日志平台搭建第六章:logstash通过kafka通道采集日志信息

1.修改文件/opt/app/elk/logstash-7.5.1/config.d/config1.conf&#xff0c;在input下添加kafka采集配置 #192.168.128.130:9103:kafka地址 #topics:主题 kafka {bootstrap_servers > ["192.168.128.130:9103"]group_id > "logstash"topics > [&…