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

这篇具有很好参考价值的文章主要介绍了SpringBoot结合MyBatis实现多数据源配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、前提条件

1.1、环境准备

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

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

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

具体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对象即可。

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

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

  • 第一个对象:创建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、运行测试

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

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

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

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

到此,SpringBoot结合MyBatis框架实现多数据源配置就成功啦。文章来源地址https://www.toymoban.com/news/detail-705631.html

到了这里,关于SpringBoot结合MyBatis实现多数据源配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis整合Springboot多数据源实现

    数据源,实际就是数据库连接池,负责管理数据库连接,在 Springboot 中,数据源通常以一个 bean 的形式存在于 IOC 容器中,也就是我们可以通过依赖注入的方式拿到数据源,然后再从数据源中获取数据库连接。 那么什么是多数据源呢,其实就是 IOC 容器中有多个数据源的 bea

    2023年04月22日
    浏览(47)
  • grpc + springboot + mybatis-plus 动态配置数据源

    前言 这是我在这个网站整理的笔记,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 1.1 项目初始化 项目初始化的时候会调用com.baomidou.dynamic.datasource.DynamicRoutingDataSource对象的addDataSource方法添加数据源,数据源存进dataSourceMap中。 1.2 接口请求时候 进行数据操作时,

    2024年02月09日
    浏览(32)
  • SpringBoot整合Mybatis-Plus、Druid配置多数据源

    目录 1.初始化项目 1.1.初始化工程 1.2.添加依赖 1.3.配置yml文件 1.4.Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹 1.5.配置使用数据源 1.5.1.注解方式 1.5.2.基于AOP手动实现多数据源原生的方式 2.结果展示 Mybatis-Plus:简介 | MyBatis-Plus (baomidou.com) 在正式开始之前,先初始

    2024年02月11日
    浏览(35)
  • 利用 Mybatis-Plus 的动态数据源实现多数据源配置

    目录 一、导入依赖 二、Application.yaml配置文件 三、切换数据源 四、其他方法 4.1 配置多个数据源 4.2 定义Datasource和EntityManager 4.3 在需要使用数据源的地方注入不同的EntityManager 官网:https://baomidou.com/pages/a61e1b/#dynamic-datasource 默认是使用配置文件中master参数设置的数据库。

    2024年02月13日
    浏览(31)
  • springboot+mybatis实现mysql和oracle多数据源

    在实际项目中很多时候会涉及到多个数据库的访问,或者数据库读写分离的形式。 下面通过使用 Aspect+注解来实现mysql+oracle的多数据源配置(注意:事务一致性未提供) 首先要去oracle官网下载ojdbc的jar包,根据oracle的版本去下载,或者在下载的oracle的jdbc包下的lib里面有,然后

    2024年02月07日
    浏览(44)
  • springBoot-Mybatis-Plus 多数据源切换实现

    前言:本文主要通过AbstractRoutingDataSource,实现根据 http 访问携带的标识动态切换数据源; 1 AbstractRoutingDataSource 介绍: AbstractRoutingDataSource 是 Spring 框架中的一个抽象类,它可以用来实现动态数据源切换。在多数据源场景下,AbstractRoutingDataSource 可以根据不同的请求来动态地选

    2024年02月03日
    浏览(38)
  • Dynamic DataSource 多数据源配置【 Springboot + DataSource + MyBatis Plus + Druid】

    MybatisPlus多数据源配置主要解决的是多数据库连接和切换的问题。在一些大型应用中,由于数据量的增长或者业务模块的增多,可能需要访问多个数据库。这时,就需要配置多个数据源。 2.1.1、引用依赖 2.1.2、application.yml 配置 2.1.3、通用配置类 2.1.4、使用方式 这里便不过多的

    2024年02月03日
    浏览(35)
  • java_Springboot_Mybatis-Plus_自定义多数据源MybatisSqlSessionFactoryBean配置

    需要在服务中集成表结构维护的功能,维护表结构就需要使用具有执行DDL脚本权限的账号。 为了保证系统的安全性,考虑在工程中配置多个数据源引入不同权限账号,高权限账号只在特定逻辑中使用,其它默认业务使用低权限账号。 加入新的数据源不能影响已有的功能,保

    2024年01月16日
    浏览(36)
  • SpringBoot整合Mybatis-Plus+Druid实现多数据源

    🌺本文主要讲解 springboot +mybatisplus + druid 实现多数据源配置功能 🌺 主页传送门:📀 传送 Spring Boot:    Spring Boot是一个基于Spring框架的开源Java开发框架,旨在简化Spring应用程序的开发、配置和部署。它提供了一种快速、敏捷的方式来构建独立的、生产级别的Spring应用程

    2024年02月09日
    浏览(91)
  • springboot实现多数据源配置(Druid/Hikari)

    使用springboot+mybatis-plus+(Druid/Hikari)实现多数据源配置 操作步骤: 引入相应的maven坐标 编写mybatis配置,集成mybatis或mybatis-plus(如果已集成可跳过) 编写数据源配置类 编写注解,并通过aop进行增强(编写数据源切换代码) 类或方法中使用注解,对数据源进行切换 第一步:

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包