Springboot-多数据源

news2024/11/16 1:56:50

文章目录

  • 一、架构
  • 二、实现过程
    • 2.1 第一步:引入依赖pom
    • 2.2 第二步:创建application.yml配置
    • 2.3 第三步:创建架构的文件夹
      • MybatisPlusConfig
      • FirstDataSourceConfig
      • SecondDataSourceConfig

实现功能,在不同的文件夹使用不同的库

一、架构

在这里插入图片描述

二、实现过程

2.1 第一步:引入依赖pom

        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>

        <!-- MySQL Driver -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

        <!-- MyBatis Plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>

添加扫描的xml

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>*.yml</include>
                    <include>**/*.yml</include>
                    <include>**/*.xml</include>
                    <include>**/*.txt</include>
                </includes>
            </resource>
        </resources>

2.2 第二步:创建application.yml配置

在这里插入图片描述

server:
  port: 8082

spring:
  banner:
    location:
      classpath: banner.txt
  datasource:
    first:
      username: root
      password: root
      jdbc-url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/db?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
      driver-class-name: com.mysql.cj.jdbc.Driver
    second:
      username: root
      password: root
      jdbc-url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/db?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
      driver-class-name: com.mysql.cj.jdbc.Driver


mybatis-plus:
  configuration:
    # 配置打印日志common/config/FirstDataSourceConfig.java和SecondDataSourceConfig.java也需要改成StdOutImpl
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    log-impl: org.apache.ibatis.logging.log4j2.Log4j2Impl
    map-underscore-to-camel-case: true
    jdbc-type-for-null: 'null'
    cache-enabled: false

  global-config:
    db-config:
      id-type: auto

2.3 第三步:创建架构的文件夹

MybatisPlusConfig

package com.admin.ssb_wav.common.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class MybatisPlusConfig {

    /***
     * 分页插件
     * @return
     */
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
}

FirstDataSourceConfig

import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.logging.log4j2.Log4j2Impl;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
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 org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * @Title: FirstDataSourceConfig
 * @Author 代码浪人
 * @Date 2024/9/19 17:14
 * @description:
 */
@Configuration
@MapperScan(basePackages = "基础包的.mapper.first", sqlSessionFactoryRef = "firstSqlSessionFactory")
public class FirstDataSourceConfig {

    @Autowired
    private MybatisPlusConfig mybatisPlusConfig;

    @Bean("firstDataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.first")
    public DataSource getFirstDataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 使用Mybati-plus自带的方法时时必须使用MybatisSqlSessionFactoryBean,用SqlSessionFactoryBean会报错
     * Invalid bound statement (not found): com.wyc.cloudblog.mapper.cloudblog.CategoryMapper.selectList
     */
    @Bean("firstSqlSessionFactory")
    @Primary
    public SqlSessionFactory firstSqlSessionFactory(@Qualifier("firstDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        //添加mybatisplus分页插件,不然分页查询返回值中total为0
        bean.setPlugins(mybatisPlusConfig.paginationInterceptor());
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/first/*.xml"));

        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setMapUnderscoreToCamelCase(true);
        // 配置打印sql语句,如果不配置,多数据源下不会打印
        //开发控制台打印
        // configuration.setLogImpl(StdOutImpl.class);
        configuration.setLogImpl(Log4j2Impl.class);
        bean.setConfiguration(configuration);

        return bean.getObject();
    }

    @Bean(name = "firstTransactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager(@Qualifier("firstDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean("firstSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate firstSqlSessionTemplate(@Qualifier("firstSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

SecondDataSourceConfig


import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.logging.log4j2.Log4j2Impl;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * @Title: SecondDataSourceConfig
 * @Author 代码浪人
 * @Date 2024/9/19 17:14
 * @description:
 */
@Configuration
@MapperScan(basePackages = "基础包的.mapper.second", sqlSessionFactoryRef = "secondSqlSessionFactory")
public class SecondDataSourceConfig {

    @Autowired
    private MybatisPlusConfig mybatisPlusConfig;

    @Bean("secondDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.second")
    public DataSource getSecondDataSource(){
        return DataSourceBuilder.create().build();
    }

    /**
     * 使用Mybati-plus自带的方法时时必须使用MybatisSqlSessionFactoryBean,用SqlSessionFactoryBean会报错
     * Invalid bound statement (not found): com.wyc.cloudblog.mapper.cloudblog.CategoryMapper.selectList
     */
    @Bean("secondSqlSessionFactory")
    public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        //添加mybatisplus分页插件,不然分页查询返回值中total为0
        bean.setPlugins(mybatisPlusConfig.paginationInterceptor());
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/second/*.xml"));

        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setMapUnderscoreToCamelCase(true);
        // 配置打印sql语句,如果不配置,多数据源下不会打印
        //开发控制台打印
        // configuration.setLogImpl(StdOutImpl.class);
        configuration.setLogImpl(Log4j2Impl.class);
        bean.setConfiguration(configuration);

        return bean.getObject();
    }

    @Bean(name = "secondTransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier("secondDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean("secondSqlSessionTemplate")
    public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

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

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

相关文章

【软件测试】金九银十,APP面试题经验分享

Web 端测试和 App 端测试有何不同? ① 系统架构方面 Web 项目&#xff0c;b/s架构&#xff0c;基于浏览器的&#xff1b;Web 测试只要更新了服务器端&#xff0c;客户端就会同步会更新&#xff1b; App 项目&#xff0c;c/s架构的&#xff0c;必须要有客户端&#xff1b;App…

基于Ambari搭建大数据分析平台(30分钟速成)全网最全最详细的Ambari搭建大数据分析平台:

全网最全最详细的Ambari搭建大数据分析平台&#xff1a; 方法一适合详细自己独立安装&#xff0c;方法二超级详细具体&#xff0c;是根据方法一搭建成功的&#xff0c;方法三是另外的方法&#xff0c;安装包有不同&#xff0c;实践也能安装成功。 方法一&#xff1a; 1.搭建安…

halcon单目相机标定

1.参考这边文章https://blog.csdn.net/weixin_60275604/article/details/139068423 2.代码 dev_close_window() dev_open_window(0, 0, 512, 512, black, WindowHandle) dev_set_draw(margin)***创建一个标定板参数 xNum,yNum标定板中行列标定点个数 MarkDist标定点中心距离 d…

Vue|插件

在 Vue.js 中&#xff0c;插件是用来扩展 Vue 功能的一种方式&#xff0c;能够帮助开发者扩展和复用功能。通过合理使用插件&#xff0c;可以提高代码的组织性和可维护性 目录 如何使用插件?插件的定义创建及使用插件插件的参数插件的扩展 总结 如何使用插件? 插件的定义 插…

洛汗2保姆级辅助教程攻略:VMOS云手机辅助升级打怪!

在《洛汗2》中&#xff0c;玩家将进入一个充满魔幻色彩的西方世界&#xff0c;体验多种族文明的兴衰与冒险。为了更好地享受这款由普雷威&#xff08;Playwith&#xff09;开发的角色扮演动作手游&#xff0c;使用VMOS云手机将是一个明智的选择。VMOS云手机专为游戏打造了定制版…

Gartner最新指南:如何通过开展红队演习提高网络弹性

由于事件和监管要求不断增加&#xff0c;安全和风险管理领导者努力建立网络弹性并有效管理网络威胁。本研究指导这些领导者制定红队计划以支持弹性及其关键组件。 主要发现 根据 2024 年 Gartner 设计和构建现代安全运营调查&#xff0c;73% 的组织认为红队角色对安全运营目标的…

【资源一号04A卫星(中巴地球资源卫星04A星)】

资源一号04A卫星&#xff08;中巴地球资源卫星04A星&#xff09; 资源一号04A卫星&#xff0c;全称为中巴地球资源卫星04A星&#xff08;CBERS-04A&#xff09;&#xff0c;是中国与巴西两国合作研制的第六颗地球资源卫星。以下是对该卫星的详细介绍&#xff1a; 一、基本信…

解决Nodify框架因自带放大缩小、平移功能导致拖拽添加的控件无法准确在鼠标放下的位置显示控件

ViewModel中写具体关键的几段代码&#xff1a; var editor sender as NodifyEditor; Point p e.GetPosition(editor);//放大缩小比例double scale editor.ViewportZoom;//经过放大缩小、平移后获得坐标点位置p new Point(Math.Round((p.X - editor.ViewportT…

搜维尔科技:OptiTrack采集到的平衡数据,并对人形机器人进行编程,可以确保机器人的动作精度和准确性

OptiTrack具备高精度以及远追踪距离的双层特点&#xff0c;其捕捉范围最远可达91m&#xff0c;是大型场地&#xff08;如体育馆、足球场、虚拟拍摄制作棚等&#xff09;捕捉的最佳选择。 OptiTrack光学动作捕捉系统是目前全球市占率较高的全身动捕产品&#xff0c;可实现精度误…

第十六章 Javamail发送邮件

目录 一、邮件发送原理和流程图 二、Java发送邮件基本步骤 三、QQ邮箱授权码获取 四、示例代码 注&#xff1a;本章内容仅作为了解JavaMail邮件收发的基本原理&#xff0c;不建议作为实际项目使用&#xff0c;项目中建议通过SpringBoot项目加入mail的starter依赖来构建&am…

2.2 信道的极限容量

奈奎斯特定理 香农定理 &#x1f30f;总结

怎么抠图把杂乱的人全部擦除?分享1个简单方法

前言 在图像编辑中&#xff0c;抠图是一项基本而重要的技能。它允许我们从一张图片中提取出想要的部分&#xff0c;或者去除不需要的元素。今天&#xff0c;我将分享一个简单而有效的方法来抠图&#xff0c;特别是如何擦除图片中杂乱的人物。 工具介绍 在众多的抠图工具中&a…

【近源攻击】badusb上线cs

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 0x01 实验前提 攻击设备&#xff1a;badusb cs服务器&#xff1a;公网部署了 cs 服务端 0x02 实验步骤 …

入耳式耳机戴久不舒服?真心劝你试试这五款骨传导耳机~

基于对运动耳机长时间的使用体验和细致研究&#xff0c;我有以下几点务实的建议想与大家交流&#xff1a;在做出购买决定之前&#xff0c;请多加思考&#xff0c;避免盲目追逐市场热点。有时候&#xff0c;那些突然风靡的网红耳机可能只是短暂的流行&#xff1b;同样&#xff0…

新学期月考成绩发布工具-易查分

老师们&#xff0c;新学期的第一次月考即将到来&#xff0c;是不是在想如何高效又安全地发布成绩呢&#xff1f;别担心&#xff0c;我来给你们介绍一个超实用的小工具——易查分小程序&#xff01; 新学期&#xff0c;新挑战&#xff0c;但发布成绩这件事&#xff0c;可以变得…

# Windows环境下VSCode + Jupyter + Conda的AI学习环境配置指南

Windows环境下VSCode Jupyter Conda的AI学习环境配置指南 目录 Windows环境下VSCode Jupyter Conda的AI学习环境配置指南 优点 1. 安装Anaconda 2. 安装Visual Studio Code 3. 在VSCode中配置Python环境 4. 安装和配置Jupyter 5. 创建和管理虚拟环境 6. 安装常用的…

通信工程学习:什么是VNF虚拟网络功能

VNF&#xff1a;虚拟网络功能 VNF&#xff08;Virtual Network Function&#xff09;即虚拟网络功能&#xff0c;是网络功能虚拟化&#xff08;NFV&#xff09;架构中的一个核心概念。VNF允许通过软件化和虚拟化的方式&#xff0c;将传统的网络设备功能&#xff08;如路由器、交…

CREO教程——2 绘制标准图纸

CREO教程——2 绘制标准图纸 说明&#xff1a;继承第一章设置好的配置文件&#xff0c;这一章进行学习分享如何定制自己的图纸图框&#xff0c;参考国家标准距&#xff0c;定制属于设计师或单位的通用图框。 1.设置工作目录 1.1设置工作目录 1.打开软件设置工作目录&#x…

MySQL按照经纬度排序 查询出商家信息

首先自己写公式算法&#xff0c;这个我们懒 就不写了&#xff0c;pass~ ST_Distance_Sphere用法和示例&#xff1a; 我们懒人使用MySQL自带的函数先看查询出的结果示例&#xff1a;示例代码(看代码直接跳这)&#xff1a;注意事项 我们懒人使用MySQL自带的函数 ST_Distance_Sphe…

scrapy spider框架download下来就可以用

一.通过命令行创建scrapy项目 1.scrapy startproject project_Spider 二.通过命令行创建spider 1.scrapy genspider firstspider 2.定义需要抓取的字段,在items.py文件中对目标字段进行定义 # Define here the models for your scraped items # # See documentation in: # …