【SpringBoot 3.x】整合Mybatis-Plus多数据源、Druid

news2024/12/26 21:48:41

本地开发环境说明

开发依赖版本
Spring Boot3.0.6
Mybatis-Plus3.5.3.1
dynamic-datasource-spring-boot-starter3.6.1
JDK20

pom.xml主要依赖

    <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    </dependency>
    <!-- 根据需要修改数据库 -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>
</dependencies>

application.yml主要配置

debug: true
logging:
  level:
    root: debug
    
spring:
  datasource:
    dynamic:
      # druid连接池设置
      druid:
        #     配置初始化大小、最小、最大线程数
        initialSize: 5
        minIdle: 5
        #     CPU核数+1,也可以大些但不要超过20,数据库加锁时连接过多性能下降
        maxActive: 20
        #     最大等待时间,内网:800,外网:1200(三次握手1s)
        maxWait: 60000
        timeBetweenEvictionRunsMillis: 60000
        #     配置一个连接在池中最大空间时间,单位是毫秒
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1
        testWhileIdle: true
        #     设置从连接池获取连接时是否检查连接有效性,true检查,false不检查
        testOnBorrow: true
        #     设置从连接池归还连接时是否检查连接有效性,true检查,false不检查
        testOnReturn: true
        #     可以支持PSCache(提升写入、查询效率)
        poolPreparedStatements: true
        #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        filters: stat,wall,slf4j
        #     保持长连接
        keepAlive: true
        maxPoolPreparedStatementPerConnectionSize: 20
        useGlobalDataSourceStat: true
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

        web-stat-filter:
          # 是否启用StatFilter默认值true
          enabled: true
          # 添加过滤规则
          url-pattern: /*
          # 忽略过滤的格式
          exclusions: /druid/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico

        stat-view-servlet:
          # 是否启用StatViewServlet默认值true
          enabled: true
          # 访问路径为/druid时,跳转到StatViewServlet
          url-pattern: /druid/*
          # 是否能够重置数据
          reset-enable: false
          # 需要账号密码才能访问控制台,默认为root
          login-username: druid
          login-password: druid
          # IP白名单
          allow: 127.0.0.1
          # IP黑名单(共同存在时,deny优先于allow)
          deny:
      #  dynamic主从设置
      primary: first  #设置默认的数据源或者数据源组,默认值即为master
      strict: false  #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候回抛出异常,不启动会使用默认数据源.
      datasource:
        first:
          driver-class-name: org.h2.Driver
          url: jdbc:h2:tcp://localhost/D:/ProgramFiles/h2database/data/test;MODE=MYSQL;
          username:
          password:
          type: com.alibaba.druid.pool.DruidDataSource
        second:
          driver-class-name: org.h2.Driver
          url: jdbc:h2:tcp://localhost/D:/ProgramFiles/h2database/data/test;MODE=MYSQL;
          username:
          password:
          type: com.alibaba.druid.pool.DruidDataSource

mybatis-plus:
  # 所有实体类所在包路径
  type-aliases-package: com.wen3.**.po
  # mapper.xmml文件路径,多个使用逗号分隔
  mapper-locations: classpath*:resources/mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

多数据源整合Druid

SpringBoot启动类修改

package com.wen3.demo.mybatisplus;

import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure;
import com.alibaba.druid.spring.boot3.autoconfigure.properties.DruidStatProperties;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@MapperScan(basePackages = "com.wen3.demo.mybatisplus.dao")
@SpringBootApplication(exclude = {
        DruidDataSourceAutoConfigure.class
})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
public class DemoMybatisplusApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoMybatisplusApplication.class, args);
    }
}

org.springframework.boot.autoconfigure.AutoConfiguration.imports

由于排除了DruidDataSourceAutoConfigure类的自动装载,就需要手工指定装配以下几个类

com.alibaba.druid.spring.boot3.autoconfigure.stat.DruidSpringAopConfiguration
com.alibaba.druid.spring.boot3.autoconfigure.stat.DruidStatViewServletConfiguration
com.alibaba.druid.spring.boot3.autoconfigure.stat.DruidWebStatFilterConfiguration
com.alibaba.druid.spring.boot3.autoconfigure.stat.DruidFilterConfiguration

查看DruidDataSourceAutoConfigure这个类的源码可以看出,需要把@Import带进来的几个类进行自动装配

@Configuration
@ConditionalOnClass({DruidDataSource.class})
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {

}

Druid监控页面

在这里插入图片描述

可以看到多数据源已经配置成功了,并且加入了Druid监控

Junit单元测试

UserMapper.java

package com.wen3.demo.mybatisplus.dao;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wen3.demo.mybatisplus.po.UserPo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.Map;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @since 2023-05-21
 */
public interface UserMapper extends BaseMapper<UserPo> {

    @Select("select i.* from XXL_JOB_INFO i join XXL_JOB_GROUP g on i.job_group=g.id ${ew.customSqlSegment} ")
    Map<String,Object> multiTableQuery(@Param("ew") QueryWrapper<UserPo> query);
}

User2Mapper.java

package com.wen3.demo.mybatisplus.dao;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wen3.demo.mybatisplus.dao.UserMapper;
import com.wen3.demo.mybatisplus.po.UserPo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.Map;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author tangheng
 * @since 2023-05-21
 */
@DS("second")
public interface User2Mapper extends BaseMapper<UserPo> {

    @Select("select i.* from XXL_JOB_INFO i join XXL_JOB_GROUP g on i.job_group=g.id ${ew.customSqlSegment} ")
    Map<String,Object> multiTableQuery(@Param("ew") QueryWrapper<UserPo> query);
}

使用@DS注解指定使用的数据源,也可以放在Servie等其它类上,也可以放在具体类个方法上

User2MapperTest.java

package com.wen3.demo.mybatisplus.dao2;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wen3.demo.mybatisplus.MybatisPlusSpringbootTestBase;
import com.wen3.demo.mybatisplus.dao.User2Mapper;
import com.wen3.demo.mybatisplus.dao.UserMapper;
import com.wen3.demo.mybatisplus.po.UserPo;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Map;

class User2MapperTest extends MybatisPlusSpringbootTestBase {

    @Resource
    private User2Mapper user2Mapper;
    @Resource
    private UserMapper userMapper;

    @Test
    void testMultiTableQuery() {
        QueryWrapper<UserPo> queryWrapper = new QueryWrapper<>();
        Map<String, Object> testResult = userMapper.multiTableQuery(queryWrapper);
        Map<String, Object> testResult2 = user2Mapper.multiTableQuery(queryWrapper);
        assertEquals(testResult.size(), testResult2.size());
    }
}

单元测试运行日志

在这里插入图片描述

默认访问primary数据源

在这里插入图片描述

指定使用second数据源

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

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

相关文章

MIT 6.S081 Lab Two

MIT 6.S081 Lab Two 引言system callsSystem call tracing&#xff08;moderate&#xff09;实验解析实现思路小结 Sysinfo&#xff08;moderate&#xff09;实验解析 可选的挑战 引言 本文为 MIT 6.S081 2020 操作系统 实验一解析。 MIT 6.S081课程前置基础参考: 基于RISC-V…

【C++】图解类和对象(下)

图解类和对象&#xff08;下&#xff09; 文章目录 图解类和对象&#xff08;下&#xff09;一、初始化列表&#xff08;1&#xff09;定义&#xff08;2&#xff09;注意事项&#xff08;3&#xff09;explicit关键字&#xff08;4&#xff09;结论 二、static成员1.定义2.特性…

windows一键安装redis7.0.11

下载 下载地址:https://gitcode.net/zengliguang/windows_redis7.0.11_offline_install.git 使用git进行进行clone下载 在电脑桌面或者其他文件夹下 &#xff0c;鼠标右键点击 选择git clone &#xff0c;下图中url为下载地址&#xff0c;Directory为本地存储路径&#xff…

【瑞萨RA_FSP】常用存储器介绍

文章目录 一、存储器种类二、 RAM存储器1. DRAM1.1 SDRAM1.2 DDR SDRAM 2. SRAM3. DRAM与SRAM的应用场合 三、非易失性存储器1. ROM存储器1.1 MASK ROM1.2 OTPROM1.3 EPROM1.4 EEPROM 2. FLASH存储器 一、存储器种类 存储器是计算机结构的重要组成部分。存储器是用来存储程序代…

chatgpt赋能python:Python安装Scrapy-提升爬虫效率的关键

Python安装Scrapy - 提升爬虫效率的关键 如果你正在寻找一个强大、高效的爬虫框架&#xff0c;那么Scrapy是你的不二选择。但在使用Scrapy之前&#xff0c;你必须先安装它。 本篇文章将向您介绍如何在Python环境中安装Scrapy&#xff0c;让您能够更快、更方便地运行和调试您的…

chatgpt赋能python:Python怎么安装PyCharm

Python怎么安装PyCharm PyCharm是一款专业的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了丰富的功能和工具&#xff0c;能够极大地提高我们的开发效率。但是&#xff0c;在安装PyCharm之前&#xff0c;需要先确保Python已经安装并配置好了。本篇文章将详…

相机标定精度研究

张建贺实验设计 1 外参重复性精度测试&#xff1a; &#xff08;同内参&#xff0c;不同外参特征点,9选择4&#xff0c;组合&#xff09; 1 外参几乎没有什么重复性误差??? 只要4对都正确&#xff0c;则刚性匹配基本正确 解释&#xff1a;激光点云到相机 转换本身的刚性…

Diffusion扩散模型学习2——Stable Diffusion结构解析-以文本生成图像为例

Diffusion扩散模型学习2——Stable Diffusion结构解析 学习前言源码下载地址网络构建一、什么是Stable Diffusion&#xff08;SD&#xff09;二、Stable Diffusion的组成三、生成流程1、文本编码2、采样流程a、生成初始噪声b、对噪声进行N次采样c、单次采样解析I、预测噪声II、…

转换vmware的vmdk格式为qcow2格式

一、系统环境 操作系统&#xff1a;Win11 虚机系统&#xff1a;VMware Workstation 16 Pro 16.2.3 build-19376536 转换工具&#xff1a;qemu 8.0.2 二、下载安装qemu模拟器 查看qemu版本 Download QEMU - QEMUhttps://www.qemu.org/download/ 下载windows版的安装文件&…

MySQL索引事务(二)

1、索引 1.1、索引的分类 1.1.1、按数据结构分类&#xff1a;Btree&#xff0c;Hash索引&#xff0c;Full-text索引。 InnoDBMylSAMMemmoryBtree索引√√√Hash索引Full-text索引√(MySQl-version5.6.4)√ Btree索引是MySQL中被存储引擎采用最多的索引类型。它适用于全键值、…

chatgpt赋能python:Python编程技巧之复制粘贴技巧

Python编程技巧之复制粘贴技巧 Python作为一种富有表达力的编程语言&#xff0c;已经成为越来越多人的选择。但在编写代码时&#xff0c;有时候我们需要将别人的代码复制粘贴到自己的代码中。如何正确地复制粘贴代码&#xff1f;下面让我们来探讨一下。 复制和粘贴 在复制和…

车载以太网 - 物理层

OSI模型与车载以太网对应关系 OSI标准模型: l、物理层 II、数据链路层 lll、网络层 IV、传输层 V、会话层 VI、表示层 VII、应用层 车载以太网的OSI 参考模型如图所示&#xff0c;该模型中没有对5-7层进行严格的区分&#xff1b;比如SOME/IP、DolP、XCP等协议则是将5、6、7层描…

ML算法——逻辑回归随笔【机器学习】

文章目录 3、逻辑回归3.1、理论部分3.2、sklearn 实现3.3、案例 3、逻辑回归 3.1、理论部分 Logic Regression (LR)&#xff0c;逻辑回归的因变量是二分类的&#xff0c;而不是连续的。它的输出是一个概率值&#xff0c;表示输入数据属于某个类别的概率。如果该值为0.8&#x…

Building a Cloud Based Data Warehouse on Google Big Query Using Qlik Compose

Learn how to build a cloud based data warehouse using Qlik Compose on Google Big Query How to Build Data Integration Pipelines with Qlik and Databricks - YouTube Google BigQuery是一个具有成本效益、高度可扩展的无服务器数据仓库&#xff0c;专为业务敏捷性而设…

概率图简介

引言 本文介绍概率图模型的部分基础知识&#xff0c;希望学习完本文之后能更好地理解HMM和CRF模型。 概率论基础 本节简单回顾一下相关的概率论知识&#xff0c;概率论有两条重要的基本规则。 分别为乘法规则(product rule)和加和规则(sum rule)&#xff0c;假设有两个随机…

chatgpt赋能python:Python3.9.7安装指南

Python 3.9.7安装指南 Python是一种高级编程语言&#xff0c;得到了越来越多的使用&#xff0c;并且在机器学习、数据科学和网络开发中变得越来越重要。本篇文章将向大家介绍如何安装Python 3.9.7版本。 下载Python 3.9.7 首先&#xff0c;我们需要下载Python 3.9.7。你可以…

chatgpt赋能python:Python怎么安装Flask

Python怎么安装Flask Python是一种高级编程语言&#xff0c;常用于 Web 开发、人工智能、机器学习等领域。同时&#xff0c;Flask也是一个十分著名的Python Web框架&#xff0c;具有灵活、轻量级、易于扩展等特点。那么&#xff0c;如何在Python环境中安装Flask呢&#xff1f;…

chatgpt赋能python:Python安装PySpark:从入门到精通

Python安装PySpark&#xff1a;从入门到精通 PySpark是使用Python编写的Apache Spark API。它提供了一个Python接口来与Spark的分布式计算引擎进行交互。本文将介绍如何在Python中安装PySpark。 环境准备 在安装PySpark之前&#xff0c;您需要先安装以下依赖项&#xff1a; …

chatgpt赋能python:如何安装Python3.4

如何安装Python 3.4 简介 Python是一种流行的编程语言。它易于学习&#xff0c;具有可读性&#xff0c;且适用于多种用例。Python的版本非常多&#xff0c;但是Python 3.4是最新的稳定版本之一。 在本文中&#xff0c;我们将介绍如何更轻松地安装Python 3.4。 步骤 安装Py…