springboot和nacos整合mybatis-plus实现多数据源管理

news2025/2/25 17:42:38

文章目录

  • 1.依赖
  • 2.配置文件
  • 3.redis测试
    • 3.1redis配置文件
    • 3.2controller
    • 3.3测试
  • 4.mysql测试
    • 4.1数据库表和结构
    • 4.2实体类和枚举
    • 4.3DogMapper.xml
    • 4.4DogMapper
    • 4.5service和serviceImpl
    • 4.6controller
    • 4.7测试

写了一个小demo,通过mybatis-plus实现多数据源管理
使用了mysql和redis两类数据库。
Mybatis-Plus官网
Mybatis-Plus的多数据源Dynamic-Datasource

1.依赖

springboot版本 2.3.12.RELEASE
springcloud版本 2.2.8.RELEASE
nacos版本 2.1.0
nacos安装部署教程
springboot整合nacos

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>2.3.3</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>2.3.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-autoconfigure</artifactId>
            <version>2.2.2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
    </dependencies>

2.配置文件

项目中的 bootstrap.yaml文件

spring:
  application:
    name: springboot-muldata
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: config
        file-extension: yaml
        group: DEFAULT_GROUP
      discovery:
        server-addr: 127.0.0.1:8848
    bootstrap:
      enabled: true

nacos中的配置文件
填写自己的数据库,用户名,密码

server:
    port: 8503

spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false 
      datasource:
        master: 
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/blog-demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
          username: root
          password: mysql
        mysql_2:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/study?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
          username: root
          password: mysql
        redis:
          database: 1
          host: 127.0.0.1
          port: 6379
          username: root
          password:

#打印sql语句
#因为用了mybatis-plus组件,就不用写mybatis
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true  # 开启驼峰命名
  type-aliases-package: com.example.springbootmuldatasources.entity
  mapper-locations: classpath*:mappers/*.xml

3.redis测试

3.1redis配置文件

RedisConfiguration文件

    public GenericObjectPoolConfig poolConfig(){
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        //控制一个pool可分配多少个jedis实例
        poolConfig.setMaxTotal(500);
        //最大空闲数
        poolConfig.setMaxIdle(200);
        //每次释放连接的最大数目,默认是3
        poolConfig.setNumTestsPerEvictionRun(1024);
        //逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
        poolConfig.setTimeBetweenEvictionRunsMillis(30000);
        //连接的最小空闲时间 默认1800000毫秒(30分钟)
        poolConfig.setMinEvictableIdleTimeMillis(-1);
        poolConfig.setSoftMinEvictableIdleTimeMillis(10000);
        //最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
        poolConfig.setMaxWaitMillis(1500);
        poolConfig.setTestOnBorrow(true);
        poolConfig.setTestWhileIdle(true);
        poolConfig.setTestOnReturn(false);
        poolConfig.setJmxEnabled(true);
        poolConfig.setBlockWhenExhausted(false);
        return poolConfig;
    }


    @Bean
    public LettuceConnectionFactory lettuceConnectionFactory() {
        LettucePoolingClientConfiguration lettucePoolingClientConfiguration = LettucePoolingClientConfiguration.builder()
                .poolConfig(poolConfig())
                .build();
        // 单机redis
        RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration();
        redisConfig.setHostName("127.0.0.1");
        redisConfig.setPort(6379);
        redisConfig.setDatabase(0);


        // 哨兵redis
        //RedisSentinelConfiguration redisConfig = new RedisSentinelConfiguration();

        // 集群redis
//        RedisClusterConfiguration redisConfig = new RedisClusterConfiguration();
//        Set<RedisNode> nodeses = new HashSet<>();
//        String[] hostses = nodes.split("-");
//        for (String h : hostses) {
//            h = h.replaceAll("\\s", "").replaceAll("\n", "");
//            if (!"".equals(h)) {
//                String host = h.split(":")[0];
//                int port = Integer.valueOf(h.split(":")[1]);
//                nodeses.add(new RedisNode(host, port));
//            }
//        }
//        redisConfig.setClusterNodes(nodeses);
//        // 跨集群执行命令时要遵循的最大重定向数量
//        redisConfig.setMaxRedirects(3);
//        redisConfig.setPassword(password);

        return new LettuceConnectionFactory(redisConfig, lettucePoolingClientConfiguration);
    }
}

3.2controller

@RestController
@RequestMapping("/redis")
public class RedisTestController {
    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * redis存入String类型数据的测试
     * @return
     */
    @GetMapping("/testString")
    public String RedisTestString(){
//        设置String的key,value
        redisTemplate.opsForValue().set("testString","String");
//        获取redis存储的string类型的value
        String testString = (String) redisTemplate.opsForValue().get("testString");
        return testString;

    }
    /**
     * redis存入hash类型数据的测试
     * @return
     */
    @GetMapping("/testHash")
    public Map<String,String> RedisTestHash(){
        HashMap<String, String> stringStringHashMap = new HashMap<>();

        stringStringHashMap.put("testHash1","HashValue1");
        stringStringHashMap.put("testHash2","HashValue2");
        stringStringHashMap.put("testHash3","HashValue3");
        stringStringHashMap.put("testHash4","HashValue4");
        //单个存入
        redisTemplate.opsForHash().put("testHash","testHash0","HashValue0");
        // 设置redis的hash的key,value
        redisTemplate.opsForHash().putAll("testHash",stringStringHashMap);
        // //获得redis存储的Hash
        System.out.println("输出redis存储的Hash");

        Object o = redisTemplate.opsForHash().get("testHash", "testHash0");
        System.out.println(o);
        Map result = redisTemplate.opsForHash().entries("testHash");
        System.out.println(result);
        return result;
    }

    /**
     * redis存入list类型数据的测试
     * @return String
     */
    @GetMapping("/testList")
    public String RedisTestList(){
        ArrayList<String> stringList = new ArrayList<>();
        stringList.add("list1");
        stringList.add("list2");
        stringList.add("list3");
        // 设置redis的list的key,value,使用json的形式
        String key = "testList1";
        redisTemplate.opsForValue().set(key,stringList.toString());
        //输出redis存储的list
        System.out.println("输出redis存储的testList1");
        String result = (String) redisTemplate.opsForValue().get(key);
        System.out.println(result);
        ArrayList<String> stringList2 = new ArrayList<>();
        stringList2.add("list4");
        stringList2.add("list5");
        stringList2.add("list6");
        String key2 = "testList2";
        redisTemplate.opsForList().rightPush(key2,stringList2);
        //去除list的数据
        Object result2 = redisTemplate.opsForList().rightPop(key2);
        //取出后数据内就没有了,redis里面就不会有数据所以重新存入
        redisTemplate.opsForList().rightPush(key2,stringList2);
        System.out.println("输出redis存储的testList2");
        System.out.println(result2);
        return result+result2;

    }

    /**
     * redis存入Set类型数据的测试
     * @return
     */
    @GetMapping("/testSet")
    public String  RedisTestSet(){
        String key = "testSet";
        Long add = redisTemplate.opsForSet().add(key, "set1", "set2", "set3", "set4");
        System.out.println(add);
        Object pop = redisTemplate.opsForSet().pop(key);
        System.out.println(pop);
        String result = pop.toString();
        return result;
    }
}

3.3测试

http://localhost:8503/redis/testHash
在这里插入图片描述

4.mysql测试

4.1数据库表和结构

/*
 Navicat Premium Data Transfer

 Source Server         : hhf-test
 Source Server Type    : MySQL
 Source Server Version : 80019
 Source Host           : localhost:3306
 Source Schema         : blog-demo

 Target Server Type    : MySQL
 Target Server Version : 80019
 File Encoding         : 65001

 Date: 26/01/2023 14:55:53
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for dog
-- ----------------------------
DROP TABLE IF EXISTS `dog`;
CREATE TABLE `dog`  (
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `age` int NULL DEFAULT NULL,
  `gender` enum('MALE','FEMALE') CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT 'MALE',
  PRIMARY KEY (`name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of dog
-- ----------------------------
INSERT INTO `dog` VALUES ('小花', 6, 'MALE');
INSERT INTO `dog` VALUES ('小黄', 10, 'FEMALE');

SET FOREIGN_KEY_CHECKS = 1;

4.2实体类和枚举

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dog {
    private String name;
    private Integer age;
    private Gender gender;
}
public enum Gender {
    MALE,FEMALE
}

4.3DogMapper.xml

<mapper namespace="com.example.springbootmuldatasources.mapper.DogMapper">
    <select id="selectByName" resultType="com.example.springbootmuldatasources.entity.Dog">
        select * from dog where name = #{name}
    </select>
</mapper>

4.4DogMapper

@Mapper
public interface DogMapper {
    //@Select("select * from dog where name = #{name}")
    Dog selectByName(String name);
}

4.5service和serviceImpl

service

@Service
public interface DogService {
    Dog getByName(String name);
}

serviceImpl

@Service
public class DogServiceImpl implements DogService {
    @Autowired
    private DogMapper dogMapper;
    @Override
    public Dog getByName(String name) {
        Dog dog = dogMapper.selectByName(name);
        return dog;
    }
}

4.6controller

@RestController
@RequestMapping("/mysql")
public class MysqlController {
    @Autowired
    private DogService dogService;

    @GetMapping("/getDogName")
    public void getOne(){
        Dog dog = dogService.getByName("小花");
        System.out.println(dog);
    }
}

4.7测试

http://localhost:8503/mysql/getDogName
在这里插入图片描述

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

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

相关文章

【笔记】A simple yet effective baseline for 3d human pose estimation

【论文】https://arxiv.org/abs/1705.03098v2 【pytorch】(本文代码参考)weigq/3d_pose_baseline_pytorch: A simple baseline for 3d human pose estimation in PyTorch. (github.com) 【tensorflow】https://github.com/una-dinosauria/3d-pose-baseline 基本上算作是2d人体…

Python压缩JS文件,PythonWeb程序员必看系列,重点是 slimit

Python 压缩文件系列文章&#xff0c;我们已经完成了 2 篇&#xff0c;具体如下&#xff1a; Python Flask 实现 HTML 文件压缩&#xff0c;9 级压缩 Python 压缩 css 文件&#xff0c;第三方模块推荐 压缩JS学习目录&#x1f6a9; jsmin 库&#x1f3a8; 库的安装&#x1f3a8…

HackTheBox Stocker API滥用,CVE-2020-24815获取用户shell,目录遍历提权

靶机地址&#xff1a; https://app.hackthebox.com/machines/Stocker枚举 使用nmap枚举靶机 nmap -sC -sV 10.10.11.196机子开放了22&#xff0c;80端口&#xff0c;我们本地解析一下这个域名 echo "10.10.11.196 stocker.htb" >> /etc/hosts 去浏览器访问…

操作系统真相还原_第5章第4节:特权级

文章目录特权级TSS简介CPL和DPL入门处理器提供的从低特权级到高特权级的方法门、调用门和RPL序特权级 保护模式下特权级按照权力大小分为0、1、2、3级 0特权级是操作系统内核所在的的特权级 TSS简介 TSS&#xff0c;即Task State Segment&#xff0c;意为任务状态段&#x…

Modbus协议完整版

第一部分&#xff1a;Modbus协议1 引言1.1 范围MODBUS是OSI模型第7层上的应用层报文传输协议&#xff0c;它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。自从1979年出现工业串行链路的事实标准以来&#xff0c;MODBUS使成千上万的自动化设备能够通信。目前&am…

【图卷积网络】03-空域卷积介绍

注&#xff1a;本文为3.1-3.2 空域卷积视频笔记&#xff0c;仅供个人学习使用 1、谱域图卷积 1.1 回顾 上篇博客【图卷积神经网络】02-谱域图卷积介绍讲到了三个经典的谱域图卷积&#xff1a; SCNN用可学习的对角矩阵来代替谱域的卷积核。 ChebNet采用Chebyshev多项式代替谱…

TIA博途中计算多个数据的算术平均值的具体方法示例

TIA博途中计算多个数据的算术平均值的具体方法示例 我们这里采用官方提供的Floating Average功能块来实现多个数据的算术平均值的计算。 此功能块计算最新输入的100个数值的均值(浮动平均值)。采集的数据队列达到100个之后,队列每入栈一个新数值,将去掉一个队列里最早进来的…

高通平台开发系列讲解(GPS篇)gpsONE 系统架构

文章目录 一、系统架构图二、gpsONE系统组成三、gpsONE交互流程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢高通的定位系统模块,名称叫gpsONE。 一、系统架构图 二、gpsONE系统组成 GPS系统架构可以分为六个部分: APP层Framework Client端(LocationManager API…

网站被挂马植入webshell导致网站瘫痪案例

一、问题现象 下午两点&#xff0c;刚刚睡醒&#xff0c;就接到了客户打来的电话&#xff0c;说他们的网站挂&#xff08;这个用词很不准确&#xff0c;但是感觉到问题的严重性&#xff09;了&#xff0c;询问是怎么发生的&#xff0c;之前做了什么操作&#xff0c;客户的回答…

Bash 脚本实例:获取符号链接的目标位置

我们都熟悉 Linux 中的符号链接&#xff0c;通常称为符号链接或软链接&#xff0c;符号链接是指向任何文件系统中的另一个文件或目录的特定文件。本文将介绍 Linux 中符号链接的基础知识&#xff0c;并创建一个简单的 bash 脚本来获取符号链接的目标位置。符号链接的类型主要有…

【栈和队列】java实现栈和队列以及集合中的栈和队列

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1f3cd;&#x1f3cd;&#x1f3cd;&#xff0c;今天我带领大家去学习栈和队列的相关知识&#xff0c;&#x1f49e;&#x1f49e;&#x1f49e;栈和队列在数据结构中是相对简单的&#xff0c;但是应用还是蛮多的&#xff…

分享142个ASP源码,总有一款适合您

ASP源码 分享142个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 142个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1TxdTrCJpO08rKLCUzIh0hQ?pwdyhka 提取码&#x…

微信小程序+云函数+腾讯云对话机器人API(ChatBot)

文章目录 前言 一、小程序云开发是什么&#xff1f; 二、步骤 1. 在app.js中绑定好云环境id&#xff0c;并且选好当前环境以及选好云文件夹 2. 去到腾讯云API Explorer中选好Region地区和Query这个必填参数&#xff0c;然后进行代码生成 3. 在上面的API Explorer网站点击前往获…

Python局部函数及用法

Python 函数内部可以定义变量&#xff0c;这样就产生了局部变量&#xff0c;有读者可能会问&#xff0c;Python 函数内部能定义函数吗&#xff1f;答案是肯定的。Python 支持在函数内部定义函数&#xff0c;此类函数又称为局部函数。那么&#xff0c;局部函数有哪些特征&#x…

Redis实现好友关注 | 黑马点评

目录 一、关注和取关 二、共同关注 三、关注推送&#xff08;feed流&#xff09; 1、Timeline模式的方案 拉模式 推模式 推拉结合模式 总结 2、推模式实现关注推送 需求 feed流分页问题 feed流的滚动分页 实现推送到粉丝的收件箱 …

(学习笔记)opencv和dlib的基础操作

来源&#xff1a;投稿 作者&#xff1a;LSC 编辑&#xff1a;学姐 本篇文章将讲述作者对opencv和dlib基础操作的学习笔记。 首先来看opencv的11种基础操作 (1)imread 读取图片 (2)resize 图片缩放 (3)cvtColor 灰度化 (4)threshold 阈值化 (5)bitwise_not 图像取反 (6)a…

JavaEE-初识网络

目录一、局域网二、广域网三、网络通信基础3.1 IP地址3.2 端口号3.3 协议四、协议分层五、封装和分用一、局域网 局域网&#xff0c;网络种类&#xff0c;覆盖范围一般是方圆几千米之内&#xff0c;其具备的安装便捷、成本节约、扩展方便等特点使其在各类办公室内运用广泛。局…

有序列表标签与无序列表标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> </head> <body bgcolor"bisque"> <!-- 在ol有序列表标签和ul无序列表标签…

【初识数据库】进入数据库的大门+数据库基本操作

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1f353;&#x1f353;&#x1f353;&#xff0c;这个专栏我将带领大家去探索数据库的汪洋大海&#xff0c;我主要使用的数据库软件是MySQL&#xff0c;数据库软件大同小异&#xff0c;嘿嘿嘿&#xff0c;废话不多说&#x…

分布式事务Seata学习笔记

目录 1.Seata 是什么 2. Seata快速开始 2.1 Seata Server&#xff08;TC&#xff09;环境搭建 db存储模式Nacos(注册&配置中心)部署 3. Seata Client快速开始 4.demo源码:springcloudAlibaba: Alibaba微服务学习demo 1.Seata 是什么 Seata 是一款开源的分布式事务…