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

2023-11-09

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框架实现多数据源配置就成功啦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot结合MyBatis实现多数据源配置 的相关文章

随机推荐

  • Pytorch实战——气温预测(基础)附完整代码

    一 数据集 http 链接 https pan baidu com s 1mVAIWZquUyaCpgj1K51o5A 提取码 abcd 该数据集记录了一年内的气温信息 我们将针对于此进行分析 以上是部分数据情况 请查看 二 气温预测实战
  • 【Nginx】Nginx发布社区最新稳定版1.22.1版本

    Nginx官方于2022年10月19日发布了1 22稳定版的第一个分支版本 1 22 1 根据官方对于此版本的修改说明 可以发现该版本修复了一个安全漏洞 风险等级 中等 在使用ngx http mp4 module模块来处理一个特别构造的m
  • 在Java中使用HttpURLConnection发送http客户端请求、服务器端返回信息、接受服务器端的信息

    在最近的项目中要用到后台发送http请求 post 方式 获取服务器端返回哦信息 下面是自己做的一个简单的演示示例 首先创建一个web工程 简单的一个web工程就好 里面创建两个jsp和一个servlet 其中jsp作为客户端 而servl
  • Ubuntu个人终端常用命令

    Ubuntu终端提供了丰富的命令行工具和功能 现将一些基本的Ubuntu终端命令记录下来 方便查看 1 文件和目录管理命令 ls 列出当前目录下的文件和文件夹 cd 切换到指定目录 pwd 显示当前工作目录的路径 mkdir 创建新目录 r
  • Android Studio安装和使用教程(全文图解)

    目录 JDK安装与配置 一 下载JDK 二 JDK安装 三 JDK的环境配置 四 JDK的配置验证 Android studio安装 Android studio连接手机真机调试 以华为鸿蒙为例 一 新建一个android项目 二 进入项目
  • LeetCode刷题笔记:669.修剪二叉搜索树

    1 问题描述 给你二叉搜索树的根节点 root 同时给定最小边界low 和最大边界 high 通过修剪二叉搜索树 使得所有节点的值在 low high 中 修剪树 不应该 改变保留在树中的元素的相对结构 即 如果没有被移除 原有的父代子代关
  • Chrome浏览器的跨域设置

    做前后端分离的开发的时候 出于一些原因往往需要将浏览器设置成支持跨域的模式 而且chrome浏览器支持可跨域的设置 但是新版本的chrome浏览器提高了跨域设置的门槛 原来的方法不再适用了 其实网上也有很多大神总结的chrome跨域设置教程
  • 去耦电容的选择举例

    在高速时钟电路中 尤其要注意元件的RF去耦问题 究其原因 主要是因为元件会把一部分能量耦合到电源 地系统之中 这些能量以共模或差模RF的形式传播到其他部件中 陶瓷片电容需要比时钟电路要求的自激频率更大的频率 这样可选择一个自激频率在10 3
  • JavaWeb酒店管理系统

    酒店管理系统 一 项目介绍 1 项目用到的技术栈 开发工具 idea 语言 java js html ajax 数据库 MySQL 服务器 Tomcat 框架 mybatis jQuery 2 项目实现功能 管理员和用户登录和退出功能以及用
  • ParameterizedType应用,java反射,获取参数化类型的class实例

    ParameterizedType是一个接口 这个类可以用来检验泛型是否被参数化 比如 class Dao
  • python https RecursionError详解

    RecursionError maximum recursion depth exceeded while calling a Python object File root miniconda3 envs devops lib pytho
  • Ubuntu下安装Pytorch

    安装CPU版本 https www cnblogs com wangqinze p 13407610 html 完成后检验是否有误 python import torch import torchvision 若没有报错则完成 安装GPU版
  • CMake I 设置语言标准

    目录 一
  • docker基础篇-docker的安装、配置、卸载,自定义镜像和搭建公有和私有镜像仓库

    本篇主要是docker的安装 配置 卸载 自定义镜像和搭建公有和私有镜像仓库 以及常规软件安装示例 mysql主从 redis主从搭建 Dockerfile解析及docker compose编排等见另一篇文章 docker高级篇 mysql
  • python之正则表达式:匹配ip地址

    首先分析ip地址的特征 255 255 255 255 1位 0 9 0 9 d 2位 10 99 1 9 d 2位以内 1 9 d 3位 100 199 1 d 2 3位 200 249 2 0 4 d 3位 250 255 25 0 5
  • 如何让opencv成为MATLAB中的一个工具箱

    如何让opencv成为MATLAB中的一个工具箱 前言 谈到图像处理的编程工具 MATLAB和opencv是最经常提到的 两者各有优缺点 比如 MATLAB的数据可视化做得很好 而且还有其它可以方便调用的工具箱 但是在图像的处理上面 不如o
  • IDEA快速生成方法

    快捷键 Alt Insert 按下快捷键之后会弹出如下界面 依次是Constructor方法 Getter方法 Setter方法 Getter 和Setter方法 equa 和 hashCode 方法 toString方法 Override
  • 三大通信协议(3)SPI——寄存器配置

    目录 一 SPI通信协议简介 二 SPI通信时序 1 主从通信 2 模式选择 三 实例 总结 一 SPI通信协议简介 SPI是串行外设接口 Serial Peripheral Interface 的缩写 是 Motorola 公司推出的一种
  • windows下expect使用小结

    最近因为学习tcl脚本语言 需要用到expect扩展包 结合网上的资料和自己的学习情况做一下整理 expect是一种基于TCL的解释型脚本语言 能够实现自动和交互式任务进行通信 而无需人的干预 expect由一系列expect send对组
  • SpringBoot结合MyBatis实现多数据源配置

    SpringBoot结合MyBatis实现多数据源配置 一 前提条件 1 1 环境准备 SpringBoot框架实现多数据源操作 首先需要搭建Mybatis的运行环境 由于是多数据源 也就是要有多个数据库 所以 我们创建两个测试数据库 分别