springboot整合mybatisplus使用多数据源

news2024/12/22 19:49:18

本篇文章主要讲解的是使用多数据源,至于springboot与mybatisplus的整合这里只做简单介绍

springboot整合mybatisplus(非本文重点)

在pom文件中引入如下的依赖

 <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
           
        </dependency>

就这么简单了,哈哈,其他的就不多说了哈,至于整合后mapper文件放在哪里就不用我多说了吧。

如何使用多数据源(重点)

①引入依赖

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.16</version>
        </dependency>
<!--        导入多数据源依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.6.1</version>
        </dependency>

②配置yml

server:
#  设置项目的端口号
  port: 8888
#  servlet:
#    context-path: /demo

spring:
  mvc:
    pathmatch:
#      加这个的原因是为了更好的使用swagger
      matching-strategy: ant_path_matcher

  jackson:
    date-format: yyyy-MM-dd
    time-zone: GMT+8
  datasource:
    dynamic:
      primary: master
      strict: false
      datasource:
        master:
          username: root
          password: 1230
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
        slave1:
          username: root
          password: 1230
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/basic-project?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
    type: com.alibaba.druid.pool.DruidDataSource


mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl


 

 

③如何从主从数据库获取我们要的东西呢

我们的主数据库有个user表

 

从数据库中有个student表

 

④定义各自的实体类

package com.summer.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @date 2023-05-31 07:39
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    @TableId(type =IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private String email;
    private String gender;

}

 

package com.summer.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**

 * @date 2023-06-03 22:38
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    @TableId(type = IdType.ASSIGN_ID)
    private String id;
    private String name;
}

⑤定义各自的mapper接口

package com.summer.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.summer.domain.User;

/**

 * @date 2023-05-31 07:39
 */
//@Repository
public interface UserMapper extends BaseMapper<User> {
}
package com.summer.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.summer.domain.Student;

/**

 * @date 2023-06-03 22:39
 */
public interface StudentMapper extends BaseMapper<Student> {
}

⑥定义各自的Service以及实现类

package com.summer.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.summer.domain.Student;

/**
 * @date 2023-06-03 22:40
 */
public interface StudentService extends IService<Student> {
}



package com.summer.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.summer.domain.Student;
import com.summer.mapper.StudentMapper;
import org.springframework.stereotype.Service;

/**
 * @date 2023-06-03 22:40
 */
@Service
public class StudentServiceImpl extends  ServiceImpl<StudentMapper, Student> implements StudentService {
}
package com.summer.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.summer.domain.User;

import java.util.List;

/**

 * @date 2023-05-31 08:25
 */
public interface UserService extends IService<User> {



}

package com.summer.service;


import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.summer.domain.User;
import com.summer.mapper.UserMapper;
import org.springframework.stereotype.Service;

/**

 * @date 2023-05-31 08:26
 */
@Service
public class UserServiceImpl extends  ServiceImpl<UserMapper, User>   implements UserService  {




}

⑦开始编写

我们上面讲过,user表是在我们的主数据库master里,student是在我们从数据库slave1里,那么我们在开发的时候如何区分他们呢?

这就需要我们使用一个注解@DS 来进行区分,我们在各自的Service类上添加注解

 

 ⑧测试

我写了一个接口来进行测试

@RestController
@RequestMapping("/adminApi/dynamic")
@RequiredArgsConstructor
public class DemoController {

    private final UserService userService;
    private final StudentService studentService;

    @GetMapping("/hello")
    public String hello(){
        List<User> list =
                userService.list();
        System.out.println("user:"+list.size());
        List<Student> list1 = studentService.list();
        System.out.println("student:"+list1.size());
        return "success";
    }

如果我们主表和从表中的表的名字一样,比如都将user怎么办?

我们的DS注解现在是写在我们的Service类上的,这个注解可以写在我们指定的方法上,如果是写在类上的话比如

@DS("slave1") 那么这个类中的所有方法的操作都是从slave1对应的表中取得

如果写在方法上,那么这个方法对应的操作就是从slave1中取。

 

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

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

相关文章

RabbitMQ的基本概念

目录 1、MQ 的基本概念 1.1 MQ概述 1.2 MQ 的优势和劣势 1.3 MQ 的优势 1. 应用解耦 2. 异步提速 3. 削峰填谷 小结: 1.4 MQ 的劣势 1.5 常见的 MQ 产品 1.6 RabbitMQ 简介 1.7 JMS 1、MQ 的基本概念 1.1 MQ概述 MQ全称 Message Queue&#xff08;消息队列&#…

深入理解vue插槽

我们都知道vue的插槽及使用&#xff0c;一下是探究他的背后&#xff0c;不对的地方欢迎指正 父组件中我们在子组件中嵌套插槽&#xff0c;在子组件中我们使用template模板写下对应的插槽 实际上父组件中经过编译传递给子组件的插槽是函数 此图为下面示例中子组件中的输出 d…

VSCode--Config

1. basic 1.1 调整字体 1.2 调整 remote login 输入框都在 TERMINAL 中实现 1.3 界面设置成中文 安装插件&#xff1a; 然后配置即可。 2.Linux 2.1 Install 2.1.1 offline Install vscode server 问题描述 内网开发&#xff0c;vscode 自身通过代理安装完 remote 插件后…

【算法系列之二叉树IV】leetcode450.删除二叉搜索树中的节点

701.二叉搜索树中的插入操作 力扣题目链接 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注…

shell之免交互

一.免交互&#xff08;Here Document&#xff09;介绍 使用I/O重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如 ftp、cat 或 read 命令。是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息&#xff0c;而是直接就地生产出一个“文件”…

chatgpt赋能python:Python在主程序中进行函数调用

Python在主程序中进行函数调用 介绍 Python是一种广泛使用的高级编程语言&#xff0c;它在创建Web应用程序、网络服务器、数据分析、机器学习等多个领域中表现出色。在Python中&#xff0c;函数是编程中最重要的概念之一&#xff0c;函数调用是指程序员在主程序中调用一个或多…

系统移植-uboot

目录 一、安装系统 1.移植的目的 2.系统移植过程 Windows装机 Linux系统移植 3.开发板启动过程 二、Uboot概述 1.Bootloader简介 Bootloader基本功能 uboot工作方式 三、SD卡存储结构 一、安装系统 在基于ARM处理器的开发板上安装Linux系统 1.移植的目的 不…

docker版jxTMS使用指南:python服务之设备策略

本文讲解4.0版的jxTMS中python服务的设备策略&#xff0c;整个系列的文章请查看&#xff1a;docker版jxTMS使用指南&#xff1a;4.0版升级内容 docker版本的使用&#xff0c;请参考&#xff1a;docker版jxTMS使用指南 jxTMS实现的接口机对设备的数据采集与处理采取的是框架组…

Elastic Stack 和 Docker-Compose 入门

作者&#xff1a;Eddie Mitchell 随着 Elastic Stack 多年来的发展和功能集的增加&#xff0c;在本地开始或尝试概念验证 (POC) 的复杂性也越来越高。 虽然 Elastic Cloud 仍然是开始使用 Elastic 最快、最简单的方式&#xff0c;但对本地开发和测试的需求仍然非常丰富。 作为开…

【生成任务下推生成子工序生产计划,无法结单】

今天&#xff0c;车间反馈了一个问题&#xff0c;bpm结单报错。 原先定的流程是&#xff0c;生产任务单审批流程走完之后&#xff0c;下推到MES&#xff0c;生产子工序生产计划。 这个审批流最后要到制品&#xff0c;这个工单做完了&#xff0c;制品也包装好了&#xff0c;流程…

用于改进筛查的乳腺癌异常检测

介绍 乳腺癌是一种严重的疾病&#xff0c;影响着全世界数以百万计的妇女。即使医学领域有了进步&#xff0c;对乳腺癌进行识别和治疗是可能的&#xff0c;但发现它并在早期阶段治疗它仍然是不可能的。 通过使用异常检测技术&#xff0c;我们可以识别出乳腺癌中肉眼可能看不到的…

STM32——关于EXTI讲解及标准库应用(基础篇)

简介&#xff1a; STM32的中断包括EXTI外部中断、TIM定时器、ADC模数转换器、USART串口&#xff0c;SPI通信、I2C通信等一系列的外设。这篇主要来讲解关于EXTI外部中断的概念和应用。EXTI&#xff08;External Interrupt&#xff09;是一个非常重要的外部中断模块&#xff0c;…

chatgpt赋能python:Python多条图形绘制在一张图里的实现方法及应用

Python多条图形绘制在一张图里的实现方法及应用 作为一款优秀的编程语言&#xff0c;Python在数据可视化方面有着非常出色的表现。然而有时候我们需要在一张图里绘制多条不同的图形&#xff0c;这时候Python又有什么好的解决方案呢&#xff1f;本文将介绍多种方法实现Python在…

10个最流行的可生成图像嵌入向量的预训练AI模型

迁移学习的出现进一步加速了计算机视觉——图像分类用例的快速发展。 在大型图像数据集上训练计算机视觉神经网络模型需要大量的计算资源和时间。 幸运的是&#xff0c;通过使用预训练模型可以缩短时间和资源。 利用预训练模型的特征表示的技术称为迁移学习。 预训练通常使用高…

《MySQL(三):基础篇- 函数》

文章目录 3. 函数3.1 字符串函数3.2 数值函数3.3 日期函数3.4 流程函数 3. 函数 函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#xff0c;这一段程序或代码在MySQL中 已经给我们提供了&#xff0c;我们要做的就是在合适的业务场景调用对应的函数完成对应…

Vue.js 中的响应式原理是什么?

Vue.js 中的响应式原理是什么&#xff1f; Vue.js 是一种流行的前端框架&#xff0c;它使用了一种称为“响应式”的技术来实现数据绑定。这意味着当数据发生变化时&#xff0c;Vue.js会自动更新相关的视图&#xff0c;而无需手动操作DOM。在本文中&#xff0c;我们将深入探讨V…

【SCI征稿】Elsevier旗下中科院2区TOP, 仅1周见刊, 6月11日截稿 (文末有好)~

一、【期刊简介】 中科院2区智能计算类SCI (TOP/6.11截稿) 【期刊概况】IF:8.0-9.0, JCR1区, 中科院2区&#xff1b; 【终审周期】走期刊部系统&#xff0c;3-5个月左右录用&#xff1b; 【检索情况】SCI&EI双检&#xff1b;正刊&#xff1b; 【数据库收录年份】2001年…

RHCE练习题目【更新至】

文章目录 第一题、安装和配置ansible第二题、创建和运行ansible临时命令第三题、使用剧本安装软件包第四题、使用RHEL系统脚色第一问、配置时间同步第二问、配置selinux 第五题、使用Ansible Galaxy安装角色第六题、创建和使用角色第七题、从Ansible Galaxy使用角色第八题、创建…

一文搞定国民N32G435高负载串口通信

副标题&#xff1a;USRAT无硬件双缓冲条件下的软件双缓冲 一、前言 在单片机中&#xff0c;USART的通信一般都是最常用也最先去接触的串口外设&#xff0c;在一般的小数据量应用中一般不需要考虑USART串口&#xff08;以下简称为串口&#xff09;的高负载能力&#xff0c;比如…

第六十五天学习记录:高等数学:函数与极限(宋浩板书)

C语言学习后&#xff0c;曾为先学C还是数据结构纠结了半天。在看数据结构前言的时候&#xff0c;发现学习数据结构之前还需要一定的数学基础。虽然涉及到的数学基础不多&#xff0c;但想到以前大学高数&#xff0c;现代不是60分万岁就是不到80分&#xff0c;好像就概率论稍微了…